summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2025-08-15 14:11:55 -0400
committerRusty Wagner <rusty.wagner@gmail.com>2025-08-29 15:42:09 -0400
commit112b1ed7e58e8cb14ecba18bba74fc3bde372431 (patch)
tree247e54945ebac2c44e35d9e1e05399ddc17ddbac
parent0cf8ae794f97626d4560a87165b30870a313a743 (diff)
Add a modal dialog option for cross references
-rw-r--r--ui/xreflist.h26
-rw-r--r--ui/xrefstate.h13
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);
};