Qt/Debugger: Improve row scrolling
Don't center the current PC unless we're going off screen, or requested a specific address.
This commit is contained in:
parent
5faaa20192
commit
949f396e9a
|
@ -15,6 +15,7 @@
|
||||||
#include <QtCore/QSignalBlocker>
|
#include <QtCore/QSignalBlocker>
|
||||||
#include <QtGui/QCursor>
|
#include <QtGui/QCursor>
|
||||||
#include <QtGui/QFontDatabase>
|
#include <QtGui/QFontDatabase>
|
||||||
|
#include <QtWidgets/QAbstractScrollArea>
|
||||||
#include <QtWidgets/QFileDialog>
|
#include <QtWidgets/QFileDialog>
|
||||||
#include <QtWidgets/QMessageBox>
|
#include <QtWidgets/QMessageBox>
|
||||||
|
|
||||||
|
@ -81,15 +82,15 @@ void DebuggerWindow::refreshAll()
|
||||||
m_ui.memoryView->forceRefresh();
|
m_ui.memoryView->forceRefresh();
|
||||||
|
|
||||||
m_code_model->setPC(CPU::g_state.pc);
|
m_code_model->setPC(CPU::g_state.pc);
|
||||||
scrollToPC();
|
scrollToPC(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerWindow::scrollToPC()
|
void DebuggerWindow::scrollToPC(bool center)
|
||||||
{
|
{
|
||||||
return scrollToCodeAddress(CPU::g_state.pc);
|
return scrollToCodeAddress(CPU::g_state.pc, center);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerWindow::scrollToCodeAddress(VirtualMemoryAddress address)
|
void DebuggerWindow::scrollToCodeAddress(VirtualMemoryAddress address, bool center)
|
||||||
{
|
{
|
||||||
m_code_model->ensureAddressVisible(address);
|
m_code_model->ensureAddressVisible(address);
|
||||||
|
|
||||||
|
@ -99,7 +100,14 @@ void DebuggerWindow::scrollToCodeAddress(VirtualMemoryAddress address)
|
||||||
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
|
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
|
|
||||||
const QModelIndex index = m_code_model->index(row, 0);
|
const QModelIndex index = m_code_model->index(row, 0);
|
||||||
m_ui.codeView->scrollTo(index, QAbstractItemView::PositionAtCenter);
|
const QRect rect = m_ui.codeView->visualRect(index);
|
||||||
|
if (rect.left() < 0 || rect.top() < 0 || rect.right() > m_ui.codeView->viewport()->width() ||
|
||||||
|
rect.bottom() > m_ui.codeView->viewport()->height())
|
||||||
|
{
|
||||||
|
center = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui.codeView->scrollTo(index, center ? QAbstractItemView::PositionAtCenter : QAbstractItemView::EnsureVisible);
|
||||||
m_ui.codeView->selectionModel()->setCurrentIndex(index,
|
m_ui.codeView->selectionModel()->setCurrentIndex(index,
|
||||||
QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
|
QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
|
||||||
}
|
}
|
||||||
|
@ -131,7 +139,7 @@ void DebuggerWindow::onRunToCursorTriggered()
|
||||||
|
|
||||||
void DebuggerWindow::onGoToPCTriggered()
|
void DebuggerWindow::onGoToPCTriggered()
|
||||||
{
|
{
|
||||||
scrollToPC();
|
scrollToPC(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerWindow::onGoToAddressTriggered()
|
void DebuggerWindow::onGoToAddressTriggered()
|
||||||
|
@ -141,7 +149,7 @@ void DebuggerWindow::onGoToAddressTriggered()
|
||||||
if (!address.has_value())
|
if (!address.has_value())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scrollToCodeAddress(address.value());
|
scrollToCodeAddress(address.value(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerWindow::onDumpAddressTriggered()
|
void DebuggerWindow::onDumpAddressTriggered()
|
||||||
|
|
|
@ -45,8 +45,6 @@ private Q_SLOTS:
|
||||||
void timerRefresh();
|
void timerRefresh();
|
||||||
void refreshAll();
|
void refreshAll();
|
||||||
|
|
||||||
void scrollToPC();
|
|
||||||
|
|
||||||
void onPauseActionToggled(bool paused);
|
void onPauseActionToggled(bool paused);
|
||||||
void onRunToCursorTriggered();
|
void onRunToCursorTriggered();
|
||||||
void onGoToPCTriggered();
|
void onGoToPCTriggered();
|
||||||
|
@ -78,7 +76,8 @@ private:
|
||||||
void clearBreakpoints();
|
void clearBreakpoints();
|
||||||
std::optional<VirtualMemoryAddress> getSelectedCodeAddress();
|
std::optional<VirtualMemoryAddress> getSelectedCodeAddress();
|
||||||
bool tryFollowLoadStore(VirtualMemoryAddress address);
|
bool tryFollowLoadStore(VirtualMemoryAddress address);
|
||||||
void scrollToCodeAddress(VirtualMemoryAddress address);
|
void scrollToPC(bool center);
|
||||||
|
void scrollToCodeAddress(VirtualMemoryAddress address, bool center);
|
||||||
bool scrollToMemoryAddress(VirtualMemoryAddress address);
|
bool scrollToMemoryAddress(VirtualMemoryAddress address);
|
||||||
void refreshBreakpointList();
|
void refreshBreakpointList();
|
||||||
void refreshBreakpointList(const CPU::BreakpointList& bps);
|
void refreshBreakpointList(const CPU::BreakpointList& bps);
|
||||||
|
|
Loading…
Reference in New Issue