added support imageProviders for colorpicker of qml

This commit is contained in:
Andrei Yankovich 2020-09-30 21:18:03 +03:00
parent 55222dab05
commit 2e1cbba442
11 changed files with 112 additions and 33 deletions

View File

@ -1,6 +1,6 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import ViewSolutionsModule 1.0 import ViewSolutionsModule 1.0

View File

@ -1,6 +1,6 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import ViewSolutionsModule 1.0 import ViewSolutionsModule 1.0

View File

@ -1,6 +1,6 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import ViewSolutionsModule 1.0 import ViewSolutionsModule 1.0

View File

@ -9,11 +9,11 @@
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import QtQuick.Controls.Universal 2.14 import QtQuick.Controls.Universal 2.15
ApplicationWindow { ApplicationWindow {
id: window id: window

View File

@ -1,8 +1,8 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import QtQuick.Controls.Universal 2.14 import QtQuick.Controls.Universal 2.15
Item { Item {
id: root id: root

View File

@ -1,13 +1,14 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import QtQuick.Controls.Universal 2.14 import QtQuick.Controls.Universal 2.15
Item { Item {
id: delegateItem id: delegateItem
property string source: "" property string source: ""
property alias imageSource: image
property var background: Rectangle { property var background: Rectangle {
border.color: "black" border.color: "black"
anchors.fill: parent anchors.fill: parent

View File

@ -1,15 +1,26 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import QtQuick.Controls.Universal 2.14 import QtQuick.Controls.Universal 2.15
import QtGraphicalEffects 1.14 import QtGraphicalEffects 1.14
ViewPortPage { ViewPortPage {
id: root id: root
Connections {
target: imageSource
onStatusChanged: {
if (imageSource.status === Image.Ready) {
bacground.color = colorPicker.pick(source);
}
}
}
background: Rectangle { background: Rectangle {
id: bacground
color: colorPicker.pick(source) color: colorPicker.pick(source)
radius: 16 radius: 16
} }

View File

@ -1,8 +1,8 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.14 import QtQuick.Controls.Material 2.15
import QtQuick.Controls.Universal 2.14 import QtQuick.Controls.Universal 2.15
import QtGraphicalEffects 1.14 import QtGraphicalEffects 1.14

View File

@ -1,4 +1,7 @@
#include "qmlcolorpicker.h" #include "qmlcolorpicker.h"
#include <QQmlApplicationEngine>
#include <QQuickAsyncImageProvider>
namespace ViewSolutions { namespace ViewSolutions {
QMLColorPicker::QMLColorPicker(QObject *parent) : QMLColorPicker::QMLColorPicker(QObject *parent) :
@ -12,6 +15,56 @@ QMLColorPicker *ViewSolutions::QMLColorPicker::instance() {
} }
QColor QMLColorPicker::pick(const QString &img) const { 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<QQuickImageProvider*>(_engine->imageProvider(id));
if (!provider) {
return {};
}
QString url = img.mid(urlBegin + 1);
if (provider->imageType() & QQmlImageProviderBase::ImageResponse) {
auto async = static_cast<QQuickAsyncImageProvider*>(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); return ColorPicker::pick(img);
} }
void QMLColorPicker::setEngine(QQmlApplicationEngine *engine) {
_engine = engine;
}
} }

View File

@ -3,6 +3,8 @@
#include "colorpicker.h" #include "colorpicker.h"
#include <QObject> #include <QObject>
class QQmlApplicationEngine;
namespace ViewSolutions { namespace ViewSolutions {
/** /**
@ -14,18 +16,27 @@ class LOGINVIEW_EXPORT QMLColorPicker : public QObject, private ColorPicker
public: public:
explicit QMLColorPicker(QObject *parent = nullptr); explicit QMLColorPicker(QObject *parent = nullptr);
/** /**
* @brief instance * @brief instance This method return instance object of the QMLColorPicker setvice.
* @return static instance of this ColorPicker * @return static instance of this ColorPicker
*/ */
static QMLColorPicker* instance(); static QMLColorPicker* instance();
/** /**
* @brief pick - this is override function for qml * @brief pick This is override function for qml
* @param img - path to image * @param img This is path to image
* @return General color of image * @return General color of image
*/ */
Q_INVOKABLE QColor pick(const QString &img) const; 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 #endif // QMLCOLORPICKER_H

View File

@ -17,7 +17,10 @@ bool init(QQmlApplicationEngine *engine) {
engine->addImportPath(":/"); engine->addImportPath(":/");
root->setContextProperty("colorPicker", QMLColorPicker::instance()); auto picker = QMLColorPicker::instance();
picker->setEngine(engine);
root->setContextProperty("colorPicker", picker);
return true; return true;
} }