Qt/CodeViewWidget: Make columns resizable by the user and set sensible defaults.
This commit is contained in:
parent
24a01642e0
commit
e8dfb8f78d
|
@ -21,6 +21,7 @@
|
||||||
#include <QTableWidgetItem>
|
#include <QTableWidgetItem>
|
||||||
#include <QWheelEvent>
|
#include <QWheelEvent>
|
||||||
|
|
||||||
|
#include "Common/GekkoDisassembler.h"
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
#include "Core/Debugger/PPCDebugInterface.h"
|
#include "Core/Debugger/PPCDebugInterface.h"
|
||||||
|
@ -140,7 +141,14 @@ CodeViewWidget::CodeViewWidget()
|
||||||
setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
|
setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||||
|
|
||||||
verticalHeader()->hide();
|
verticalHeader()->hide();
|
||||||
horizontalHeader()->hide();
|
horizontalHeader()->setSectionResizeMode(CODE_VIEW_COLUMN_BREAKPOINT, QHeaderView::Fixed);
|
||||||
|
horizontalHeader()->setStretchLastSection(true);
|
||||||
|
setHorizontalHeaderItem(CODE_VIEW_COLUMN_BREAKPOINT, new QTableWidgetItem());
|
||||||
|
setHorizontalHeaderItem(CODE_VIEW_COLUMN_ADDRESS, new QTableWidgetItem(tr("Address")));
|
||||||
|
setHorizontalHeaderItem(CODE_VIEW_COLUMN_INSTRUCTION, new QTableWidgetItem(tr("Instr.")));
|
||||||
|
setHorizontalHeaderItem(CODE_VIEW_COLUMN_PARAMETERS, new QTableWidgetItem(tr("Parameters")));
|
||||||
|
setHorizontalHeaderItem(CODE_VIEW_COLUMN_DESCRIPTION, new QTableWidgetItem(tr("Symbols")));
|
||||||
|
setHorizontalHeaderItem(CODE_VIEW_COLUMN_BRANCH_ARROWS, new QTableWidgetItem(tr("Branches")));
|
||||||
|
|
||||||
setFont(Settings::Instance().GetDebugFont());
|
setFont(Settings::Instance().GetDebugFont());
|
||||||
setItemDelegateForColumn(CODE_VIEW_COLUMN_BRANCH_ARROWS, new BranchDisplayDelegate(this));
|
setItemDelegateForColumn(CODE_VIEW_COLUMN_BRANCH_ARROWS, new BranchDisplayDelegate(this));
|
||||||
|
@ -177,11 +185,32 @@ static u32 GetBranchFromAddress(u32 addr)
|
||||||
|
|
||||||
void CodeViewWidget::FontBasedSizing()
|
void CodeViewWidget::FontBasedSizing()
|
||||||
{
|
{
|
||||||
|
// just text width is too small with some fonts, so increase by a bit
|
||||||
|
constexpr int extra_text_width = 8;
|
||||||
|
|
||||||
const QFontMetrics fm(Settings::Instance().GetDebugFont());
|
const QFontMetrics fm(Settings::Instance().GetDebugFont());
|
||||||
const int rowh = fm.height() + 1;
|
const int rowh = fm.height() + 1;
|
||||||
verticalHeader()->setMaximumSectionSize(rowh);
|
verticalHeader()->setMaximumSectionSize(rowh);
|
||||||
horizontalHeader()->setMinimumSectionSize(rowh + 5);
|
horizontalHeader()->setMinimumSectionSize(rowh + 5);
|
||||||
setColumnWidth(CODE_VIEW_COLUMN_BREAKPOINT, rowh + 5);
|
setColumnWidth(CODE_VIEW_COLUMN_BREAKPOINT, rowh + 5);
|
||||||
|
setColumnWidth(CODE_VIEW_COLUMN_ADDRESS, fm.width(QStringLiteral("80000000")) + extra_text_width);
|
||||||
|
|
||||||
|
// The longest instruction is technically 'ps_merge00' (0x10000420u), but those instructions are
|
||||||
|
// very rare and would needlessly increase the column size, so let's go with 'rlwinm.' instead.
|
||||||
|
// Similarly, the longest parameter set is 'rtoc, rtoc, r10, 10, 10 (00000800)' (0x5c425294u),
|
||||||
|
// but one is unlikely to encounter that in practice, so let's use a slightly more reasonable
|
||||||
|
// 'r31, r31, 16, 16, 31 (ffff0000)'. The user can resize the columns as necessary anyway.
|
||||||
|
const std::string disas = Common::GekkoDisassembler::Disassemble(0x57ff843fu, 0);
|
||||||
|
const auto split = disas.find('\t');
|
||||||
|
const std::string ins = (split == std::string::npos ? disas : disas.substr(0, split));
|
||||||
|
const std::string param = (split == std::string::npos ? "" : disas.substr(split + 1));
|
||||||
|
setColumnWidth(CODE_VIEW_COLUMN_INSTRUCTION,
|
||||||
|
fm.width(QString::fromStdString(ins)) + extra_text_width);
|
||||||
|
setColumnWidth(CODE_VIEW_COLUMN_PARAMETERS,
|
||||||
|
fm.width(QString::fromStdString(param)) + extra_text_width);
|
||||||
|
setColumnWidth(CODE_VIEW_COLUMN_DESCRIPTION,
|
||||||
|
fm.width(QStringLiteral("0")) * 25 + extra_text_width);
|
||||||
|
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,13 +351,6 @@ void CodeViewWidget::Update()
|
||||||
|
|
||||||
CalculateBranchIndentation();
|
CalculateBranchIndentation();
|
||||||
|
|
||||||
u32 max_indent = 0;
|
|
||||||
for (const CodeViewBranch& branch : m_branches)
|
|
||||||
max_indent = std::max(max_indent, branch.indentation);
|
|
||||||
|
|
||||||
resizeColumnsToContents();
|
|
||||||
setColumnWidth(CODE_VIEW_COLUMN_BRANCH_ARROWS,
|
|
||||||
static_cast<int>(WIDTH_PER_BRANCH_ARROW * (max_indent + 1)));
|
|
||||||
g_symbolDB.FillInCallers();
|
g_symbolDB.FillInCallers();
|
||||||
|
|
||||||
repaint();
|
repaint();
|
||||||
|
|
Loading…
Reference in New Issue