diff --git a/Source/Core/DolphinQt/Debugger/WatchWidget.cpp b/Source/Core/DolphinQt/Debugger/WatchWidget.cpp index 15a5eae867..2f0df1d72f 100644 --- a/Source/Core/DolphinQt/Debugger/WatchWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/WatchWidget.cpp @@ -158,11 +158,11 @@ void WatchWidget::Update() // i18n: Data type used in computing tr("String"), // i18n: Floating-point (non-integer) number - tr("Float")}); + tr("Float"), tr("Locked")}); for (int i = 0; i < size; i++) { - auto entry = PowerPC::debug_interface.GetWatch(i); + const auto& entry = PowerPC::debug_interface.GetWatch(i); auto* label = new QTableWidgetItem(QString::fromStdString(entry.name)); auto* address = @@ -172,8 +172,11 @@ void WatchWidget::Update() auto* string = new QTableWidgetItem; auto* floatValue = new QTableWidgetItem; - std::array items = {label, address, hex, - decimal, string, floatValue}; + auto* lockValue = new QTableWidgetItem; + lockValue->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable); + + std::array items = {label, address, hex, decimal, + string, floatValue, lockValue}; QBrush brush = QPalette().brush(QPalette::Text); @@ -189,6 +192,7 @@ void WatchWidget::Update() decimal->setText(QString::number(PowerPC::HostRead_U32(entry.address))); string->setText(QString::fromStdString(PowerPC::HostGetString(entry.address, 32))); floatValue->setText(QString::number(PowerPC::HostRead_F32(entry.address))); + lockValue->setCheckState(entry.locked ? Qt::Checked : Qt::Unchecked); } } @@ -280,6 +284,10 @@ void WatchWidget::OnLoad() if (ini.GetLines("Watches", &watches, false)) { + for (const auto& watch : PowerPC::debug_interface.GetWatches()) + { + PowerPC::debug_interface.UnsetPatch(watch.address); + } PowerPC::debug_interface.ClearWatches(); PowerPC::debug_interface.LoadWatchesFromStrings(watches); } @@ -367,9 +375,17 @@ void WatchWidget::OnItemChanged(QTableWidgetItem* item) if (good) { if (column == COLUMN_INDEX_ADDRESS) + { + const auto& watch = PowerPC::debug_interface.GetWatch(row); + PowerPC::debug_interface.UnsetPatch(watch.address); PowerPC::debug_interface.UpdateWatchAddress(row, value); + if (watch.locked) + LockWatchAddress(value); + } else + { PowerPC::HostWrite_U32(value, PowerPC::debug_interface.GetWatch(row).address); + } } else { @@ -377,14 +393,38 @@ void WatchWidget::OnItemChanged(QTableWidgetItem* item) } break; } + case COLUMN_INDEX_LOCK: + { + PowerPC::debug_interface.UpdateWatchLockedState(row, item->checkState() == Qt::Checked); + const auto& watch = PowerPC::debug_interface.GetWatch(row); + if (watch.locked) + LockWatchAddress(watch.address); + else + PowerPC::debug_interface.UnsetPatch(watch.address); + break; + } } Update(); } } +void WatchWidget::LockWatchAddress(u32 address) +{ + const std::string memory_data_as_string = PowerPC::HostGetString(address, 4); + + std::vector bytes; + for (const char c : memory_data_as_string) + { + bytes.push_back(static_cast(c)); + } + + PowerPC::debug_interface.SetFramePatch(address, bytes); +} + void WatchWidget::DeleteWatch(int row) { + PowerPC::debug_interface.UnsetPatch(PowerPC::debug_interface.GetWatch(row).address); PowerPC::debug_interface.RemoveWatch(row); Update(); } diff --git a/Source/Core/DolphinQt/Debugger/WatchWidget.h b/Source/Core/DolphinQt/Debugger/WatchWidget.h index 9fe53829dc..bf5bc5f209 100644 --- a/Source/Core/DolphinQt/Debugger/WatchWidget.h +++ b/Source/Core/DolphinQt/Debugger/WatchWidget.h @@ -46,6 +46,7 @@ private: void ShowContextMenu(); void OnItemChanged(QTableWidgetItem* item); + void LockWatchAddress(u32 address); void DeleteWatch(int row); void AddWatchBreakpoint(int row); void ShowInMemory(int row); @@ -61,11 +62,12 @@ private: bool m_updating = false; - static constexpr int NUM_COLUMNS = 6; + static constexpr int NUM_COLUMNS = 7; static constexpr int COLUMN_INDEX_LABEL = 0; static constexpr int COLUMN_INDEX_ADDRESS = 1; static constexpr int COLUMN_INDEX_HEX = 2; static constexpr int COLUMN_INDEX_DECIMAL = 3; static constexpr int COLUMN_INDEX_STRING = 4; static constexpr int COLUMN_INDEX_FLOAT = 5; + static constexpr int COLUMN_INDEX_LOCK = 6; };