]> sigrok.org Git - pulseview.git/blobdiff - pv/views/decoder_output/QHexView.cpp
QHexView: Fix selection display
[pulseview.git] / pv / views / decoder_output / QHexView.cpp
index 0fca4161fe02f6467799619a56862cb09db8b8c1..5c34d61bac5ad9c5022e0db133b2cdcb0eadd8f1 100644 (file)
@@ -79,7 +79,7 @@ QHexView::QHexView(QWidget *parent):
        }
 }
 
-void QHexView::setMode(Mode m)
+void QHexView::set_mode(Mode m)
 {
        mode_ = m;
 
@@ -87,7 +87,7 @@ void QHexView::setMode(Mode m)
        // so we don't update the viewport here
 }
 
-void QHexView::setData(const DecodeBinaryClass* data)
+void QHexView::set_data(const DecodeBinaryClass* data)
 {
        data_ = data;
 
@@ -100,6 +100,11 @@ void QHexView::setData(const DecodeBinaryClass* data)
        viewport()->update();
 }
 
+unsigned int QHexView::get_bytes_per_line() const
+{
+       return BYTES_PER_LINE;
+}
+
 void QHexView::clear()
 {
        verticalScrollBar()->setValue(0);
@@ -141,6 +146,47 @@ pair<size_t, size_t> QHexView::get_selection() const
        return std::make_pair(start, end);
 }
 
+size_t QHexView::create_hex_line(size_t start, size_t end, QString* dest,
+       bool with_offset, bool with_ascii)
+{
+       dest->clear();
+
+       // Determine start address for the row
+       uint64_t row = start / BYTES_PER_LINE;
+       uint64_t offset = row * BYTES_PER_LINE;
+       end = std::min(end, offset + BYTES_PER_LINE);
+
+       if (with_offset)
+               dest->append(QString("%1 ").arg(row * BYTES_PER_LINE, 10, 16, QChar('0')).toUpper());
+
+       initialize_byte_iterator(offset);
+       for (size_t i = offset; i < offset + BYTES_PER_LINE; i++) {
+               uint8_t value = 0;
+
+               if (i < end)
+                       value = get_next_byte();
+
+               if ((i < start) || (i >= end))
+                       dest->append("   ");
+               else
+                       dest->append(QString("%1 ").arg(value, 2, 16, QChar('0')).toUpper());
+       }
+
+       if (with_ascii) {
+               initialize_byte_iterator(offset);
+               for (size_t i = offset; i < end; i++) {
+                       uint8_t value = get_next_byte();
+
+                       if (i < start)
+                               dest->append(' ');
+                       else
+                               dest->append((char)value);
+               }
+       }
+
+       return end;
+}
+
 void QHexView::initialize_byte_iterator(size_t offset)
 {
        current_chunk_id_ = 0;
@@ -317,6 +363,9 @@ void QHexView::paintEvent(QPaintEvent *event)
                        val = QString::number((byte_value & 0xF), 16).toUpper();
                        painter.drawText(x + charWidth_, y, val);
 
+                       if ((pos >= selectBegin_) && (pos < selectEnd_ - 1) && (i < BYTES_PER_LINE - 1))
+                               painter.drawText(x + 2 * charWidth_, y, QString(' '));
+
                        x += 3 * charWidth_;
                }