Qt: Fix the packet diagram start offset arithmetic.

572c1ae5a3 introduced a bug that allowed for negative diagram item start
values. Fixup our arithmetic so that that doesn't happen.
This commit is contained in:
Gerald Combs 2020-09-26 12:19:43 -07:00
parent 8b9ec1b5a5
commit d1f29ee338
1 changed files with 8 additions and 14 deletions

View File

@ -603,24 +603,24 @@ void PacketDiagram::addDiagram(proto_node *tl_node)
// Get rid of overlaps. // Get rid of overlaps.
if (prev_span.start_bit + prev_span.length > start_bit) { if (prev_span.start_bit + prev_span.length > start_bit) {
#ifdef DEBUG_PACKET_DIAGRAM #ifdef DEBUG_PACKET_DIAGRAM
qDebug() << "Resized prev" << prev_item.item->finfo->hfinfo->abbrev << prev_item.start_bit << prev_item.length << "->" << start_bit - prev_item.start_bit; qDebug() << "Resized prev" << prev_span.finfo->hfinfo->abbrev << prev_span.start_bit << prev_span.length << "->" << start_bit - prev_span.start_bit;
#endif #endif
prev_span.length = start_bit - prev_span.start_bit; prev_span.length = start_bit - prev_span.start_bit;
} }
if (prev_span.length < 1) { if (prev_span.length < 1) {
#ifdef DEBUG_PACKET_DIAGRAM #ifdef DEBUG_PACKET_DIAGRAM
qDebug() << "Removed prev" << prev_item.item->finfo->hfinfo->abbrev << prev_item.start_bit << prev_item.length; qDebug() << "Removed prev" << prev_span.finfo->hfinfo->abbrev << prev_span.start_bit << prev_span.length;
diag_items.removeLast(); item_spans.removeLast();
if (diag_items.size() < 1) { if (item_spans.size() < 1) {
continue; continue;
} }
prev_item = diag_items.last(); prev_span = item_spans.last();
#endif #endif
} }
// Fill in gaps. // Fill in gaps.
if (prev_span.start_bit + prev_span.length < start_bit) { if (prev_span.start_bit + prev_span.length < start_bit) {
#ifdef DEBUG_PACKET_DIAGRAM #ifdef DEBUG_PACKET_DIAGRAM
qDebug() << "Adding gap" << prev_item.item->finfo->hfinfo->abbrev << prev_item.start_bit << prev_item.length << start_bit; qDebug() << "Adding gap" << prev_span.finfo->hfinfo->abbrev << prev_span.start_bit << prev_span.length << start_bit;
#endif #endif
int gap_start = prev_span.start_bit + prev_span.length; int gap_start = prev_span.start_bit + prev_span.length;
DiagramItemSpan gap_span = { nullptr, gap_start, start_bit - gap_start }; DiagramItemSpan gap_span = { nullptr, gap_start, start_bit - gap_start };
@ -633,21 +633,15 @@ void PacketDiagram::addDiagram(proto_node *tl_node)
} }
qreal z_value = tl_item->zValue(); qreal z_value = tl_item->zValue();
int collapse_offset = 0; int start_bit = 0;
for (int idx = 0; idx < item_spans.size(); idx++) { for (int idx = 0; idx < item_spans.size(); idx++) {
DiagramItemSpan *item_span = &item_spans[idx]; DiagramItemSpan *item_span = &item_spans[idx];
int start_bit = item_span->start_bit - collapse_offset;
int y_off = (start_bit / bits_per_row) * layout_->rowHeight(); int y_off = (start_bit / bits_per_row) * layout_->rowHeight();
// Stack each item behind the previous one. // Stack each item behind the previous one.
z_value -= .01; z_value -= .01;
FieldInformationGraphicsItem *fi_item = new FieldInformationGraphicsItem(item_span->finfo, start_bit, item_span->length, layout_); FieldInformationGraphicsItem *fi_item = new FieldInformationGraphicsItem(item_span->finfo, start_bit, item_span->length, layout_);
if (fi_item->collapsedLength() < item_span->length) { start_bit += fi_item->collapsedLength();
collapse_offset += item_span->length - fi_item->collapsedLength();
#ifdef DEBUG_PACKET_DIAGRAM
qDebug() << "Collapse offset now" << collapse_offset;
#endif
}
fi_item->setPos(x, y_bottom + y_off); fi_item->setPos(x, y_bottom + y_off);
fi_item->setFlag(QGraphicsItem::ItemIsSelectable); fi_item->setFlag(QGraphicsItem::ItemIsSelectable);
fi_item->setAcceptedMouseButtons(Qt::LeftButton); fi_item->setAcceptedMouseButtons(Qt::LeftButton);