From 05da5ee15ddb145e3c7259713ddbac185928ded8 Mon Sep 17 00:00:00 2001 From: jussi Date: Thu, 21 Nov 2019 17:23:47 +0200 Subject: [PATCH] qt: add QByteArray conversion for drag and drop --- .../interface/qt/data/ReadableItemModel.h | 13 ++- .../qt/widgets/ReadableGraphDisplay.cpp | 80 +++++++++++++++++-- .../qt/widgets/ReadableGraphDisplay.h | 22 ++++- 3 files changed, 100 insertions(+), 15 deletions(-) diff --git a/src/modules/interface/qt/data/ReadableItemModel.h b/src/modules/interface/qt/data/ReadableItemModel.h index c6444f4..11d29b5 100644 --- a/src/modules/interface/qt/data/ReadableItemModel.h +++ b/src/modules/interface/qt/data/ReadableItemModel.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -11,20 +12,16 @@ public: protected: QStringList mimeTypes() const override {return QStringList(ReadableData::mimeType());} QMimeData *mimeData(const QModelIndexList &indices) const override { + // FIXME: Pretty messy to have this here + qRegisterMetaTypeStreamOperators("ReadableData"); + if (indices.size() < 1) { return nullptr; } - - QVariantList itemDataList; - - for (QModelIndex modelIndex : indices) { - itemDataList.append(itemFromIndex(modelIndex)->data(Qt::UserRole)); - } - QByteArray b_data; QDataStream stream(&b_data, QIODevice::WriteOnly); - stream << itemDataList; + stream << itemFromIndex(indices[0])->data(Qt::UserRole); QMimeData *data = new QMimeData; data->setData(ReadableData::mimeType(), b_data); diff --git a/src/modules/interface/qt/widgets/ReadableGraphDisplay.cpp b/src/modules/interface/qt/widgets/ReadableGraphDisplay.cpp index b13c756..92901d3 100644 --- a/src/modules/interface/qt/widgets/ReadableGraphDisplay.cpp +++ b/src/modules/interface/qt/widgets/ReadableGraphDisplay.cpp @@ -1,16 +1,86 @@ #include "ReadableGraphDisplay.h" -ReadableGraphDisplay::ReadableGraphDisplay(QWidget *parent) : QGraphicsView(new QGraphicsScene, parent) { - m_chart = new QChart; - m_chart->createDefaultAxes(); +#include +#include + +#include +#include + +ReadableGraphDisplay::ReadableGraphDisplay(QWidget *parent) : QChartView(parent) { + // FIXME: drops are only accepted only on a small area on the widget + setAcceptDrops(true); + setRenderHint(QPainter::Antialiasing); - scene()->addItem(m_chart); + m_chart = new QChart; + + setChart(m_chart); + + m_chart->addSeries(&series); + + m_chart->addAxis(&xAxis, Qt::AlignBottom); + m_chart->addAxis(&yAxis, Qt::AlignLeft); + + series.attachAxis(&xAxis); + series.attachAxis(&yAxis); + + yAxis.setRange(0, 70000); + xAxis.setRange(0, 20); + + x = 0; } bool ReadableGraphDisplay::event(QEvent *event) { if (event->type() == QEvent::Leave) { - qDebug() << "leave"; return true; } return QAbstractScrollArea::event(event); } + +void ReadableGraphDisplay::dragEnterEvent(QDragEnterEvent *event) { + qDebug() << event->mimeData()->formats(); + + if (event->mimeData()->hasFormat(ReadableData::mimeType())) { + event->accept(); + } +} + +void ReadableGraphDisplay::dropEvent(QDropEvent *event) { + //QVariantList itemDataList; + QByteArray b_data = event->mimeData()->data(ReadableData::mimeType()); + + qDebug() << b_data; + + // Convert mime data to QVariantList + + QDataStream stream(&b_data, QIODevice::ReadOnly); + + QVariant v; + stream >> v; + + qDebug() << v; + + if (!v.canConvert()) { + qDebug() << "can't convert"; + } + + ReadableData d = qvariant_cast(v); + + qDebug() << d.value().data.uint_value; + + /* if (itemDataList.size() < 1) { + return; + }*/ + + ReadableMasterObservable *mo = new ReadableMasterObservable(&d); + + connect(mo->createObservable(std::chrono::milliseconds(2000)), &ReadableObservable::valueUpdated, [=](tc_readable_result_t res) { + if (!res.valid) { + return; + } + + qDebug() << res.data.uint_value << res.valid; + + x++; + series.append(x, res.data.uint_value); + }); +} diff --git a/src/modules/interface/qt/widgets/ReadableGraphDisplay.h b/src/modules/interface/qt/widgets/ReadableGraphDisplay.h index 17d312e..3bdb89e 100644 --- a/src/modules/interface/qt/widgets/ReadableGraphDisplay.h +++ b/src/modules/interface/qt/widgets/ReadableGraphDisplay.h @@ -1,17 +1,35 @@ #pragma once -#include +#include #include #include +#include +#include #include +// Graph view for updating readables. QVariantLists convertible to ReadableData can be dropped on this widget. + using namespace QtCharts; -class ReadableGraphDisplay : public QGraphicsView { +class ReadableGraphDisplay : public QChartView { public: ReadableGraphDisplay(QWidget *parent = nullptr); protected: bool event(QEvent *event); + + void resizeEvent(QResizeEvent *event) { + fitInView(sceneRect()); + } + void dragEnterEvent(QDragEnterEvent *event) override; + void dropEvent(QDropEvent *event) override; private: + Q_OBJECT + QChart *m_chart; + + QValueAxis xAxis, yAxis; + + int x; + + QLineSeries series; };