From cd7f466bb02bf06aa45982261005971818390dec Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 30 Jun 2011 17:20:40 +0200 Subject: [PATCH] QmlDesigner.model: fixing checking for imports Change-Id: I878f429c94b75c229738dfc26806e29a5673b102 Reviewed-on: http://codereview.qt.nokia.com/955 Reviewed-by: Qt Sanity Bot Reviewed-by: Thomas Hartmann --- .../components/formeditor/dragtool.cpp | 2 +- .../itemlibrary/itemlibrarymodel.cpp | 2 +- .../itemlibrary/itemlibrarywidget.cpp | 1 + .../qmldesigner/designercore/include/model.h | 2 +- .../qmldesigner/designercore/model/model.cpp | 38 +++++++++++++++++-- .../designercore/model/qmlmodelview.cpp | 2 +- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index ec62f391f16..435b86e3d7c 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -291,7 +291,7 @@ void DragTool::dragEnterEvent(QGraphicsSceneDragDropEvent * event) const QString newImportVersion = QString("%1.%2").arg(QString::number(itemLibraryEntry.majorVersion()), QString::number(itemLibraryEntry.minorVersion())); Import newImport = Import::createLibraryImport(newImportUrl, newImportVersion); - if (!view()->model()->hasImport(newImport, true)) { + if (!view()->model()->hasImport(newImport, true, true)) { importToBeAddedList.append(newImport); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 0987c3fb313..c454f45cd70 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -408,7 +408,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) bool valid = model->metaInfo(entry.typeName(), entry.majorVersion(), entry.minorVersion()).isValid(); - if (valid && (entry.requiredImport().isEmpty() || model->hasImport(entryToImport(entry), true) || entry.forceImport())) { + if (valid && (entry.requiredImport().isEmpty() || model->hasImport(entryToImport(entry), true, true) || entry.forceImport())) { QString itemSectionName = entry.category(); ItemLibrarySectionModel *sectionModel; ItemLibraryItemModel *itemModel; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 4b5c64a7833..3fe167f2eeb 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -379,6 +379,7 @@ void ItemLibraryWidget::emitImportChecked() void ItemLibraryWidget::setImportFilter(FilterChangeFlag flag) { + return; static bool block = false; if (!m_d->model) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index e5ce969dbed..b2d51001a43 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -104,7 +104,7 @@ public: // Imports: QList imports() const; void changeImports(const QList &importsToBeAdded, const QList &importsToBeRemoved); - bool hasImport(const Import &import, bool ignoreAlias = true); + bool hasImport(const Import &import, bool ignoreAlias = true, bool allowHigherVersion = false); RewriterView *rewriterView() const; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 18404c3054b..0e01f9c550f 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1742,7 +1742,39 @@ void Model::changeImports(const QList &importsToBeAdded, const QListchangeImports(importsToBeAdded, importsToBeRemoved); } -bool Model::hasImport(const Import &import, bool ignoreAlias) + +static bool compareVersions(const QString &version1, const QString &version2, bool allowHigherVersion) +{ + if (version1 == version2) + return true; + if (!allowHigherVersion) + return false; + QStringList version1List = version1.split('.'); + QStringList version2List = version2.split('.'); + if (version1List.count() == 2 && version2List.count() == 2) { + bool ok; + int major1 = version1List.first().toInt(&ok); + if (!ok) + return false; + int major2 = version2List.first().toInt(&ok); + if (!ok) + return false; + if (major1 >= major2) { + int minor1 = version1List.last().toInt(&ok); + if (!ok) + return false; + int minor2 = version2List.last().toInt(&ok); + if (!ok) + return false; + if (minor1 >= minor2) + return true; + } + } + + return false; +} + +bool Model::hasImport(const Import &import, bool ignoreAlias, bool allowHigherVersion) { if (imports().contains(import)) return true; @@ -1751,10 +1783,10 @@ bool Model::hasImport(const Import &import, bool ignoreAlias) foreach (const Import &existingImport, imports()) { if (existingImport.isFileImport() && import.isFileImport()) - if (existingImport.file() == import.file() && existingImport.version() == import.version()) + if (existingImport.file() == import.file() && compareVersions(existingImport.version(), import.version(), allowHigherVersion)) return true; if (existingImport.isLibraryImport() && import.isLibraryImport()) - if (existingImport.url() == import.url() && existingImport.version() == import.version()) + if (existingImport.url() == import.url() && compareVersions(existingImport.version(), import.version(), allowHigherVersion)) return true; } return false; diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 682a6e2d4ae..028f028677e 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -196,7 +196,7 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE } } - if (!model()->hasImport(newImport, true)) { + if (!model()->hasImport(newImport, true, true)) { model()->changeImports(QList() << newImport, QList()); } }