From f1f0e7de145590aaca93692af65e03813b47ff9e Mon Sep 17 00:00:00 2001 From: Stenzek Date: Mon, 9 Sep 2024 20:37:04 +1000 Subject: [PATCH] Qt/Debugger: Highlight selection on dump address --- src/duckstation-qt/debuggerwindow.cpp | 2 +- src/duckstation-qt/memoryviewwidget.cpp | 16 +++++++++++++--- src/duckstation-qt/memoryviewwidget.h | 3 ++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/duckstation-qt/debuggerwindow.cpp b/src/duckstation-qt/debuggerwindow.cpp index 329ebdda3..fa9379a50 100644 --- a/src/duckstation-qt/debuggerwindow.cpp +++ b/src/duckstation-qt/debuggerwindow.cpp @@ -672,7 +672,7 @@ bool DebuggerWindow::scrollToMemoryAddress(VirtualMemoryAddress address) setMemoryViewRegion(region.value()); const PhysicalMemoryAddress offset = phys_address - Bus::GetMemoryRegionStart(region.value()); - m_ui.memoryView->scrolltoOffset(offset); + m_ui.memoryView->scrollToOffset(offset); return true; } diff --git a/src/duckstation-qt/memoryviewwidget.cpp b/src/duckstation-qt/memoryviewwidget.cpp index 90e857eed..b75a48c64 100644 --- a/src/duckstation-qt/memoryviewwidget.cpp +++ b/src/duckstation-qt/memoryviewwidget.cpp @@ -75,11 +75,13 @@ void MemoryViewWidget::clearHighlightRange() viewport()->update(); } -void MemoryViewWidget::scrolltoOffset(size_t offset) +void MemoryViewWidget::scrollToOffset(size_t offset, bool select /* = true */) { const unsigned row = static_cast(offset / m_bytes_per_line); verticalScrollBar()->setSliderPosition(static_cast(row)); horizontalScrollBar()->setSliderPosition(0); + if (select) + setSelection(offset, false); } void MemoryViewWidget::scrollToAddress(size_t address) @@ -205,6 +207,7 @@ void MemoryViewWidget::paintEvent(QPaintEvent* event) if (!m_data) return; + const QColor alt_fill_color(40, 40, 40); const QColor highlight_color(100, 100, 0); const QColor selected_color = viewport()->palette().color(QPalette::Highlight); const QColor text_color = viewport()->palette().color(QPalette::WindowText); @@ -224,7 +227,9 @@ void MemoryViewWidget::paintEvent(QPaintEvent* event) const size_t data_offset = m_start_offset + (row * m_bytes_per_line); const unsigned row_address = static_cast(m_address_offset + data_offset); const int draw_x = m_char_width / 2 - offsetX; - if (RangesOverlap(data_offset, data_offset + m_bytes_per_line, m_highlight_start, m_highlight_end)) + if (RangesOverlap(data_offset, data_offset + m_bytes_per_line, m_selected_address, m_selected_address + 1)) + painter.fillRect(0, y - m_char_height + 3, addressWidth(), m_char_height, selected_color); + else if (RangesOverlap(data_offset, data_offset + m_bytes_per_line, m_highlight_start, m_highlight_end)) painter.fillRect(0, y - m_char_height + 3, addressWidth(), m_char_height, highlight_color); const QString address_text(QString::asprintf("%08X", row_address)); @@ -244,7 +249,7 @@ void MemoryViewWidget::paintEvent(QPaintEvent* event) for (unsigned col = 0; col < m_bytes_per_line; col++) { if ((col % 2) != 0) - painter.fillRect(x, 0, HEX_CHAR_WIDTH, height(), viewport()->palette().color(QPalette::AlternateBase)); + painter.fillRect(x, 0, HEX_CHAR_WIDTH, height(), alt_fill_color); x += HEX_CHAR_WIDTH; } @@ -393,6 +398,11 @@ void MemoryViewWidget::updateSelectedByte(const QPoint& pos) } } + setSelection(new_selection, new_ascii); +} + +void MemoryViewWidget::setSelection(size_t new_selection, bool new_ascii) +{ if (new_selection != m_selected_address || new_ascii != m_selection_was_ascii) { m_selected_address = new_selection; diff --git a/src/duckstation-qt/memoryviewwidget.h b/src/duckstation-qt/memoryviewwidget.h index 313b04e7c..35df186a7 100644 --- a/src/duckstation-qt/memoryviewwidget.h +++ b/src/duckstation-qt/memoryviewwidget.h @@ -23,7 +23,7 @@ public: void setData(size_t address_offset, void* data_ptr, size_t data_size, bool data_editable, EditCallback edit_callback); void setHighlightRange(size_t start, size_t end); void clearHighlightRange(); - void scrolltoOffset(size_t offset); + void scrollToOffset(size_t offset, bool select = true); void scrollToAddress(size_t address); void setFont(const QFont& font); @@ -49,6 +49,7 @@ private: int asciiWidth() const; void updateMetrics(); void updateSelectedByte(const QPoint& pos); + void setSelection(size_t new_selection, bool new_ascii); void expandCurrentDataToInclude(size_t offset); void* m_data;