X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fviews%2Fdecoder_output%2FQHexView.cpp;h=2fe54bf876075710327ef8a428bf4654f9d06606;hb=44b2b6b7a56e744aeae38b482c2ac59b92ae73c9;hp=06df103b7f45c43b9aa19cc75d3e22260eace604;hpb=6961eab0d4bf976cee015afacfa7c25795e574b9;p=pulseview.git diff --git a/pv/views/decoder_output/QHexView.cpp b/pv/views/decoder_output/QHexView.cpp index 06df103b..2fe54bf8 100644 --- a/pv/views/decoder_output/QHexView.cpp +++ b/pv/views/decoder_output/QHexView.cpp @@ -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); @@ -126,6 +131,65 @@ QSizePolicy QHexView::sizePolicy() const return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); } +pair QHexView::get_selection() const +{ + size_t start = selectBegin_ / 2; + size_t end = selectEnd_ / 2; + + if (start == end) { + // Nothing is currently selected + start = 0; + end = data_size_; + } else + end++; + + 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 ((value < 0x20) || (value > 0x7E)) + value = '.'; + + if (i < start) + dest->append(' '); + else + dest->append((char)value); + } + } + + return end; +} + void QHexView::initialize_byte_iterator(size_t offset) { current_chunk_id_ = 0; @@ -302,6 +366,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_; }