2 #include "aggregator/StreamAlignerStatus.hpp" 3 #include <QStandardItemModel> 5 #include <QStyledItemDelegate> 6 #include <QApplication> 7 #include <QAbstractItemModel> 21 name = QString::fromStdString(status.name);
24 void updateData(
const aggregator::StreamStatus &status,
const base::Time& time)
28 droppedFull= QString(
"%0").arg(status.samples_dropped_buffer_full);
29 droppedLate= QString(
"%0").arg(status.samples_dropped_late_arriving);
33 const size_t avg_size = 30;
38 const size_t intervals[3] = {1,5,30};
40 for(
int i=0; i<3; i++ )
42 float rate = std::numeric_limits<float>::quiet_NaN();
43 const size_t idx = intervals[i];
50 base::Time time_diff =
54 rate = (float)sample_diff / time_diff.toSeconds();
60 .arg( avg_rate[0], 0,
'f', 1 )
61 .arg( avg_rate[1], 0,
'f', 1 )
62 .arg( avg_rate[2], 0,
'f', 1 );
65 QVariant
data(
int col,
int role)
67 if(role == Qt::DisplayRole || col == 1)
99 if(role == Qt::DisplayRole)
104 return QString(
"Name");
107 return QString(
"BufferStatus");
110 return QString(
"Dropped Full");
113 return QString(
"Dropped Late");
116 return QString(
"Dropped Ordering");
119 return QString(
"Samples/s Avg.(1/5/30)");
141 taskName = QString::fromStdString(name);
147 for(std::vector<StreamRepresentation *>::const_iterator it = streams.begin(); it != streams.end(); it++)
153 void updateData(
const aggregator::StreamAlignerStatus& status)
155 if(status.streams.size() != streams.size())
156 streams.resize(status.streams.size(), NULL);
160 for(std::vector<aggregator::StreamStatus>::const_iterator it = status.streams.begin(); it != status.streams.end(); it++)
168 streams[i]->updateData(*it, status.time);
174 QVariant
data(
int col,
int role)
176 if(role == Qt::DisplayRole && col == 0)
189 QVariant
data(
int row,
int col,
int role)
191 if(row >= childCount)
193 throw std::runtime_error(
"Tried to access invalid stream");
195 return streams[row]->data(col, role);
200 std::vector<StreamRepresentation *> streams;
208 virtual int columnCount(
const QModelIndex& parent = QModelIndex())
const;
209 virtual QVariant
data(
const QModelIndex& index,
int role = Qt::DisplayRole)
const;
210 virtual QModelIndex index(
int row,
int column,
const QModelIndex& parent = QModelIndex())
const;
211 virtual QModelIndex parent(
const QModelIndex& child)
const;
212 virtual int rowCount(
const QModelIndex& parent = QModelIndex())
const;
213 virtual QVariant
headerData(
int section, Qt::Orientation orientation,
int role = Qt::DisplayRole)
const;
214 void updateData(
const aggregator::StreamAlignerStatus& status);
216 std::map<std::string, TaskRepresentation *> taskRepMap;
217 std::vector<TaskRepresentation *> taskRep;
223 for(std::vector<TaskRepresentation *>::const_iterator it = taskRep.begin(); it != taskRep.end(); it++)
233 std::string
name = status.name;
235 name =
"<anonymous>";
237 if(!taskRepMap.count(name))
240 taskRepMap[
name] = tp;
241 taskRep.push_back(tp);
242 emit layoutChanged();
245 taskRepMap[
name]->updateData(status);
249 emit dataChanged(createIndex(0,0,0), createIndex(taskRep.size()-1, 5, 0));
266 if(parent.internalId() != 1)
270 return taskRep[parent.row()]->getStreamCount();
273 return taskRep.size();
287 if(index.internalId() == 1)
289 return taskRep[index.row()]->data(index.column(), role);
293 return taskRep[index.parent().row()]->data(index.row(), index.column(), role);
300 if (!hasIndex(row, column, parent))
301 return QModelIndex();
303 if (!parent.isValid())
306 const int taskCount = taskRep.size();
308 return QModelIndex();
309 return createIndex(row, column, 1);
311 if(parent.internalId() != 1)
312 throw std::runtime_error(
"Expected id 1 got something else");
314 if(row < taskRep[parent.row()]->getStreamCount())
315 return createIndex(row, column, (
void *) taskRep[parent.row()] );
318 return QModelIndex();
323 if(!child.isValid()) {
324 return QModelIndex();
328 if(child.internalId() == 1)
329 return QModelIndex();
332 for(std::vector<TaskRepresentation *>::const_iterator it = taskRep.begin(); it != taskRep.end(); it++) {
333 if(*it == child.internalPointer())
334 return createIndex(i, 0, 1);
337 return QModelIndex();
343 void paint(QPainter *painter,
const QStyleOptionViewItem &option,
344 const QModelIndex &
index)
const 346 if (index.column() == 1 && index.data(
BufferSize).toInt()) {
350 QStyleOptionProgressBar progressBarOption;
351 progressBarOption.rect = option.rect;
352 progressBarOption.minimum = 0;
353 progressBarOption.maximum = bSize;
354 progressBarOption.progress = bFill;
355 progressBarOption.text = QString::number(bFill) +
" / " + QString::number(bSize);
356 progressBarOption.textVisible =
true;
358 QApplication::style()->drawControl(QStyle::CE_ProgressBar,
359 &progressBarOption, painter);
361 QStyledItemDelegate::paint(painter, option, index);
371 setItemDelegate(delegate);
378 return QSize(650,250);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
StreamRepresentation(const aggregator::StreamStatus &status)
static QVariant headerData(int col, int role)
StreamAlignerModel(QObject *parent=0)
int getStreamCount() const
virtual QModelIndex parent(const QModelIndex &child) const
void updateData(const aggregator::StreamAlignerStatus &status)
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
void updateData(const aggregator::StreamStatus &status, const base::Time &time)
QVariant bufferStatusFill
void updateData(const aggregator::StreamAlignerStatus &status)
QVariant data(int row, int col, int role)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
QVariant data(int col, int role)
TaskRepresentation(const std::string &name)
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
QVariant data(int col, int role)
std::deque< std::pair< base::Time, aggregator::StreamStatus > > statusHistory
QVariant bufferStatusSize