feat: show fake data network, stream, and particles data

This commit is contained in:
talksik
2026-01-28 08:26:30 -08:00
parent 5b271ab623
commit dfcd366f9d
11 changed files with 750 additions and 74 deletions
+194
View File
@@ -0,0 +1,194 @@
#include "networkstreammodel.h"
NetworkStreamModel::NetworkStreamModel(Data *data, QObject *parent)
: QAbstractItemModel(parent), m_data(data)
{
}
QModelIndex NetworkStreamModel::index(int row, int column, const QModelIndex &parent) const
{
if (!hasIndex(row, column, parent))
{
return QModelIndex();
}
if (!parent.isValid())
{
// Top-level item (Network)
// Encode: networkIndex in lower 32 bits, -1 in upper 32 bits
quintptr id = static_cast<quintptr>(row) | (static_cast<quintptr>(0xFFFFFFFF) << 32);
return createIndex(row, column, id);
}
else
{
// Child item (Stream)
// Decode parent to get network index
quintptr parentId = parent.internalId();
int networkIndex = static_cast<int>(parentId & 0xFFFFFFFF);
// Encode: streamIndex in lower 32 bits, networkIndex in upper 32 bits
quintptr id = static_cast<quintptr>(row) | (static_cast<quintptr>(networkIndex) << 32);
return createIndex(row, column, id);
}
}
QModelIndex NetworkStreamModel::parent(const QModelIndex &child) const
{
if (!child.isValid())
{
return QModelIndex();
}
quintptr id = child.internalId();
int networkIndex = static_cast<int>((id >> 32) & 0xFFFFFFFF);
// If networkIndex is 0xFFFFFFFF, this is a network item (no parent)
if (networkIndex == 0xFFFFFFFF)
{
return QModelIndex();
}
// This is a stream item, return its parent network
quintptr parentId = static_cast<quintptr>(networkIndex) | (static_cast<quintptr>(0xFFFFFFFF) << 32);
return createIndex(networkIndex, 0, parentId);
}
int NetworkStreamModel::rowCount(const QModelIndex &parent) const
{
if (!parent.isValid())
{
// Root level - return number of networks
return m_data->networkCount();
}
quintptr id = parent.internalId();
int networkIndex = static_cast<int>((id >> 32) & 0xFFFFFFFF);
// If this is a network item, return number of streams
if (networkIndex == 0xFFFFFFFF)
{
int actualNetworkIndex = static_cast<int>(id & 0xFFFFFFFF);
if (actualNetworkIndex >= 0 && actualNetworkIndex < m_data->networks().size())
{
const QString &networkId = m_data->networks().at(actualNetworkIndex).id;
return m_data->streamCount(networkId);
}
}
// Stream items have no children
return 0;
}
int NetworkStreamModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 2; // Column 0: name, Column 1: unseen count
}
QVariant NetworkStreamModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
{
return QVariant();
}
quintptr id = index.internalId();
int networkIndex = static_cast<int>((id >> 32) & 0xFFFFFFFF);
if (networkIndex == 0xFFFFFFFF)
{
// This is a network item
if (role == Qt::DisplayRole && index.column() == 0)
{
int actualNetworkIndex = static_cast<int>(id & 0xFFFFFFFF);
if (actualNetworkIndex >= 0 && actualNetworkIndex < m_data->networks().size())
{
return m_data->networks().at(actualNetworkIndex).name;
}
}
// Networks don't show unseen count in column 1
return QVariant();
}
else
{
// This is a stream item
int streamIndex = static_cast<int>(id & 0xFFFFFFFF);
if (networkIndex >= 0 && networkIndex < m_data->networks().size())
{
const QString &networkId = m_data->networks().at(networkIndex).id;
const QList<Stream> &streams = m_data->streamsForNetwork(networkId);
if (streamIndex >= 0 && streamIndex < streams.size())
{
const Stream &stream = streams.at(streamIndex);
if (role == Qt::DisplayRole)
{
if (index.column() == 0)
{
// Column 0: stream name
return stream.name;
}
else if (index.column() == 1)
{
// Column 1: unseen count (only show if > 0)
if (stream.unseenCount > 0)
{
return stream.unseenCount;
}
}
}
else if (role == Qt::TextAlignmentRole && index.column() == 1)
{
// Right-align the unseen count
return static_cast<int>(Qt::AlignRight | Qt::AlignVCenter);
}
}
}
}
return QVariant();
}
QString NetworkStreamModel::streamIdFromIndex(const QModelIndex &index) const
{
if (!index.isValid())
{
return QString();
}
quintptr id = index.internalId();
int networkIndex = static_cast<int>((id >> 32) & 0xFFFFFFFF);
// Check if this is a stream item (not a network)
if (networkIndex != 0xFFFFFFFF)
{
int streamIndex = static_cast<int>(id & 0xFFFFFFFF);
if (networkIndex >= 0 && networkIndex < m_data->networks().size())
{
const QString &networkId = m_data->networks().at(networkIndex).id;
const QList<Stream> &streams = m_data->streamsForNetwork(networkId);
if (streamIndex >= 0 && streamIndex < streams.size())
{
return streams.at(streamIndex).id;
}
}
}
return QString();
}
bool NetworkStreamModel::isStreamItem(const QModelIndex &index) const
{
if (!index.isValid())
{
return false;
}
quintptr id = index.internalId();
int networkIndex = static_cast<int>((id >> 32) & 0xFFFFFFFF);
// If networkIndex is not 0xFFFFFFFF, this is a stream item
return networkIndex != 0xFFFFFFFF;
}