From 576a6c87c5aa1a1cb69664a6795714871ac4b508 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 27 Dec 2018 23:31:26 -0500 Subject: [PATCH] Add preliminary version of a new data visualization idea in the sniffer window. --- SavvyCAN.pro | 6 ++- re/sniffer/SnifferDelegate.cpp | 70 ++++++++++++++++++++++++++++++++++ re/sniffer/SnifferDelegate.h | 24 ++++++++++++ re/sniffer/sniffermodel.cpp | 6 ++- re/sniffer/snifferwindow.cpp | 5 ++- ui/snifferwindow.ui | 2 +- 6 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 re/sniffer/SnifferDelegate.cpp create mode 100644 re/sniffer/SnifferDelegate.h diff --git a/SavvyCAN.pro b/SavvyCAN.pro index 84b6308..0ef31a1 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -65,7 +65,8 @@ SOURCES += main.cpp\ jsedit.cpp \ frameplaybackobject.cpp \ helpwindow.cpp \ - blfhandler.cpp + blfhandler.cpp \ + re/sniffer/SnifferDelegate.cpp HEADERS += mainwindow.h \ can_structs.h \ @@ -121,7 +122,8 @@ HEADERS += mainwindow.h \ jsedit.h \ frameplaybackobject.h \ helpwindow.h \ - blfhandler.h + blfhandler.h \ + re/sniffer/SnifferDelegate.h FORMS += ui/candatagrid.ui \ ui/connectionwindow.ui \ diff --git a/re/sniffer/SnifferDelegate.cpp b/re/sniffer/SnifferDelegate.cpp new file mode 100644 index 0000000..77dcd6b --- /dev/null +++ b/re/sniffer/SnifferDelegate.cpp @@ -0,0 +1,70 @@ +#include "SnifferDelegate.h" +#include +#include +#include "utility.h" +#include "re/sniffer/snifferitem.h" + +SnifferDelegate::SnifferDelegate(QWidget *parent) : QItemDelegate(parent) +{ + blackBrush = QBrush(Qt::black); + whiteBrush = QBrush(Qt::white); + //redBrush = QBrush(Qt::red); + //greenBrush = QBrush(Qt::green); + //grayBrush = QBrush(QColor(230,230,230)); + mainFont.setPointSize(10); + mainFontInfo = new QFontInfo(mainFont); +} + +void SnifferDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + //qDebug() << "SnifferDelegate Paint Event"; + + if (index.column() < 2) + { + QItemDelegate::paint(painter, option, index); + return; + } + + if (index.column() > 9) return; + + int x, y; + SnifferItem *item = static_cast(index.internalPointer()); + int val = item->getData(index.column() - 2); + if (val < 0) return; + + QRect viewport = option.rect; + + int xSpan = viewport.right() - viewport.left(); + int ySpan = viewport.bottom() - viewport.top(); + + //qDebug() << "XSpan" << xSpan << " YSpan " << ySpan; + + int xSector = xSpan / 8; + + painter->setPen(QPen(Qt::black)); + painter->setFont(mainFont); + + for (x = 0; x < 8; x++) + { + if (val & (1 << x)) + { + painter->setBrush(blackBrush); + } + else + { + painter->setBrush(whiteBrush); + } + painter->drawRect(viewport.left() + x * xSector, viewport.top(), xSector, xSector); + } + + painter->drawText(QRect(viewport.left(), viewport.top() + xSector, xSpan, mainFontInfo->pixelSize()), Qt::AlignCenter, Utility::formatNumber(val)); +} + +QSize SnifferDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QSize origSize = QItemDelegate::sizeHint(option, index); + origSize.setHeight(origSize.height() * 2.0); + return origSize; +} + + diff --git a/re/sniffer/SnifferDelegate.h b/re/sniffer/SnifferDelegate.h new file mode 100644 index 0000000..e808ac3 --- /dev/null +++ b/re/sniffer/SnifferDelegate.h @@ -0,0 +1,24 @@ +#ifndef SNIFFERDELEGATE_H +#define SNIFFERDELEGATE_H + +#include + +class SnifferDelegate : public QItemDelegate +{ + Q_OBJECT +public: + explicit SnifferDelegate(QWidget *parent = nullptr); + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + +signals: + +public slots: + +private: + QBrush blackBrush, whiteBrush;//, redBrush, greenBrush, grayBrush; + QFont mainFont; + QFontInfo* mainFontInfo; +}; + +#endif diff --git a/re/sniffer/sniffermodel.cpp b/re/sniffer/sniffermodel.cpp index c395782..cffd8bf 100644 --- a/re/sniffer/sniffermodel.cpp +++ b/re/sniffer/sniffermodel.cpp @@ -1,7 +1,7 @@ #include #include "sniffermodel.h" #include "snifferwindow.h" - +#include "SnifferDelegate.h" SnifferModel::SnifferModel(QObject *parent) : QAbstractItemModel(parent), @@ -60,8 +60,10 @@ QVariant SnifferModel::data(const QModelIndex &index, int role) const if(tc::DATA_0<=col && col <=tc::DATA_7) { int data = item->getData(col-tc::DATA_0); - if(data>=0) + if(data >= 0) + { return QString("%1").arg(data, 2, 16, QLatin1Char('0')).toUpper(); + } } break; } diff --git a/re/sniffer/snifferwindow.cpp b/re/sniffer/snifferwindow.cpp index 5e6c9aa..8fb3257 100644 --- a/re/sniffer/snifferwindow.cpp +++ b/re/sniffer/snifferwindow.cpp @@ -4,6 +4,7 @@ #include "ui_snifferwindow.h" #include "helpwindow.h" #include "connections/canconmanager.h" +#include "SnifferDelegate.h" SnifferWindow::SnifferWindow(QWidget *parent) : QDialog(parent), @@ -19,8 +20,10 @@ SnifferWindow::SnifferWindow(QWidget *parent) : ui->treeView->setColumnWidth(tc::ID, 50); ui->treeView->setColumnWidth(tc::LAST, 1); for(int i=tc::DATA_0 ; i<=tc::DATA_7 ; i++) - ui->treeView->setColumnWidth(i, 30); + ui->treeView->setColumnWidth(i, 95); + ui->treeView->setUniformRowHeights(true); ui->treeView->header()->setDefaultAlignment(Qt::AlignCenter); + ui->treeView->setItemDelegate(new SnifferDelegate()); /* activate sorting */ ui->listWidget->setSortingEnabled(true); diff --git a/ui/snifferwindow.ui b/ui/snifferwindow.ui index e705513..ebd01dd 100644 --- a/ui/snifferwindow.ui +++ b/ui/snifferwindow.ui @@ -6,7 +6,7 @@ 0 0 - 710 + 1097 752