introduce a model for tracking attached widgets

This commit is contained in:
Kevin Matz 2023-04-09 20:46:28 -04:00
parent 4833b37739
commit 47a71072ce
3 changed files with 141 additions and 1 deletions

View File

@ -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}

View File

@ -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<Column>(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<Column>().keyCount();
}
QVariant WidgetModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
switch (role) {
case Qt::DisplayRole:
{
auto wdgt = static_cast<DmxWidget*>(index.internalPointer());
auto info = wdgt->portInfo();
switch (static_cast<Column>(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();
}
}

View File

@ -0,0 +1,40 @@
#pragma once
#include "dmxwidget.h"
#include <QAbstractItemModel>
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<std::shared_ptr<DmxWidget>> widgets_;
};