summaryrefslogtreecommitdiff
path: root/ui/mergevariablesdialog.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2022-07-07 21:03:29 -0400
committerRusty Wagner <rusty.wagner@gmail.com>2022-08-10 15:17:53 -0400
commit390d5d27d4de6b7c9cb06b957a483bb2ab69f241 (patch)
tree556133db637166968a77d68daf7ff2160df79b40 /ui/mergevariablesdialog.h
parent4037000b6cb8a184ad098d0eff397518d7fe55b9 (diff)
Merge variables API/UI, variable liveness API for determining soundness of variable merges
Diffstat (limited to 'ui/mergevariablesdialog.h')
-rw-r--r--ui/mergevariablesdialog.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/ui/mergevariablesdialog.h b/ui/mergevariablesdialog.h
new file mode 100644
index 00000000..b4c81c06
--- /dev/null
+++ b/ui/mergevariablesdialog.h
@@ -0,0 +1,76 @@
+#pragma once
+
+#include <QtWidgets/QDialog>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QListWidget>
+#include <QtWidgets/QListWidgetItem>
+#include <QtWidgets/QStyledItemDelegate>
+
+#include <string>
+#include "binaryninjaapi.h"
+#include "uicontext.h"
+#include "render.h"
+
+class BINARYNINJAUIAPI MergeVariableHeader : public QWidget
+{
+ std::vector<BinaryNinja::InstructionTextToken> m_tokens;
+ RenderContext m_renderContext;
+ int m_length;
+
+protected:
+ void paintEvent(QPaintEvent* event) override;
+ QSize sizeHint() const override;
+
+public:
+ MergeVariableHeader(const std::vector<BinaryNinja::InstructionTextToken>& tokens, QWidget* parent = nullptr);
+};
+
+class BINARYNINJAUIAPI MergeVariableListItem : public QListWidgetItem
+{
+ QWidget* m_owner;
+ FunctionRef m_func;
+ BinaryNinja::Variable m_var;
+ std::string m_name;
+ BinaryNinja::Confidence<BinaryNinja::Ref<BinaryNinja::Type>> m_type;
+ bool m_grayed;
+
+public:
+ MergeVariableListItem(QWidget* parent, BinaryNinja::Function* func, const BinaryNinja::Variable& var,
+ const std::string& name, BinaryNinja::Confidence<BinaryNinja::Ref<BinaryNinja::Type>> type,
+ const QString& warnings, bool grayed);
+ const BinaryNinja::Variable& variable() const { return m_var; }
+ virtual QVariant data(int role) const override;
+
+ static std::vector<BinaryNinja::InstructionTextToken> tokensForVariable(BinaryNinja::Function* func,
+ const BinaryNinja::Variable& var, BinaryNinja::Confidence<BinaryNinja::Ref<BinaryNinja::Type>> type,
+ const std::string& name);
+};
+
+class BINARYNINJAUIAPI MergeVariableItemDelegate : public QStyledItemDelegate
+{
+ Q_OBJECT
+
+ QWidget* m_parent;
+ QFont m_font;
+ int m_baseline, m_charWidth, m_charHeight, m_charOffset;
+
+public:
+ MergeVariableItemDelegate(QWidget* parent);
+
+ void updateFonts();
+ virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& idx) const override;
+ virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& idx) const override;
+};
+
+class BINARYNINJAUIAPI MergeVariablesDialog : public QDialog
+{
+ Q_OBJECT
+ QListWidget* m_list;
+ std::set<BinaryNinja::Variable> m_existingVariables;
+
+public:
+ MergeVariablesDialog(QWidget* parent, FunctionRef func, BinaryNinja::Variable target);
+
+ std::set<BinaryNinja::Variable> mergedVariables();
+ std::set<BinaryNinja::Variable> unmergedVariables();
+};