Added plugin object to qml context

This commit is contained in:
2025-03-10 12:04:23 +01:00
parent 4c4d85a78d
commit a170490cbb
6 changed files with 99 additions and 40 deletions

View File

@ -1,4 +1,7 @@
#include "rqt_demo_plugin/lineItem.hpp"
#include "rqt_demo_plugin/rqt_demo_plugin.hpp"
#include <qglobal.h>
#include <qqmlerror.h>
#include <qquickitem.h>
#include <qsgflatcolormaterial.h>
#include <qsggeometry.h>
@ -7,7 +10,9 @@
LineItem::LineItem(QQuickItem *parent)
: QQuickItem(parent)
, stupid_("")
, scale_(1)
, stupid_("")
, handler_(nullptr)
{
setFlag(ItemHasContents, true);
}
@ -19,12 +24,21 @@ QSGNode *LineItem::updatePaintNode(QSGNode *old, UpdatePaintNodeData *)
{
QSGGeometryNode *node = nullptr;
QSGGeometry *geometry = nullptr;
mg::DemoPluginMg *plugin = static_cast<mg::DemoPluginMg *>(handler_);
if(!plugin) {
qmlEngine(this)->throwError("Handler plugin was not provided");
return old;
}
const int hello_c = plugin->hello_c;
if(!old) {
node = new QSGGeometryNode;
geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 4);
geometry->setLineWidth(5);
geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), hello_c);
geometry->setLineWidth(3*scale_);
geometry->setDrawingMode(QSGGeometry::DrawLines);
geometry->setVertexDataPattern(QSGGeometry::DynamicPattern);
geometry->setIndexDataPattern(QSGGeometry::DynamicPattern);
node->setGeometry(geometry);
node->setFlag(QSGNode::OwnsGeometry);
auto *material = new QSGFlatColorMaterial;
@ -32,13 +46,26 @@ QSGNode *LineItem::updatePaintNode(QSGNode *old, UpdatePaintNodeData *)
node->setMaterial(material);
node->setFlag(QSGNode::OwnsMaterial);
QSGGeometry::Point2D *verticies = geometry->vertexDataAsPoint2D();
QSizeF s = size();
verticies[0].set(0.1 * s.width(), 0.1 * s.height());
verticies[1].set(0.75 * s.width(), 0.75 * s.height());
verticies[2].set(0.1 * s.width(), 0.9 * s.height());
verticies[3].set(0.9 * s.width(), 0.1 * s.height());
node->markDirty(QSGNode::DirtyGeometry);
} else {
node = static_cast<QSGGeometryNode *>(old);
geometry = node->geometry();
if(hello_c != prev_size) {
geometry->allocate(prev_size);
}
}
if(hello_c != prev_size) {
const QSizeF s = size();
QSGGeometry::Point2D *verticies = geometry->vertexDataAsPoint2D();
for(int i = 0; i<hello_c; i++) {
verticies[i].x = plugin->hello[i].x * s.width();
verticies[i].y = plugin->hello[i].y * s.height();
}
geometry->markVertexDataDirty();
node->markDirty(QSGNode::DirtyGeometry);
prev_size = hello_c;
}
return node;
}

View File

@ -3,6 +3,7 @@
#include "pluginlib/class_list_macros.hpp"
#include <qnamespace.h>
#include <qqml.h>
#include <qsurfaceformat.h>
PLUGINLIB_EXPORT_CLASS(mg::DemoPluginMg, rqt_gui_cpp::Plugin)
@ -14,6 +15,7 @@ mg::DemoPluginMg::DemoPluginMg() : Plugin() {
static bool typesRegistered = 0;
if(!typesRegistered) {
qmlRegisterType<LineItem>("LineItem", 1, 0, "LineItem");
qmlRegisterAnonymousType<DemoPluginMg>("DemoPlugin", 1);
typesRegistered = 1;
}
}