diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2022-07-07 21:03:29 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2022-08-10 15:17:53 -0400 |
| commit | 390d5d27d4de6b7c9cb06b957a483bb2ab69f241 (patch) | |
| tree | 556133db637166968a77d68daf7ff2160df79b40 /ui/mergevariablesdialog.h | |
| parent | 4037000b6cb8a184ad098d0eff397518d7fe55b9 (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.h | 76 |
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(); +}; |
