add image render
This commit is contained in:
parent
8ae5af13e9
commit
0a29cc2876
@ -5,6 +5,7 @@
|
|||||||
#include "plugin/DoricShaderPlugin.h"
|
#include "plugin/DoricShaderPlugin.h"
|
||||||
|
|
||||||
#include "shader/DoricHLayoutNode.h"
|
#include "shader/DoricHLayoutNode.h"
|
||||||
|
#include "shader/DoricImageNode.h"
|
||||||
#include "shader/DoricRootNode.h"
|
#include "shader/DoricRootNode.h"
|
||||||
#include "shader/DoricScrollerNode.h"
|
#include "shader/DoricScrollerNode.h"
|
||||||
#include "shader/DoricStackNode.h"
|
#include "shader/DoricStackNode.h"
|
||||||
@ -22,6 +23,7 @@ DoricRegistry::DoricRegistry() {
|
|||||||
registerViewNode<DoricHLayoutNode>("HLayout");
|
registerViewNode<DoricHLayoutNode>("HLayout");
|
||||||
registerViewNode<DoricTextNode>("Text");
|
registerViewNode<DoricTextNode>("Text");
|
||||||
registerViewNode<DoricScrollerNode>("Scroller");
|
registerViewNode<DoricScrollerNode>("Scroller");
|
||||||
|
registerViewNode<DoricImageNode>("Image");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DoricRegistry::acquirePluginInfo(QString name) {
|
bool DoricRegistry::acquirePluginInfo(QString name) {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "DoricDemoBridge.h"
|
#include "DoricDemoBridge.h"
|
||||||
#include "DoricPanel.h"
|
#include "DoricPanel.h"
|
||||||
#include "utils/DoricDialogBridge.h"
|
#include "utils/DoricDialogBridge.h"
|
||||||
|
#include "utils/DoricImageBridge.h"
|
||||||
#include "utils/DoricMouseAreaBridge.h"
|
#include "utils/DoricMouseAreaBridge.h"
|
||||||
#include "utils/DoricUtils.h"
|
#include "utils/DoricUtils.h"
|
||||||
|
|
||||||
@ -44,8 +45,8 @@ void DoricDemoBridge::navigate(QVariant route) {
|
|||||||
{
|
{
|
||||||
const QUrl url(QStringLiteral("qrc:/doric/qml/view.qml"));
|
const QUrl url(QStringLiteral("qrc:/doric/qml/view.qml"));
|
||||||
view->setSource(url);
|
view->setSource(url);
|
||||||
view->setWidth(405);
|
view->setWidth(600);
|
||||||
view->setHeight(720);
|
view->setHeight(800);
|
||||||
Qt::WindowFlags flag = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint |
|
Qt::WindowFlags flag = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint |
|
||||||
Qt::WindowTitleHint | Qt::WindowCloseButtonHint |
|
Qt::WindowTitleHint | Qt::WindowCloseButtonHint |
|
||||||
Qt::CustomizeWindowHint | Qt::WindowSystemMenuHint;
|
Qt::CustomizeWindowHint | Qt::WindowSystemMenuHint;
|
||||||
@ -58,8 +59,8 @@ void DoricDemoBridge::navigate(QVariant route) {
|
|||||||
component.loadUrl(url);
|
component.loadUrl(url);
|
||||||
QQuickItem *quickItem = qobject_cast<QQuickItem *>(component.create());
|
QQuickItem *quickItem = qobject_cast<QQuickItem *>(component.create());
|
||||||
DoricPanel *panel = new DoricPanel(view->engine(), quickItem);
|
DoricPanel *panel = new DoricPanel(view->engine(), quickItem);
|
||||||
quickItem->setWidth(405);
|
quickItem->setWidth(600);
|
||||||
quickItem->setHeight(720);
|
quickItem->setHeight(800);
|
||||||
quickItem->setParentItem(view->rootObject());
|
quickItem->setParentItem(view->rootObject());
|
||||||
|
|
||||||
panel->config(script, name, NULL);
|
panel->config(script, name, NULL);
|
||||||
@ -78,4 +79,6 @@ void DoricDemoBridge::navigate(QVariant route) {
|
|||||||
context->setContextProperty("mouseAreaBridge", mouseAreaBridge);
|
context->setContextProperty("mouseAreaBridge", mouseAreaBridge);
|
||||||
DoricDialogBridge *dialogBridge = new DoricDialogBridge();
|
DoricDialogBridge *dialogBridge = new DoricDialogBridge();
|
||||||
context->setContextProperty("dialogBridge", dialogBridge);
|
context->setContextProperty("dialogBridge", dialogBridge);
|
||||||
|
DoricImageBridge *imageBridge = new DoricImageBridge();
|
||||||
|
context->setContextProperty("imageBridge", imageBridge);
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ SOURCES += \
|
|||||||
plugin/DoricShaderPlugin.cpp \
|
plugin/DoricShaderPlugin.cpp \
|
||||||
shader/DoricGroupNode.cpp \
|
shader/DoricGroupNode.cpp \
|
||||||
shader/DoricHLayoutNode.cpp \
|
shader/DoricHLayoutNode.cpp \
|
||||||
|
shader/DoricImageNode.cpp \
|
||||||
shader/DoricRootNode.cpp \
|
shader/DoricRootNode.cpp \
|
||||||
shader/DoricScrollerNode.cpp \
|
shader/DoricScrollerNode.cpp \
|
||||||
shader/DoricStackNode.cpp \
|
shader/DoricStackNode.cpp \
|
||||||
@ -49,6 +50,7 @@ SOURCES += \
|
|||||||
utils/DoricConstant.cpp \
|
utils/DoricConstant.cpp \
|
||||||
utils/DoricContextHolder.cpp \
|
utils/DoricContextHolder.cpp \
|
||||||
utils/DoricDialogBridge.cpp \
|
utils/DoricDialogBridge.cpp \
|
||||||
|
utils/DoricImageBridge.cpp \
|
||||||
utils/DoricLayouts.cpp \
|
utils/DoricLayouts.cpp \
|
||||||
utils/DoricMouseAreaBridge.cpp \
|
utils/DoricMouseAreaBridge.cpp \
|
||||||
widget/flex/FlexLayout.cpp \
|
widget/flex/FlexLayout.cpp \
|
||||||
@ -110,6 +112,7 @@ HEADERS += \
|
|||||||
plugin/DoricShaderPlugin.h \
|
plugin/DoricShaderPlugin.h \
|
||||||
shader/DoricGroupNode.h \
|
shader/DoricGroupNode.h \
|
||||||
shader/DoricHLayoutNode.h \
|
shader/DoricHLayoutNode.h \
|
||||||
|
shader/DoricImageNode.h \
|
||||||
shader/DoricRootNode.h \
|
shader/DoricRootNode.h \
|
||||||
shader/DoricScrollerNode.h \
|
shader/DoricScrollerNode.h \
|
||||||
shader/DoricStackNode.h \
|
shader/DoricStackNode.h \
|
||||||
@ -122,6 +125,7 @@ HEADERS += \
|
|||||||
utils/DoricContextHolder.h \
|
utils/DoricContextHolder.h \
|
||||||
utils/DoricCountDownLatch.h \
|
utils/DoricCountDownLatch.h \
|
||||||
utils/DoricDialogBridge.h \
|
utils/DoricDialogBridge.h \
|
||||||
|
utils/DoricImageBridge.h \
|
||||||
utils/DoricLayouts.h \
|
utils/DoricLayouts.h \
|
||||||
utils/DoricMouseAreaBridge.h \
|
utils/DoricMouseAreaBridge.h \
|
||||||
utils/DoricObjectFactory.h \
|
utils/DoricObjectFactory.h \
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
<file alias="hlayout.qml">resources/hlayout.qml</file>
|
<file alias="hlayout.qml">resources/hlayout.qml</file>
|
||||||
<file alias="text.qml">resources/text.qml</file>
|
<file alias="text.qml">resources/text.qml</file>
|
||||||
<file alias="scroller.qml">resources/scroller.qml</file>
|
<file alias="scroller.qml">resources/scroller.qml</file>
|
||||||
|
<file alias="image.qml">resources/image.qml</file>
|
||||||
|
|
||||||
<file alias="toast.qml">resources/toast.qml</file>
|
<file alias="toast.qml">resources/toast.qml</file>
|
||||||
<file alias="alert.qml">resources/alert.qml</file>
|
<file alias="alert.qml">resources/alert.qml</file>
|
||||||
|
86
doric-Qt/doric/resources/image.qml
Normal file
86
doric-Qt/doric/resources/image.qml
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
import QtQuick 2.12
|
||||||
|
import QtQuick.Controls 2.5
|
||||||
|
|
||||||
|
import "util.mjs" as Util
|
||||||
|
|
||||||
|
AnimatedImage {
|
||||||
|
property var wrapper
|
||||||
|
|
||||||
|
property var uuid: Util.uuidv4()
|
||||||
|
|
||||||
|
property var tag: "Image"
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: bg
|
||||||
|
color: "transparent"
|
||||||
|
}
|
||||||
|
|
||||||
|
onSourceChanged: {
|
||||||
|
console.log(tag, uuid + " onSourceChanged: " + this.source)
|
||||||
|
}
|
||||||
|
|
||||||
|
onStatusChanged: {
|
||||||
|
if (this.status === Image.Null) {
|
||||||
|
console.log(tag, uuid + " onStatusChanged: Image.Null")
|
||||||
|
imageBridge.onNull(wrapper);
|
||||||
|
} else if (this.status === Image.Ready) {
|
||||||
|
console.log(tag, uuid + " onStatusChanged: Image.Ready")
|
||||||
|
|
||||||
|
if (this.width !== 0 && this.height !== 0 && this.status === Image.Ready) {
|
||||||
|
imageBridge.onReady(wrapper);
|
||||||
|
}
|
||||||
|
} else if (this.status === Image.Loading) {
|
||||||
|
console.log(tag, uuid + " onStatusChanged: Image.Loading")
|
||||||
|
imageBridge.onLoading(wrapper);
|
||||||
|
} else if (this.status === Image.Error) {
|
||||||
|
console.log(tag, uuid + " onStatusChanged: Image.Error")
|
||||||
|
imageBridge.onError(wrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onProgressChanged: {
|
||||||
|
console.log(tag, uuid + " onProgressChanged: " + this.progress)
|
||||||
|
}
|
||||||
|
|
||||||
|
onWidthChanged: {
|
||||||
|
console.log(tag, uuid + " onWidthChanged: " + this.width)
|
||||||
|
bg.width = this.width
|
||||||
|
|
||||||
|
if (this.width !== 0 && this.height !== 0 && this.status === Image.Ready) {
|
||||||
|
imageBridge.onReady(wrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onHeightChanged: {
|
||||||
|
console.log(tag, uuid + " onHeightChanged: " + this.height)
|
||||||
|
bg.height = this.height
|
||||||
|
|
||||||
|
if (this.width !== 0 && this.height !== 0 && this.status === Image.Ready) {
|
||||||
|
imageBridge.onReady(wrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
property var backgroundColor
|
||||||
|
|
||||||
|
onBackgroundColorChanged: {
|
||||||
|
bg.color = backgroundColor
|
||||||
|
}
|
||||||
|
|
||||||
|
property var borderWidth: 0
|
||||||
|
onBorderWidthChanged: {
|
||||||
|
bg.border.width = borderWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
property var borderColor: ""
|
||||||
|
onBorderColorChanged: {
|
||||||
|
bg.border.color = borderColor
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
console.log(tag, uuid + " wrapper: " + wrapper)
|
||||||
|
mouseAreaBridge.onClick(wrapper)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,8 +3,8 @@ import QtQuick.Controls 2.5
|
|||||||
|
|
||||||
ApplicationWindow {
|
ApplicationWindow {
|
||||||
visible: true
|
visible: true
|
||||||
width: 405
|
width: 600
|
||||||
height: 720
|
height: 800
|
||||||
title: qsTr("Scroll")
|
title: qsTr("Scroll")
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
|
@ -4,7 +4,7 @@ import QtQuick.Layouts 1.15
|
|||||||
|
|
||||||
ApplicationWindow {
|
ApplicationWindow {
|
||||||
visible: true
|
visible: true
|
||||||
width: 450
|
width: 600
|
||||||
height: 800
|
height: 800
|
||||||
title: qsTr("Scroll")
|
title: qsTr("Scroll")
|
||||||
|
|
||||||
|
75
doric-Qt/doric/shader/DoricImageNode.cpp
Normal file
75
doric-Qt/doric/shader/DoricImageNode.cpp
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#include "DoricImageNode.h"
|
||||||
|
#include "DoricSuperNode.h"
|
||||||
|
|
||||||
|
#include "../utils/DoricUtils.h"
|
||||||
|
|
||||||
|
#include <QQuickItem>
|
||||||
|
|
||||||
|
QQuickItem *DoricImageNode::build() {
|
||||||
|
QQmlComponent component(getContext()->getQmlEngine());
|
||||||
|
|
||||||
|
const QUrl url(QStringLiteral("qrc:/doric/qml/image.qml"));
|
||||||
|
component.loadUrl(url);
|
||||||
|
|
||||||
|
if (component.isError()) {
|
||||||
|
qCritical() << component.errorString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QQuickItem *item = qobject_cast<QQuickItem *>(component.create());
|
||||||
|
this->createLayouts(item);
|
||||||
|
|
||||||
|
item->setProperty("wrapper", QString::number((qint64)this));
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoricImageNode::blend(QJsonValue jsValue) {
|
||||||
|
if (jsValue.toObject().contains("scaleType"))
|
||||||
|
this->contentMode = jsValue["scaleType"].toInt();
|
||||||
|
if (jsValue.toObject().contains("placeHolderColor"))
|
||||||
|
this->placeHolderColor = jsValue["placeHolderColor"].toInt();
|
||||||
|
if (jsValue.toObject().contains("errorColor"))
|
||||||
|
this->errorColor = jsValue["errorColor"].toInt();
|
||||||
|
if (jsValue.toObject().contains("loadCallback"))
|
||||||
|
this->loadCallbackId = jsValue["loadCallback"].toString();
|
||||||
|
|
||||||
|
DoricViewNode::blend(jsValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoricImageNode::blend(QQuickItem *view, QString name, QJsonValue prop) {
|
||||||
|
QQuickItem *container = view;
|
||||||
|
if (name == "imageUrl") {
|
||||||
|
container->setProperty("fillMode", this->contentMode);
|
||||||
|
container->setProperty("source", prop.toString());
|
||||||
|
} else if (name == "imageBase64") {
|
||||||
|
container->setProperty("fillMode", this->contentMode);
|
||||||
|
container->setProperty("source", prop.toString());
|
||||||
|
} else {
|
||||||
|
DoricViewNode::blend(view, name, prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoricImageNode::onReady() {
|
||||||
|
if (!this->loadCallbackId.isEmpty()) {
|
||||||
|
QVariantList args;
|
||||||
|
|
||||||
|
QMap<QString, QVariant> map;
|
||||||
|
map.insert("width", 0);
|
||||||
|
map.insert("height", 0);
|
||||||
|
|
||||||
|
args.append(QVariant::fromValue(map));
|
||||||
|
this->callJSResponse(this->loadCallbackId, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
DoricSuperNode *node = this->mSuperNode;
|
||||||
|
while (node->mSuperNode != nullptr) {
|
||||||
|
node = node->mSuperNode;
|
||||||
|
}
|
||||||
|
node->requestLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoricImageNode::onError() {
|
||||||
|
if (!this->loadCallbackId.isEmpty()) {
|
||||||
|
QVariantList args;
|
||||||
|
this->callJSResponse(this->loadCallbackId, args);
|
||||||
|
}
|
||||||
|
}
|
30
doric-Qt/doric/shader/DoricImageNode.h
Normal file
30
doric-Qt/doric/shader/DoricImageNode.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef DORICIMAGENODE_H
|
||||||
|
#define DORICIMAGENODE_H
|
||||||
|
|
||||||
|
#include "DoricViewNode.h"
|
||||||
|
|
||||||
|
class DoricImageNode : public DoricViewNode {
|
||||||
|
public:
|
||||||
|
using DoricViewNode::DoricViewNode;
|
||||||
|
|
||||||
|
QQuickItem *build() override;
|
||||||
|
|
||||||
|
virtual void blend(QJsonValue jsValue) override;
|
||||||
|
|
||||||
|
virtual void blend(QQuickItem *view, QString name, QJsonValue prop) override;
|
||||||
|
|
||||||
|
void onReady();
|
||||||
|
|
||||||
|
void onError();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString loadCallbackId = "";
|
||||||
|
|
||||||
|
int contentMode = 0;
|
||||||
|
|
||||||
|
int placeHolderColor = -1;
|
||||||
|
|
||||||
|
int errorColor = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DORICIMAGENODE_H
|
@ -17,8 +17,6 @@ protected:
|
|||||||
|
|
||||||
DoricLayouts *mLayouts = nullptr;
|
DoricLayouts *mLayouts = nullptr;
|
||||||
|
|
||||||
DoricSuperNode *mSuperNode = nullptr;
|
|
||||||
|
|
||||||
virtual QQuickItem *build() = 0;
|
virtual QQuickItem *build() = 0;
|
||||||
|
|
||||||
void createLayouts(QQuickItem *view);
|
void createLayouts(QQuickItem *view);
|
||||||
@ -37,6 +35,8 @@ private:
|
|||||||
public:
|
public:
|
||||||
QString mType;
|
QString mType;
|
||||||
|
|
||||||
|
DoricSuperNode *mSuperNode = nullptr;
|
||||||
|
|
||||||
using DoricContextHolder::DoricContextHolder;
|
using DoricContextHolder::DoricContextHolder;
|
||||||
|
|
||||||
void init(DoricSuperNode *superNode);
|
void init(DoricSuperNode *superNode);
|
||||||
|
20
doric-Qt/doric/utils/DoricImageBridge.cpp
Normal file
20
doric-Qt/doric/utils/DoricImageBridge.cpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include "DoricImageBridge.h"
|
||||||
|
#include "shader/DoricImageNode.h"
|
||||||
|
|
||||||
|
DoricImageBridge::DoricImageBridge(QObject *parent) : QObject(parent) {}
|
||||||
|
|
||||||
|
void DoricImageBridge::onNull(QString pointer) {}
|
||||||
|
|
||||||
|
void DoricImageBridge::onReady(QString pointer) {
|
||||||
|
QObject *object = (QObject *)(pointer.toULongLong());
|
||||||
|
DoricImageNode *imageNode = dynamic_cast<DoricImageNode *>(object);
|
||||||
|
imageNode->onReady();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoricImageBridge::onLoading(QString pointer) {}
|
||||||
|
|
||||||
|
void DoricImageBridge::onError(QString pointer) {
|
||||||
|
QObject *object = (QObject *)(pointer.toULongLong());
|
||||||
|
DoricImageNode *imageNode = dynamic_cast<DoricImageNode *>(object);
|
||||||
|
imageNode->onError();
|
||||||
|
}
|
24
doric-Qt/doric/utils/DoricImageBridge.h
Normal file
24
doric-Qt/doric/utils/DoricImageBridge.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef DORICIMAGEBRIDGE_H
|
||||||
|
#define DORICIMAGEBRIDGE_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class DoricImageBridge : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit DoricImageBridge(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
Q_INVOKABLE
|
||||||
|
void onNull(QString pointer);
|
||||||
|
|
||||||
|
Q_INVOKABLE
|
||||||
|
void onReady(QString pointer);
|
||||||
|
|
||||||
|
Q_INVOKABLE
|
||||||
|
void onLoading(QString pointer);
|
||||||
|
|
||||||
|
Q_INVOKABLE
|
||||||
|
void onError(QString pointer);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DORICIMAGEBRIDGE_H
|
Reference in New Issue
Block a user