mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-19 19:35:41 -04:00
CPU: Implement memory breakpoints/watchpoints
This commit is contained in:
@ -64,6 +64,7 @@ set(SRCS
|
||||
coverdownloaddialog.cpp
|
||||
coverdownloaddialog.h
|
||||
coverdownloaddialog.ui
|
||||
debuggeraddbreakpointdialog.ui
|
||||
debuggermodels.cpp
|
||||
debuggermodels.h
|
||||
debuggerwindow.cpp
|
||||
|
93
src/duckstation-qt/debuggeraddbreakpointdialog.ui
Normal file
93
src/duckstation-qt/debuggeraddbreakpointdialog.ui
Normal file
@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DebuggerAddBreakpointDialog</class>
|
||||
<widget class="QDialog" name="DebuggerAddBreakpointDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>149</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Add Breakpoint</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Address:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="address"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="execute">
|
||||
<property name="text">
|
||||
<string>Execute</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="read">
|
||||
<property name="text">
|
||||
<string>Read</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="write">
|
||||
<property name="text">
|
||||
<string>Write</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>DebuggerAddBreakpointDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
|
||||
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
|
||||
|
||||
#include "debuggermodels.h"
|
||||
@ -13,6 +13,8 @@
|
||||
#include <QtGui/QIcon>
|
||||
#include <QtGui/QPalette>
|
||||
#include <QtWidgets/QApplication>
|
||||
#include <QtWidgets/QMessageBox>
|
||||
#include <QtWidgets/QPushButton>
|
||||
|
||||
static constexpr int NUM_COLUMNS = 5;
|
||||
static constexpr int STACK_RANGE = 128;
|
||||
@ -449,3 +451,44 @@ void DebuggerStackModel::invalidateView()
|
||||
beginResetModel();
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
DebuggerAddBreakpointDialog::DebuggerAddBreakpointDialog(QWidget* parent /*= nullptr*/) : QDialog(parent)
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, this,
|
||||
&DebuggerAddBreakpointDialog::okClicked);
|
||||
}
|
||||
|
||||
DebuggerAddBreakpointDialog::~DebuggerAddBreakpointDialog() = default;
|
||||
|
||||
void DebuggerAddBreakpointDialog::okClicked()
|
||||
{
|
||||
const QString address_str = m_ui.address->text();
|
||||
m_address = 0;
|
||||
bool ok = false;
|
||||
|
||||
if (!address_str.isEmpty())
|
||||
{
|
||||
if (address_str.startsWith("0x"))
|
||||
m_address = address_str.mid(2).toUInt(&ok, 16);
|
||||
else
|
||||
m_address = address_str.toUInt(&ok, 16);
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
QMessageBox::critical(
|
||||
this, qApp->translate("DebuggerWindow", "Error"),
|
||||
qApp->translate("DebuggerWindow", "Invalid address. It should be in hex (0x12345678 or 12345678)"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_ui.read->isChecked())
|
||||
m_type = CPU::BreakpointType::Read;
|
||||
else if (m_ui.write->isChecked())
|
||||
m_type = CPU::BreakpointType::Write;
|
||||
else
|
||||
m_type = CPU::BreakpointType::Execute;
|
||||
|
||||
accept();
|
||||
}
|
||||
}
|
||||
|
@ -1,27 +1,32 @@
|
||||
// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
|
||||
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_debuggeraddbreakpointdialog.h"
|
||||
|
||||
#include "core/bus.h"
|
||||
#include "core/cpu_core.h"
|
||||
#include "core/cpu_types.h"
|
||||
|
||||
#include <QtCore/QAbstractListModel>
|
||||
#include <QtCore/QAbstractTableModel>
|
||||
#include <QtGui/QPixmap>
|
||||
#include <QtWidgets/QDialog>
|
||||
#include <map>
|
||||
|
||||
class DebuggerCodeModel : public QAbstractTableModel
|
||||
class DebuggerCodeModel final : public QAbstractTableModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DebuggerCodeModel(QObject* parent = nullptr);
|
||||
virtual ~DebuggerCodeModel();
|
||||
~DebuggerCodeModel() override;
|
||||
|
||||
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
|
||||
// Returns the row for this instruction pointer
|
||||
void resetCodeView(VirtualMemoryAddress start_address);
|
||||
@ -51,39 +56,59 @@ private:
|
||||
QPixmap m_breakpoint_pixmap;
|
||||
};
|
||||
|
||||
class DebuggerRegistersModel : public QAbstractListModel
|
||||
class DebuggerRegistersModel final : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DebuggerRegistersModel(QObject* parent = nullptr);
|
||||
virtual ~DebuggerRegistersModel();
|
||||
~DebuggerRegistersModel() override;
|
||||
|
||||
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
|
||||
void updateValues();
|
||||
void saveCurrentValues();
|
||||
|
||||
private:
|
||||
std::array<u32 ,CPU::NUM_DEBUGGER_REGISTER_LIST_ENTRIES> m_reg_values = {};
|
||||
std::array<u32, CPU::NUM_DEBUGGER_REGISTER_LIST_ENTRIES> m_reg_values = {};
|
||||
std::array<u32, CPU::NUM_DEBUGGER_REGISTER_LIST_ENTRIES> m_old_reg_values = {};
|
||||
};
|
||||
|
||||
class DebuggerStackModel : public QAbstractListModel
|
||||
class DebuggerStackModel final : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DebuggerStackModel(QObject* parent = nullptr);
|
||||
virtual ~DebuggerStackModel();
|
||||
~DebuggerStackModel() override;
|
||||
|
||||
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
|
||||
void invalidateView();
|
||||
};
|
||||
|
||||
class DebuggerAddBreakpointDialog final : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DebuggerAddBreakpointDialog(QWidget* parent = nullptr);
|
||||
~DebuggerAddBreakpointDialog() override;
|
||||
|
||||
u32 getAddress() const { return m_address; }
|
||||
CPU::BreakpointType getType() const { return m_type; }
|
||||
|
||||
private Q_SLOTS:
|
||||
void okClicked();
|
||||
|
||||
private:
|
||||
Ui::DebuggerAddBreakpointDialog m_ui;
|
||||
u32 m_address = 0;
|
||||
CPU::BreakpointType m_type = CPU::BreakpointType::Execute;
|
||||
};
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "core/cpu_core_private.h"
|
||||
|
||||
#include <QtCore/QSignalBlocker>
|
||||
#include <QtGui/QCursor>
|
||||
#include <QtGui/QFontDatabase>
|
||||
#include <QtWidgets/QFileDialog>
|
||||
#include <QtWidgets/QMessageBox>
|
||||
@ -41,7 +42,6 @@ void DebuggerWindow::onSystemPaused()
|
||||
{
|
||||
setUIEnabled(true, true);
|
||||
refreshAll();
|
||||
refreshBreakpointList();
|
||||
|
||||
{
|
||||
QSignalBlocker sb(m_ui.actionPause);
|
||||
@ -111,7 +111,7 @@ void DebuggerWindow::onRunToCursorTriggered()
|
||||
return;
|
||||
}
|
||||
|
||||
CPU::AddBreakpoint(addr.value(), true, true);
|
||||
CPU::AddBreakpoint(CPU::BreakpointType::Execute, addr.value(), true, true);
|
||||
g_emu_thread->setSystemPaused(false);
|
||||
}
|
||||
|
||||
@ -163,18 +163,11 @@ void DebuggerWindow::onFollowAddressTriggered()
|
||||
|
||||
void DebuggerWindow::onAddBreakpointTriggered()
|
||||
{
|
||||
std::optional<VirtualMemoryAddress> address =
|
||||
QtUtils::PromptForAddress(this, windowTitle(), tr("Enter code address:"), true);
|
||||
if (!address.has_value())
|
||||
DebuggerAddBreakpointDialog dlg(this);
|
||||
if (!dlg.exec())
|
||||
return;
|
||||
|
||||
if (CPU::HasBreakpointAtAddress(address.value()))
|
||||
{
|
||||
QMessageBox::critical(this, windowTitle(), tr("A breakpoint already exists at this address."));
|
||||
return;
|
||||
}
|
||||
|
||||
toggleBreakpoint(address.value());
|
||||
addBreakpoint(dlg.getType(), dlg.getAddress());
|
||||
}
|
||||
|
||||
void DebuggerWindow::onToggleBreakpointTriggered()
|
||||
@ -191,6 +184,22 @@ void DebuggerWindow::onClearBreakpointsTriggered()
|
||||
clearBreakpoints();
|
||||
}
|
||||
|
||||
void DebuggerWindow::onBreakpointListContextMenuRequested()
|
||||
{
|
||||
const QList<QTreeWidgetItem*> selected = m_ui.breakpointsWidget->selectedItems();
|
||||
if (selected.size() != 1)
|
||||
return;
|
||||
|
||||
const QTreeWidgetItem* item = selected[0];
|
||||
const u32 address = item->data(1, Qt::UserRole).toUInt();
|
||||
const CPU::BreakpointType type = static_cast<CPU::BreakpointType>(item->data(2, Qt::UserRole).toUInt());
|
||||
|
||||
QMenu menu(this);
|
||||
connect(menu.addAction(tr("&Remove")), &QAction::triggered, this,
|
||||
[this, address, type]() { removeBreakpoint(type, address); });
|
||||
menu.exec(QCursor::pos());
|
||||
}
|
||||
|
||||
void DebuggerWindow::onStepIntoActionTriggered()
|
||||
{
|
||||
Assert(System::IsPaused());
|
||||
@ -268,7 +277,7 @@ void DebuggerWindow::onCodeViewContextMenuRequested(const QPoint& pt)
|
||||
action = menu.addAction(QIcon::fromTheme("debugger-go-to-cursor"), tr("&Run To Cursor"));
|
||||
connect(action, &QAction::triggered, this, [address]() {
|
||||
Host::RunOnCPUThread([address]() {
|
||||
CPU::AddBreakpoint(address, true, true);
|
||||
CPU::AddBreakpoint(CPU::BreakpointType::Execute, address, true, true);
|
||||
g_emu_thread->setSystemPaused(false);
|
||||
});
|
||||
});
|
||||
@ -426,6 +435,7 @@ void DebuggerWindow::setupAdditionalUi()
|
||||
m_ui.stackView->setFont(fixedFont);
|
||||
|
||||
m_ui.codeView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
m_ui.breakpointsWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
setCentralWidget(nullptr);
|
||||
delete m_ui.centralwidget;
|
||||
@ -454,6 +464,8 @@ void DebuggerWindow::connectSignals()
|
||||
connect(m_ui.actionClose, &QAction::triggered, this, &DebuggerWindow::close);
|
||||
connect(m_ui.codeView, &QTreeView::activated, this, &DebuggerWindow::onCodeViewItemActivated);
|
||||
connect(m_ui.codeView, &QTreeView::customContextMenuRequested, this, &DebuggerWindow::onCodeViewContextMenuRequested);
|
||||
connect(m_ui.breakpointsWidget, &QTreeWidget::customContextMenuRequested, this,
|
||||
&DebuggerWindow::onBreakpointListContextMenuRequested);
|
||||
|
||||
connect(m_ui.memoryRegionRAM, &QRadioButton::clicked, [this]() { setMemoryViewRegion(Bus::MemoryRegion::RAM); });
|
||||
connect(m_ui.memoryRegionEXP1, &QRadioButton::clicked, [this]() { setMemoryViewRegion(Bus::MemoryRegion::EXP1); });
|
||||
@ -492,7 +504,8 @@ void DebuggerWindow::createModels()
|
||||
|
||||
m_ui.breakpointsWidget->setColumnWidth(0, 50);
|
||||
m_ui.breakpointsWidget->setColumnWidth(1, 80);
|
||||
m_ui.breakpointsWidget->setColumnWidth(2, 40);
|
||||
m_ui.breakpointsWidget->setColumnWidth(2, 50);
|
||||
m_ui.breakpointsWidget->setColumnWidth(3, 40);
|
||||
m_ui.breakpointsWidget->setRootIsDecorated(false);
|
||||
}
|
||||
|
||||
@ -553,19 +566,19 @@ void DebuggerWindow::setMemoryViewRegion(Bus::MemoryRegion region)
|
||||
void DebuggerWindow::toggleBreakpoint(VirtualMemoryAddress address)
|
||||
{
|
||||
Host::RunOnCPUThread([this, address]() {
|
||||
const bool new_bp_state = !CPU::HasBreakpointAtAddress(address);
|
||||
const bool new_bp_state = !CPU::HasBreakpointAtAddress(CPU::BreakpointType::Execute, address);
|
||||
if (new_bp_state)
|
||||
{
|
||||
if (!CPU::AddBreakpoint(address, false))
|
||||
if (!CPU::AddBreakpoint(CPU::BreakpointType::Execute, address, false))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!CPU::RemoveBreakpoint(address))
|
||||
if (!CPU::RemoveBreakpoint(CPU::BreakpointType::Execute, address))
|
||||
return;
|
||||
}
|
||||
|
||||
QtHost::RunOnUIThread([this, address, new_bp_state, bps = CPU::GetBreakpointList()]() {
|
||||
QtHost::RunOnUIThread([this, address, new_bp_state, bps = CPU::CopyBreakpointList()]() {
|
||||
m_code_model->setBreakpointState(address, new_bp_state);
|
||||
refreshBreakpointList(bps);
|
||||
});
|
||||
@ -618,7 +631,8 @@ bool DebuggerWindow::scrollToMemoryAddress(VirtualMemoryAddress address)
|
||||
|
||||
void DebuggerWindow::refreshBreakpointList()
|
||||
{
|
||||
refreshBreakpointList(CPU::GetBreakpointList());
|
||||
Host::RunOnCPUThread(
|
||||
[this]() { QtHost::RunOnUIThread([this, bps = CPU::CopyBreakpointList()]() { refreshBreakpointList(bps); }); });
|
||||
}
|
||||
|
||||
void DebuggerWindow::refreshBreakpointList(const CPU::BreakpointList& bps)
|
||||
@ -633,7 +647,50 @@ void DebuggerWindow::refreshBreakpointList(const CPU::BreakpointList& bps)
|
||||
item->setCheckState(0, bp.enabled ? Qt::Checked : Qt::Unchecked);
|
||||
item->setText(0, QString::asprintf("%u", bp.number));
|
||||
item->setText(1, QString::asprintf("0x%08X", bp.address));
|
||||
item->setText(2, QString::asprintf("%u", bp.hit_count));
|
||||
item->setText(2, QString::fromUtf8(CPU::GetBreakpointTypeName(bp.type)));
|
||||
item->setText(3, QString::asprintf("%u", bp.hit_count));
|
||||
item->setData(0, Qt::UserRole, bp.number);
|
||||
item->setData(1, Qt::UserRole, bp.address);
|
||||
item->setData(2, Qt::UserRole, static_cast<u32>(bp.type));
|
||||
m_ui.breakpointsWidget->addTopLevelItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
void DebuggerWindow::addBreakpoint(CPU::BreakpointType type, u32 address)
|
||||
{
|
||||
Host::RunOnCPUThread([this, address, type]() {
|
||||
const bool result = CPU::AddBreakpoint(type, address);
|
||||
QtHost::RunOnUIThread([this, address, type, result, bps = CPU::CopyBreakpointList()]() {
|
||||
if (!result)
|
||||
{
|
||||
QMessageBox::critical(this, windowTitle(),
|
||||
tr("Failed to add breakpoint. A breakpoint may already exist at this address."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == CPU::BreakpointType::Execute)
|
||||
m_code_model->setBreakpointState(address, true);
|
||||
|
||||
refreshBreakpointList(bps);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void DebuggerWindow::removeBreakpoint(CPU::BreakpointType type, u32 address)
|
||||
{
|
||||
Host::RunOnCPUThread([this, address, type]() {
|
||||
const bool result = CPU::RemoveBreakpoint(type, address);
|
||||
QtHost::RunOnUIThread([this, address, type, result, bps = CPU::CopyBreakpointList()]() {
|
||||
if (!result)
|
||||
{
|
||||
QMessageBox::critical(this, windowTitle(), tr("Failed to remove breakpoint. This breakpoint may not exist."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == CPU::BreakpointType::Execute)
|
||||
m_code_model->setBreakpointState(address, false);
|
||||
|
||||
refreshBreakpointList(bps);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -55,6 +55,7 @@ private Q_SLOTS:
|
||||
void onAddBreakpointTriggered();
|
||||
void onToggleBreakpointTriggered();
|
||||
void onClearBreakpointsTriggered();
|
||||
void onBreakpointListContextMenuRequested();
|
||||
void onStepIntoActionTriggered();
|
||||
void onStepOverActionTriggered();
|
||||
void onStepOutActionTriggered();
|
||||
@ -78,6 +79,8 @@ private:
|
||||
bool scrollToMemoryAddress(VirtualMemoryAddress address);
|
||||
void refreshBreakpointList();
|
||||
void refreshBreakpointList(const CPU::BreakpointList& bps);
|
||||
void addBreakpoint(CPU::BreakpointType type, u32 address);
|
||||
void removeBreakpoint(CPU::BreakpointType type, u32 address);
|
||||
|
||||
Ui::DebuggerWindow m_ui;
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1210</width>
|
||||
<width>1270</width>
|
||||
<height>800</height>
|
||||
</rect>
|
||||
</property>
|
||||
@ -233,7 +233,7 @@
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>200</width>
|
||||
<width>290</width>
|
||||
<height>524287</height>
|
||||
</size>
|
||||
</property>
|
||||
@ -269,6 +269,11 @@
|
||||
<string>Address</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Type</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Hit Count</string>
|
||||
|
@ -332,6 +332,9 @@
|
||||
<QtUi Include="setupwizarddialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="debuggeraddbreakpointdialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<None Include="translations\duckstation-qt_es-es.ts" />
|
||||
<None Include="translations\duckstation-qt_tr.ts" />
|
||||
</ItemGroup>
|
||||
|
@ -292,6 +292,7 @@
|
||||
<QtUi Include="coverdownloaddialog.ui" />
|
||||
<QtUi Include="setupwizarddialog.ui" />
|
||||
<QtUi Include="controllerledsettingsdialog.ui" />
|
||||
<QtUi Include="debuggeraddbreakpointdialog.ui" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Natvis Include="qt5.natvis" />
|
||||
|
Reference in New Issue
Block a user