diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2025-08-15 14:11:55 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2025-08-29 15:42:09 -0400 |
| commit | 112b1ed7e58e8cb14ecba18bba74fc3bde372431 (patch) | |
| tree | 247e54945ebac2c44e35d9e1e05399ddc17ddbac | |
| parent | 0cf8ae794f97626d4560a87165b30870a313a743 (diff) | |
Add a modal dialog option for cross references
| -rw-r--r-- | ui/xreflist.h | 26 | ||||
| -rw-r--r-- | ui/xrefstate.h | 13 |
2 files changed, 38 insertions, 1 deletions
diff --git a/ui/xreflist.h b/ui/xreflist.h index c144da71..60723797 100644 --- a/ui/xreflist.h +++ b/ui/xreflist.h @@ -15,6 +15,7 @@ #include <QtWidgets/QCheckBox> #include <QtWidgets/QFrame> #include <QtWidgets/QGridLayout> +#include <QtWidgets/QDialog> #include <vector> #include <deque> @@ -534,6 +535,7 @@ class BINARYNINJAUIAPI CrossReferenceContainer virtual QModelIndex nextIndex() = 0; virtual QModelIndex prevIndex() = 0; virtual QModelIndexList selectedRows() const = 0; + virtual void setSavedSelection(std::optional<int> idx) = 0; virtual bool hasSelection() const = 0; virtual void setNewSelection(std::vector<XrefItem>& refs, bool newRefTarget, const SelectionInfoForXref& ref, bool dependentRefsExceeded) = 0; @@ -574,6 +576,7 @@ public: virtual void keyPressEvent(QKeyEvent* e) override; virtual bool event(QEvent* event) override; virtual QModelIndexList selectedRows() const override { return selectionModel()->selectedRows(); } + virtual void setSavedSelection(std::optional<int> idx) override; virtual QModelIndex translateIndex(const QModelIndex& idx) const override { return m_model->mapToSource(idx); } virtual void updateFonts() override; virtual int leafCount() const override; @@ -617,6 +620,7 @@ class BINARYNINJAUIAPI CrossReferenceTable : public QTableView, public CrossRefe virtual QModelIndex prevIndex() override; virtual bool hasSelection() const override { return selectionModel()->selectedRows().size() != 0; } virtual QModelIndexList selectedRows() const override { return selectionModel()->selectedRows(); } + virtual void setSavedSelection(std::optional<int> idx) override; virtual bool getReference(const QModelIndex& idx, XrefItem** refPtr) const override; virtual void mouseMoveEvent(QMouseEvent* e) override; virtual void mousePressEvent(QMouseEvent* e) override; @@ -704,6 +708,8 @@ class BINARYNINJAUIAPI CrossReferenceWidget : public SidebarWidget, public UICon virtual bool selectFirstRow(); virtual bool hasSelection() const; virtual void goToReference(const QModelIndex& idx); + QModelIndexList selectedRows() const; + void setSavedSelection(std::optional<int> idx); virtual void restartHoverTimer(QMouseEvent* e); virtual void startHoverTimer(QMouseEvent* e); @@ -741,6 +747,9 @@ public Q_SLOTS: void selectionChanged(); void typeChanged(int index, bool checked); void directionChanged(int change, bool checked); + +Q_SIGNALS: + void navigatedToCrossReference(); }; /*! @@ -771,6 +780,23 @@ public: }; +class BINARYNINJAUIAPI CrossReferenceDialog : public QDialog +{ + Q_OBJECT + + CrossReferenceWidget* m_widget; + + static constexpr int MINIMUM_WIDTH = 720; + static constexpr int MINIMUM_HEIGHT = 480; + +public: + CrossReferenceDialog(UIContext* context, View* view, BinaryViewRef data, const SelectionInfoForXref& selection); + + void setSavedSelection(std::optional<int> idx); + std::optional<int> selection() const; +}; + + // https://github.com/CuriousCrow/QCheckboxCombo /*! QCheckboxCombo is a combobox widget that contains items with checkboxes. diff --git a/ui/xrefstate.h b/ui/xrefstate.h index e81be4a0..56b46881 100644 --- a/ui/xrefstate.h +++ b/ui/xrefstate.h @@ -1,14 +1,22 @@ #pragma once +#include <QtCore/QModelIndex> #include "binaryninjaapi.h" #include "uicontext.h" +#include "viewframe.h" class SplitPaneContainer; class SplitPaneWidget; class BINARYNINJAUIAPI CrossReferenceState { - std::map<SplitPaneContainer*, std::map<QString, SelectionInfoForXref>> m_curXref; + struct Selection + { + SelectionInfoForXref selectionInfo; + std::optional<int> previousDialogSelection; + }; + + std::map<SplitPaneContainer*, std::map<QString, Selection>> m_selections; SplitPaneContainer* m_currentContainer = nullptr; QString m_currentDataType; @@ -16,6 +24,7 @@ public: CrossReferenceState(); std::optional<SelectionInfoForXref> getCurrentSelection() const; + std::optional<int> getPreviousDialogSelection() const; void updateCrossReferences(ViewFrame* frame, const SelectionInfoForXref& selection); void beginNavigationForCrossReference(ViewFrame* frame, const SelectionInfoForXref& selection); @@ -25,6 +34,8 @@ public: void newPinnedTab(); void newPinnedPane(); + void modalDialog(); + void focusSidebar(); void bindActions(UIContext* context); }; |
