diff options
| author | Mason Reed <mason@vector35.com> | 2025-10-12 22:46:54 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-10-12 22:50:20 -0400 |
| commit | 40f7d40e394657575001a8146d8233f1fc4356fd (patch) | |
| tree | a1dfac7f90bbd284119d0a3e10e205fe2e0303c1 /plugins/warp/ui/shared/function.cpp | |
| parent | 49558b88ed5dacaac0bdf1946291bc37a4a88cb9 (diff) | |
[WARP] Improve UX surrounding removal of matched functions
- Adds Python API to remove matched function
- Adds command + UI actions to remove matched function
- Adds command + UI actions to ignore function in subsequent matches
Diffstat (limited to 'plugins/warp/ui/shared/function.cpp')
| -rw-r--r-- | plugins/warp/ui/shared/function.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/plugins/warp/ui/shared/function.cpp b/plugins/warp/ui/shared/function.cpp index e177c285..06d4cbcf 100644 --- a/plugins/warp/ui/shared/function.cpp +++ b/plugins/warp/ui/shared/function.cpp @@ -70,6 +70,15 @@ void WarpFunctionItemModel::InsertFunction(uint64_t address, WarpFunctionItem* i m_insertableFunctionRows[address] = rowCount() - 1; } +void WarpFunctionItemModel::RemoveFunction(uint64_t address) +{ + const auto iter = m_insertableFunctionRows.find(address); + if (iter == m_insertableFunctionRows.end()) + return; + removeRow(iter->second); + m_insertableFunctionRows.erase(iter); +} + WarpFunctionItem* WarpFunctionItemModel::GetItem(const QModelIndex& index) const { if (!index.isValid()) @@ -173,7 +182,7 @@ WarpFunctionTableWidget::WarpFunctionTableWidget(QWidget* parent) : QWidget(pare m_table->setSelectionBehavior(QAbstractItemView::SelectRows); m_table->setSelectionMode(QAbstractItemView::SingleSelection); m_table->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_table->setFocusPolicy(Qt::NoFocus); + m_table->setFocusPolicy(Qt::FocusPolicy::StrongFocus); m_table->setShowGrid(false); m_table->setAlternatingRowColors(false); m_table->setSortingEnabled(true); @@ -219,6 +228,15 @@ WarpFunctionTableWidget::WarpFunctionTableWidget(QWidget* parent) : QWidget(pare if (!item || !item->GetFunction()) return; + for (QAction* action : m_contextMenu->actions()) + { + bool enabled = true; + auto iter = m_contextMenuIsValid.find(action->text()); + if (iter != m_contextMenuIsValid.end()) + enabled = iter->second(item, m_model->GetAddress(sourceIndex)); + action->setEnabled(enabled); + } + // Execute the menu and get the selected action const QAction* selectedAction = m_contextMenu->exec(m_table->viewport()->mapToGlobal(pos)); if (!selectedAction) @@ -238,6 +256,16 @@ void WarpFunctionTableWidget::RegisterContextMenuAction( m_contextMenuActions[name] = callback; } +void WarpFunctionTableWidget::RegisterContextMenuAction( + const QString& name, + const std::function<void(WarpFunctionItem*, std::optional<uint64_t>)>& callback, + const std::function<bool(WarpFunctionItem*, std::optional<uint64_t>)>& isValid) +{ + // Reuse existing registration then add optional validator + RegisterContextMenuAction(name, callback); + m_contextMenuIsValid[name] = isValid; +} + void WarpFunctionTableWidget::SetFunctions(QVector<WarpFunctionItem*> functions) { // Clear matches as they are no longer valid. @@ -266,6 +294,11 @@ void WarpFunctionTableWidget::InsertFunction(uint64_t address, WarpFunctionItem* m_model->InsertFunction(address, function); } +void WarpFunctionTableWidget::RemoveFunction(uint64_t address) +{ + m_model->RemoveFunction(address); +} + void WarpFunctionTableWidget::setFilter(const std::string& filter) { m_proxyModel->setFilterFixedString(QString::fromStdString(filter)); |
