From 2e1cbba4422ab3fe704b510d816560ca70857223 Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 30 Sep 2020 21:18:03 +0300 Subject: [PATCH] added support imageProviders for colorpicker of qml --- Examples/src/ImageViewPage.qml | 6 +-- Examples/src/VPGradientPage.qml | 6 +-- Examples/src/ViewPortContainerPage.qml | 6 +-- Examples/src/main.qml | 8 +-- .../src/ViewSolutionsModule/ImageView.qml | 8 +-- .../ViewPortDelegatBase.qml | 9 ++-- .../ViewPortGradientPage.qml | 19 +++++-- .../src/ViewSolutionsModule/ViewPortPage.qml | 8 +-- ViewSolutions/src/qmlcolorpicker.cpp | 53 +++++++++++++++++++ ViewSolutions/src/qmlcolorpicker.h | 17 ++++-- ViewSolutions/src/viewsolutions.cpp | 5 +- 11 files changed, 112 insertions(+), 33 deletions(-) diff --git a/Examples/src/ImageViewPage.qml b/Examples/src/ImageViewPage.qml index 6709d65..ac69a1c 100644 --- a/Examples/src/ImageViewPage.qml +++ b/Examples/src/ImageViewPage.qml @@ -1,6 +1,6 @@ -import QtQuick 2.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 import ViewSolutionsModule 1.0 diff --git a/Examples/src/VPGradientPage.qml b/Examples/src/VPGradientPage.qml index cd5f6cf..3f33ef8 100644 --- a/Examples/src/VPGradientPage.qml +++ b/Examples/src/VPGradientPage.qml @@ -1,6 +1,6 @@ -import QtQuick 2.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 import ViewSolutionsModule 1.0 diff --git a/Examples/src/ViewPortContainerPage.qml b/Examples/src/ViewPortContainerPage.qml index bb9a2f7..0784a9e 100644 --- a/Examples/src/ViewPortContainerPage.qml +++ b/Examples/src/ViewPortContainerPage.qml @@ -1,6 +1,6 @@ -import QtQuick 2.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 import ViewSolutionsModule 1.0 diff --git a/Examples/src/main.qml b/Examples/src/main.qml index ebb4710..9004ab2 100644 --- a/Examples/src/main.qml +++ b/Examples/src/main.qml @@ -9,11 +9,11 @@ ** ****************************************************************************/ -import QtQuick 2.14 +import QtQuick 2.15 import QtQuick.Layouts 1.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 -import QtQuick.Controls.Universal 2.14 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Controls.Universal 2.15 ApplicationWindow { id: window diff --git a/ViewSolutions/src/ViewSolutionsModule/ImageView.qml b/ViewSolutions/src/ViewSolutionsModule/ImageView.qml index 18e713d..7a6448a 100644 --- a/ViewSolutions/src/ViewSolutionsModule/ImageView.qml +++ b/ViewSolutions/src/ViewSolutionsModule/ImageView.qml @@ -1,8 +1,8 @@ -import QtQuick 2.14 +import QtQuick 2.15 import QtQuick.Layouts 1.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 -import QtQuick.Controls.Universal 2.14 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Controls.Universal 2.15 Item { id: root diff --git a/ViewSolutions/src/ViewSolutionsModule/ViewPortDelegatBase.qml b/ViewSolutions/src/ViewSolutionsModule/ViewPortDelegatBase.qml index 98a96b6..5db4c5c 100644 --- a/ViewSolutions/src/ViewSolutionsModule/ViewPortDelegatBase.qml +++ b/ViewSolutions/src/ViewSolutionsModule/ViewPortDelegatBase.qml @@ -1,13 +1,14 @@ -import QtQuick 2.14 +import QtQuick 2.15 import QtQuick.Layouts 1.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 -import QtQuick.Controls.Universal 2.14 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Controls.Universal 2.15 Item { id: delegateItem property string source: "" + property alias imageSource: image property var background: Rectangle { border.color: "black" anchors.fill: parent diff --git a/ViewSolutions/src/ViewSolutionsModule/ViewPortGradientPage.qml b/ViewSolutions/src/ViewSolutionsModule/ViewPortGradientPage.qml index 75ed2c2..75ccfd6 100644 --- a/ViewSolutions/src/ViewSolutionsModule/ViewPortGradientPage.qml +++ b/ViewSolutions/src/ViewSolutionsModule/ViewPortGradientPage.qml @@ -1,15 +1,26 @@ -import QtQuick 2.14 +import QtQuick 2.15 import QtQuick.Layouts 1.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 -import QtQuick.Controls.Universal 2.14 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Controls.Universal 2.15 import QtGraphicalEffects 1.14 ViewPortPage { id: root + Connections { + target: imageSource + + onStatusChanged: { + if (imageSource.status === Image.Ready) { + bacground.color = colorPicker.pick(source); + } + } + } + background: Rectangle { + id: bacground color: colorPicker.pick(source) radius: 16 } diff --git a/ViewSolutions/src/ViewSolutionsModule/ViewPortPage.qml b/ViewSolutions/src/ViewSolutionsModule/ViewPortPage.qml index 78cd945..3e4ca6d 100644 --- a/ViewSolutions/src/ViewSolutionsModule/ViewPortPage.qml +++ b/ViewSolutions/src/ViewSolutionsModule/ViewPortPage.qml @@ -1,8 +1,8 @@ -import QtQuick 2.14 +import QtQuick 2.15 import QtQuick.Layouts 1.14 -import QtQuick.Controls 2.14 -import QtQuick.Controls.Material 2.14 -import QtQuick.Controls.Universal 2.14 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Controls.Universal 2.15 import QtGraphicalEffects 1.14 diff --git a/ViewSolutions/src/qmlcolorpicker.cpp b/ViewSolutions/src/qmlcolorpicker.cpp index 6077bec..928ceae 100644 --- a/ViewSolutions/src/qmlcolorpicker.cpp +++ b/ViewSolutions/src/qmlcolorpicker.cpp @@ -1,4 +1,7 @@ #include "qmlcolorpicker.h" + +#include +#include namespace ViewSolutions { QMLColorPicker::QMLColorPicker(QObject *parent) : @@ -12,6 +15,56 @@ QMLColorPicker *ViewSolutions::QMLColorPicker::instance() { } QColor QMLColorPicker::pick(const QString &img) const { + + if (img.left(6) == "image:") { + int urlBegin = img.indexOf('/', 8); + QString id = img.mid(8, urlBegin - 8); + + if (!_engine) + return {}; + + QQuickImageProvider* provider = dynamic_cast(_engine->imageProvider(id)); + + if (!provider) { + return {}; + } + + QString url = img.mid(urlBegin + 1); + + if (provider->imageType() & QQmlImageProviderBase::ImageResponse) { + auto async = static_cast(provider); + auto textureFacrory = async->requestImageResponse(url, {})->textureFactory(); + + if (!textureFacrory) { + return {}; + } + + QColor responce = ColorPicker::pick(textureFacrory->image()); + + delete textureFacrory; + + return responce; + } + + if (provider->imageType() & QQmlImageProviderBase::Texture) { + return ColorPicker::pick(provider->requestTexture(url, nullptr, {})->image()); + } + + if (provider->imageType() & QQmlImageProviderBase::Pixmap) { + return ColorPicker::pick(provider->requestPixmap(url, nullptr, {}).toImage()); + } + + if (provider->imageType() & QQmlImageProviderBase::Image) { + return ColorPicker::pick(provider->requestImage(url, nullptr, {})); + } + + return {}; + } + return ColorPicker::pick(img); } + +void QMLColorPicker::setEngine(QQmlApplicationEngine *engine) { + _engine = engine; +} } diff --git a/ViewSolutions/src/qmlcolorpicker.h b/ViewSolutions/src/qmlcolorpicker.h index 607eb48..4ca0c9a 100644 --- a/ViewSolutions/src/qmlcolorpicker.h +++ b/ViewSolutions/src/qmlcolorpicker.h @@ -3,6 +3,8 @@ #include "colorpicker.h" #include + +class QQmlApplicationEngine; namespace ViewSolutions { /** @@ -14,18 +16,27 @@ class LOGINVIEW_EXPORT QMLColorPicker : public QObject, private ColorPicker public: explicit QMLColorPicker(QObject *parent = nullptr); /** - * @brief instance + * @brief instance This method return instance object of the QMLColorPicker setvice. * @return static instance of this ColorPicker */ static QMLColorPicker* instance(); /** - * @brief pick - this is override function for qml - * @param img - path to image + * @brief pick This is override function for qml + * @param img This is path to image * @return General color of image */ Q_INVOKABLE QColor pick(const QString &img) const; + /** + * @brief setEngine This method set qml engine for working with image providers. + * @param engine This is new engine. + */ + void setEngine(QQmlApplicationEngine *engine); + +private: + + QQmlApplicationEngine *_engine = nullptr; }; } #endif // QMLCOLORPICKER_H diff --git a/ViewSolutions/src/viewsolutions.cpp b/ViewSolutions/src/viewsolutions.cpp index 011dc51..7cdfca7 100644 --- a/ViewSolutions/src/viewsolutions.cpp +++ b/ViewSolutions/src/viewsolutions.cpp @@ -17,7 +17,10 @@ bool init(QQmlApplicationEngine *engine) { engine->addImportPath(":/"); - root->setContextProperty("colorPicker", QMLColorPicker::instance()); + auto picker = QMLColorPicker::instance(); + picker->setEngine(engine); + + root->setContextProperty("colorPicker", picker); return true; }