diff --git a/pcsx2-qt/Debugger/MemorySearchWidget.cpp b/pcsx2-qt/Debugger/MemorySearchWidget.cpp index 7ebdcce089..f62442b69b 100644 --- a/pcsx2-qt/Debugger/MemorySearchWidget.cpp +++ b/pcsx2-qt/Debugger/MemorySearchWidget.cpp @@ -40,6 +40,7 @@ MemorySearchWidget::MemorySearchWidget(QWidget* parent) connect(m_ui.listSearchResults->verticalScrollBar(), &QScrollBar::valueChanged, this, &MemorySearchWidget::onSearchResultsListScroll); connect(m_ui.listSearchResults, &QListView::customContextMenuRequested, this, &MemorySearchWidget::onListSearchResultsContextMenu); connect(m_ui.cmbSearchType, &QComboBox::currentIndexChanged, this, &MemorySearchWidget::onSearchTypeChanged); + connect(m_ui.cmbSearchComparison, &QComboBox::currentIndexChanged, this, &MemorySearchWidget::onSearchComparisonChanged); // Ensures we don't retrigger the load results function unintentionally m_resultsLoadTimer.setInterval(100); @@ -249,7 +250,6 @@ bool handleSearchComparison(SearchComparison searchComparison, u32 searchAddress } case SearchComparison::IncreasedBy: { - const T priorValue = priorResult->getValue(); const T expectedIncrease = searchValue + priorValue; return memoryValueComparator(SearchComparison::Equals, readValue, expectedIncrease); @@ -282,6 +282,10 @@ bool handleSearchComparison(SearchComparison searchComparison, u32 searchAddress const T expectedDecrease = priorValue - searchValue; return memoryValueComparator(SearchComparison::Equals, readValue, expectedIncrease) || memoryValueComparator(SearchComparison::Equals, readValue, expectedDecrease); } + case SearchComparison::UnknownValue: + { + return true; + } default: Console.Error("Debugger: Unknown type when doing memory search!"); return false; @@ -506,63 +510,66 @@ void MemorySearchWidget::onSearchButtonClicked() const bool isFilterSearch = sender() == m_ui.btnFilterSearch; unsigned long long value; - switch (searchType) + if(searchComparison != SearchComparison::UnknownValue) { - case SearchType::ByteType: - case SearchType::Int16Type: - case SearchType::Int32Type: - case SearchType::Int64Type: - value = searchValue.toULongLong(&ok, searchHex ? 16 : 10); - break; - case SearchType::FloatType: - case SearchType::DoubleType: - searchValue.toDouble(&ok); - break; - case SearchType::StringType: - ok = !searchValue.isEmpty(); - break; - case SearchType::ArrayType: - ok = !searchValue.trimmed().isEmpty(); - break; - } - - if (!ok) - { - QMessageBox::critical(this, tr("Debugger"), tr("Invalid search value")); - return; - } - - switch (searchType) - { - case SearchType::ArrayType: - case SearchType::StringType: - case SearchType::DoubleType: - case SearchType::FloatType: - break; - case SearchType::Int64Type: - if (value <= std::numeric_limits::max()) + switch (searchType) + { + case SearchType::ByteType: + case SearchType::Int16Type: + case SearchType::Int32Type: + case SearchType::Int64Type: + value = searchValue.toULongLong(&ok, searchHex ? 16 : 10); break; - case SearchType::Int32Type: - if (value <= std::numeric_limits::max()) + case SearchType::FloatType: + case SearchType::DoubleType: + searchValue.toDouble(&ok); break; - case SearchType::Int16Type: - if (value <= std::numeric_limits::max()) + case SearchType::StringType: + ok = !searchValue.isEmpty(); break; - case SearchType::ByteType: - if (value <= std::numeric_limits::max()) + case SearchType::ArrayType: + ok = !searchValue.trimmed().isEmpty(); break; - default: - QMessageBox::critical(this, tr("Debugger"), tr("Value is larger than type")); + } + + if (!ok) + { + QMessageBox::critical(this, tr("Debugger"), tr("Invalid search value")); return; - } - - if (!isFilterSearch && (searchComparison == SearchComparison::Changed || searchComparison == SearchComparison::ChangedBy - || searchComparison == SearchComparison::Decreased || searchComparison == SearchComparison::DecreasedBy - || searchComparison == SearchComparison::Increased || searchComparison == SearchComparison::IncreasedBy - || searchComparison == SearchComparison::NotChanged)) - { - QMessageBox::critical(this, tr("Debugger"), tr("This search comparison can only be used with filter searches.")); - return; + } + + switch (searchType) + { + case SearchType::ArrayType: + case SearchType::StringType: + case SearchType::DoubleType: + case SearchType::FloatType: + break; + case SearchType::Int64Type: + if (value <= std::numeric_limits::max()) + break; + case SearchType::Int32Type: + if (value <= std::numeric_limits::max()) + break; + case SearchType::Int16Type: + if (value <= std::numeric_limits::max()) + break; + case SearchType::ByteType: + if (value <= std::numeric_limits::max()) + break; + default: + QMessageBox::critical(this, tr("Debugger"), tr("Value is larger than type")); + return; + } + + if (!isFilterSearch && (searchComparison == SearchComparison::Changed || searchComparison == SearchComparison::ChangedBy + || searchComparison == SearchComparison::Decreased || searchComparison == SearchComparison::DecreasedBy + || searchComparison == SearchComparison::Increased || searchComparison == SearchComparison::IncreasedBy + || searchComparison == SearchComparison::NotChanged)) + { + QMessageBox::critical(this, tr("Debugger"), tr("This search comparison can only be used with filter searches.")); + return; + } } QFutureWatcher>* workerWatcher = new QFutureWatcher>(); @@ -654,6 +661,11 @@ void MemorySearchWidget::onSearchTypeChanged(int newIndex) updateSearchComparisonSelections(); } +void MemorySearchWidget::onSearchComparisonChanged(int newValue) +{ + m_ui.txtSearchValue->setEnabled(getCurrentSearchComparison() != SearchComparison::UnknownValue); +} + void MemorySearchWidget::updateSearchComparisonSelections() { const QString selectedComparisonLabel = m_ui.cmbSearchComparison->currentText(); @@ -704,5 +716,11 @@ std::vector MemorySearchWidget::getValidSearchComparisonsForSt comparisons.push_back(SearchComparison::ChangedBy); comparisons.push_back(SearchComparison::NotChanged); } + + if(!hasResults) + { + comparisons.push_back(SearchComparison::UnknownValue); + } + return comparisons; } diff --git a/pcsx2-qt/Debugger/MemorySearchWidget.h b/pcsx2-qt/Debugger/MemorySearchWidget.h index aa4c779b67..e29dd9034e 100644 --- a/pcsx2-qt/Debugger/MemorySearchWidget.h +++ b/pcsx2-qt/Debugger/MemorySearchWidget.h @@ -48,6 +48,7 @@ public: Changed, ChangedBy, NotChanged, + UnknownValue, Invalid }; @@ -69,6 +70,7 @@ public: insert(SearchComparison::Changed, tr("Changed")); insert(SearchComparison::ChangedBy, tr("Changed By")); insert(SearchComparison::NotChanged, tr("Not Changed")); + insert(SearchComparison::UnknownValue, tr("Unknown Initial Value")); insert(SearchComparison::Invalid, ""); } SearchComparison labelToEnum(QString comparisonLabel) @@ -120,6 +122,7 @@ public slots: void onSearchButtonClicked(); void onSearchResultsListScroll(u32 value); void onSearchTypeChanged(int newIndex); + void onSearchComparisonChanged(int newIndex); void loadSearchResults(); void contextSearchResultGoToDisassembly(); void contextRemoveSearchResult(); diff --git a/pcsx2-qt/Debugger/MemorySearchWidget.ui b/pcsx2-qt/Debugger/MemorySearchWidget.ui index 8e397067bf..67bb963436 100644 --- a/pcsx2-qt/Debugger/MemorySearchWidget.ui +++ b/pcsx2-qt/Debugger/MemorySearchWidget.ui @@ -148,6 +148,11 @@ Less Than Or Equal + + + Unknown Initial Value + +