From 47a71072ced6d2e5979464b02523934b048b06ed Mon Sep 17 00:00:00 2001 From: Kevin Matz Date: Sun, 9 Apr 2023 20:46:28 -0400 Subject: [PATCH] introduce a model for tracking attached widgets --- platform/qt/dmxwidget/CMakeLists.txt | 4 +- platform/qt/dmxwidget/widgetmodel.cpp | 98 +++++++++++++++++++++++++++ platform/qt/dmxwidget/widgetmodel.h | 40 +++++++++++ 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 platform/qt/dmxwidget/widgetmodel.cpp create mode 100644 platform/qt/dmxwidget/widgetmodel.h diff --git a/platform/qt/dmxwidget/CMakeLists.txt b/platform/qt/dmxwidget/CMakeLists.txt index 6fb2e1c..d15bf09 100644 --- a/platform/qt/dmxwidget/CMakeLists.txt +++ b/platform/qt/dmxwidget/CMakeLists.txt @@ -1,6 +1,6 @@ project(${PROJECT_NAME}-dmxwidget VERSION ${PROJECT_VERSION}) -find_package(Qt6 REQUIRED COMPONENTS SerialPort) +find_package(Qt6 COMPONENTS SerialPort REQUIRED) add_library(${PROJECT_NAME} SHARED) add_library(LCP::Qt::DmxWidget ALIAS ${PROJECT_NAME}) @@ -8,8 +8,10 @@ add_library(LCP::Qt::DmxWidget ALIAS ${PROJECT_NAME}) target_sources(${PROJECT_NAME} PUBLIC dmxwidget.h + widgetmodel.h PRIVATE dmxwidget.cpp + widgetmodel.cpp ) target_link_libraries(${PROJECT_NAME} diff --git a/platform/qt/dmxwidget/widgetmodel.cpp b/platform/qt/dmxwidget/widgetmodel.cpp new file mode 100644 index 0000000..9b8b441 --- /dev/null +++ b/platform/qt/dmxwidget/widgetmodel.cpp @@ -0,0 +1,98 @@ +#include "widgetmodel.h" +#include "qmetaobject.h" + +WidgetModel::WidgetModel(QObject *parent) + : QAbstractItemModel(parent) + , widgets_(DmxWidget::availableWidgets()) +{ +} + +QVariant WidgetModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (static_cast(section)) { + case PortName: + return tr("Port"); + case Manufacturer: + return tr("Manufacturer"); + case Description: + return tr("Description"); + case SerialNumber: + return tr("Serial"); + case FirmwareVersion: + return tr("Firmware"); + case OperatingMode: + return tr("Mode"); + default: + return QVariant(); + } + } + return QVariant(); +} + +QModelIndex WidgetModel::index(int row, int column, const QModelIndex &parent) const +{ + if (parent.isValid() || row >= widgets_.size()) + return QModelIndex(); + + return createIndex(row, column, widgets_.at(row).get()); +} + +QModelIndex WidgetModel::parent(const QModelIndex &index) const +{ + Q_UNUSED(index) + return QModelIndex(); +} + +int WidgetModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return widgets_.size(); +} + +int WidgetModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return QMetaEnum::fromType().keyCount(); +} + +QVariant WidgetModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + switch (role) { + case Qt::DisplayRole: + { + auto wdgt = static_cast(index.internalPointer()); + auto info = wdgt->portInfo(); + switch (static_cast(index.column())) + { + case PortName: + return info.portName(); + case Manufacturer: + return info.manufacturer(); + case Description: + return info.description(); + case SerialNumber: + return wdgt->serialNumber(); + case FirmwareVersion: + return QString::number(wdgt->firmwareVersion() >> 8) + + "." + + QString::number(wdgt->firmwareVersion() & 0xff); + case OperatingMode: + return ""; + default: + return QVariant(); + } + } + case Qt::FontRole: + return QVariant(); + case Qt::EditRole: + return QVariant(); + default: + return QVariant(); + } +} diff --git a/platform/qt/dmxwidget/widgetmodel.h b/platform/qt/dmxwidget/widgetmodel.h new file mode 100644 index 0000000..49fff1e --- /dev/null +++ b/platform/qt/dmxwidget/widgetmodel.h @@ -0,0 +1,40 @@ +#pragma once + +#include "dmxwidget.h" +#include + +class WidgetModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + explicit WidgetModel(QObject *parent = nullptr); + + // Header: + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + // Basic functionality: + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &index) const override; + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + /// @brief The Column enum + enum Column { + PortName, + Manufacturer, + Description, + SerialNumber, + FirmwareVersion, + OperatingMode, + }; + Q_ENUM(Column) + +private: + QList> widgets_; +}; +