summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorGlenn Smith <couleeapps@gmail.com>2019-05-28 13:47:14 -0400
committerGlenn Smith <glenn@vector35.com>2019-08-01 18:36:03 -0400
commit087fdd83b85dd894d5b895557a378bb01828d0ff (patch)
tree8f9846be65885fa97cf934aa2e7dbd22cf150765 /ui
parent9bb1a15b800da0ac5b60c40e3b10321e4efc5a1b (diff)
Tags
Diffstat (limited to 'ui')
-rw-r--r--ui/action.h12
-rw-r--r--ui/flowgraphwidget.h5
-rw-r--r--ui/linearview.h5
-rw-r--r--ui/taglist.h231
-rw-r--r--ui/tagtypelist.h142
-rw-r--r--ui/uitypes.h2
-rw-r--r--ui/viewframe.h5
7 files changed, 402 insertions, 0 deletions
diff --git a/ui/action.h b/ui/action.h
index 7770a016..8559e887 100644
--- a/ui/action.h
+++ b/ui/action.h
@@ -81,6 +81,7 @@ struct BINARYNINJAUIAPI UIAction
static void registerPluginCommandActions();
static void registerPluginCommandActions(const QString& prefix);
static void registerHighlightColorActions(const QString& prefix);
+ static void registerBookmarkActions(const QString& prefix);
static void setActionDisplayName(const QString& registeredName, const QString& displayName);
static void setActionDisplayName(const QString& registeredName, const std::function<QString()>& displayNameFunc);
@@ -139,6 +140,14 @@ struct BINARYNINJAUIAPI UIHighlightColorAction
UIHighlightColorAction(const UIHighlightColorAction& other);
};
+struct BINARYNINJAUIAPI UIBookmarkAction
+{
+ std::function<void (const UIActionContext& context, int index)> activate;
+ std::function<bool (const UIActionContext& context, int index)> isValid;
+
+ UIBookmarkAction(const std::function<void (const UIActionContext& context, int index)>& activate, const std::function<bool (const UIActionContext& context, int index)>& isValid);
+};
+
enum ActionPriority
{
LowActionPriority,
@@ -203,6 +212,9 @@ public:
void bindHighlightColorActions(const QString& prefix, const UIHighlightColorAction& action);
void unbindHighlightColorActions(const QString& prefix);
+ void bindBookmarkActions(const QString& prefix, const UIBookmarkAction& action);
+ void unbindBookmarkActions(const QString& prefix);
+
void setActionDisplayName(const QString& registeredName, const QString& displayName);
void setActionDisplayName(const QString& registeredName, const std::function<QString()>& displayNameFunc);
void setActionDisplayName(const QString& registeredName, const std::function<QString(const UIActionContext&)>& displayNameFunc);
diff --git a/ui/flowgraphwidget.h b/ui/flowgraphwidget.h
index a519ed97..3ec61019 100644
--- a/ui/flowgraphwidget.h
+++ b/ui/flowgraphwidget.h
@@ -288,6 +288,11 @@ private Q_SLOTS:
void functionComment();
void commentAccepted();
void functionCommentAccepted();
+ void bookmarkAddress();
+ void unbookmarkAddress();
+ void tagAddress();
+ void tagAddressAccepted(TagTypeRef tt);
+ void manageAddressTags();
void convertToNop();
void alwaysBranch();
diff --git a/ui/linearview.h b/ui/linearview.h
index 85586ca8..486b2326 100644
--- a/ui/linearview.h
+++ b/ui/linearview.h
@@ -142,6 +142,11 @@ private Q_SLOTS:
void comment();
void commentAccepted();
void addUserXref();
+ void bookmarkAddress();
+ void unbookmarkAddress();
+ void tagAddress();
+ void tagAddressAccepted(TagTypeRef tt);
+ void manageAddressTags();
void convertToNop();
void alwaysBranch();
diff --git a/ui/taglist.h b/ui/taglist.h
new file mode 100644
index 00000000..c2a5bd8a
--- /dev/null
+++ b/ui/taglist.h
@@ -0,0 +1,231 @@
+#pragma once
+
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QItemSelectionModel>
+#include <QtWidgets/QTableView>
+#include <QtWidgets/QTabWidget>
+#include <QtWidgets/QStyledItemDelegate>
+#include <QtWidgets/QDialog>
+#include "binaryninjaapi.h"
+#include "dockhandler.h"
+#include "viewframe.h"
+#include "filter.h"
+#include "tagtypelist.h"
+
+
+class BINARYNINJAUIAPI TagListModel: public QAbstractItemModel
+{
+ Q_OBJECT
+
+protected:
+ QWidget* m_owner;
+ BinaryViewRef m_data;
+ std::vector<BinaryNinja::TagReference> m_refs;
+ DisassemblySettingsRef m_settings;
+
+private:
+ void AddDisassemblyTokens(QList<QVariant>& line, std::vector<BinaryNinja::InstructionTextToken> tokens) const;
+
+ void TrimLeadingWhitespace(QList<QVariant>& line) const;
+
+ QVariant GetIconColumn(const BinaryNinja::TagReference& ref) const;
+ QVariant GetLocationColumn(const BinaryNinja::TagReference& ref) const;
+ QVariant GetDataColumn(const BinaryNinja::TagReference& ref) const;
+ QVariant GetPreviewColumn(const BinaryNinja::TagReference& ref) const;
+
+public:
+ TagListModel(QWidget* parent, BinaryViewRef data);
+
+ BinaryNinja::TagReference& GetRef(int index) { return m_refs[index]; }
+ const BinaryNinja::TagReference& GetRef(int index) const { return m_refs[index]; }
+
+ virtual QModelIndex index(int row, int col, const QModelIndex& parent) const override;
+ virtual QModelIndex parent(const QModelIndex& i) const override;
+ virtual bool hasChildren(const QModelIndex& parent) const override;
+ virtual int rowCount(const QModelIndex& parent) const override;
+ virtual int columnCount(const QModelIndex& parent) const override;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
+ virtual QVariant data(const QModelIndex& i, int role) const override;
+ virtual bool setData(const QModelIndex& i, const QVariant& value, int role = Qt::EditRole) override;
+ virtual Qt::ItemFlags flags(const QModelIndex& i) const override;
+ virtual void sort(int column, Qt::SortOrder order) override;
+
+ bool setModelData(const std::vector<BinaryNinja::TagReference>& refs, QItemSelectionModel* selectionModel, int sortColumn, Qt::SortOrder sortOrder, bool& selectionUpdated);
+};
+
+
+class BINARYNINJAUIAPI BookmarkListModel: public TagListModel
+{
+public:
+ BookmarkListModel(QWidget* parent, BinaryViewRef data);
+
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
+ virtual void sort(int column, Qt::SortOrder order) override;
+};
+
+
+class BINARYNINJAUIAPI TagItemDelegate: public QStyledItemDelegate
+{
+ Q_OBJECT
+
+protected:
+ QFont m_font;
+ int m_baseline, m_charWidth, m_charHeight, m_charOffset;
+
+ void initFont();
+
+public:
+ TagItemDelegate(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;
+ virtual void setEditorData(QWidget* editor, const QModelIndex& index) const override;
+};
+
+
+class BINARYNINJAUIAPI BookmarkListItemDelegate: public TagItemDelegate
+{
+public:
+ BookmarkListItemDelegate(QWidget* parent);
+
+ virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& idx) const override;
+};
+
+
+class BINARYNINJAUIAPI TagList: public QTableView,
+ public BinaryNinja::BinaryDataNotification, public FilterTarget
+{
+ Q_OBJECT
+
+ ViewFrame* m_view;
+ TagListModel* m_list;
+ TagItemDelegate* m_itemDelegate;
+ BinaryViewRef m_data;
+ UIActionHandler* m_handler;
+ UIActionHandler m_actionHandler;
+ ContextMenuManager* m_contextMenuManager;
+ FilteredView* m_filterView;
+ Menu* m_menu;
+
+public:
+ typedef std::function<bool(const BinaryNinja::TagReference&)> FilterFn;
+
+private:
+ bool m_hasFilter;
+ FilterFn m_filter;
+ std::string m_searchFilter;
+
+ QTimer* m_hoverTimer;
+ QTimer* m_updateTimer;
+ QPoint m_hoverPos;
+
+ uint64_t m_curRefTarget = 0;
+ bool m_needsUpdate;
+ bool m_navToNextOrPrevStarted = false;
+
+protected:
+ virtual void contextMenuEvent(QContextMenuEvent* event) override;
+ virtual void keyPressEvent(QKeyEvent* e) override;
+ virtual void mouseMoveEvent(QMouseEvent* e) override;
+ virtual void mousePressEvent(QMouseEvent* e) override;
+ virtual void wheelEvent(QWheelEvent* e) override;
+ virtual void resizeEvent(QResizeEvent *event) override;
+ void goToReference(const QModelIndex& idx);
+
+ void setFilter(const std::string& filter) override;
+ void scrollToFirstItem() override;
+ void scrollToCurrentItem() override;
+ void selectFirstItem() override;
+ void activateFirstItem() override;
+
+ virtual void OnDataMetadataUpdated(BinaryNinja::BinaryView*, uint64_t) override;
+
+private Q_SLOTS:
+ void hoverTimerEvent();
+ void updateTimerEvent();
+ void referenceActivated(const QModelIndex& idx);
+
+public:
+ TagList(QWidget* parent, ViewFrame* view, BinaryViewRef data, TagListModel* model = nullptr, Menu* menu = nullptr);
+ virtual ~TagList();
+
+ static void registerActions();
+ virtual void setModel(QAbstractItemModel* model) override;
+
+ void notifyFontChanged();
+ void removeSelection();
+
+ void clearFilter();
+ void setFilter(FilterFn filter);
+ void setFilterView(FilteredView* filterView) { m_filterView = filterView; }
+
+ void updateTags();
+
+ bool hasSelection();
+ void navigateToNext();
+ void navigateToPrev();
+};
+
+
+class BINARYNINJAUIAPI TagListWidget: public QWidget, public DockContextHandler
+{
+ Q_OBJECT
+ Q_INTERFACES(DockContextHandler)
+
+ ViewFrame* m_view;
+ QTabWidget* m_tabs;
+
+ TagList* m_bookmarkList;
+ FilteredView* m_bookmarkFilter;
+
+ TagList* m_notificationList;
+ FilteredView* m_notificationFilter;
+
+ TagTypeList* m_typeList;
+
+ BinaryViewRef m_data;
+ UIActionHandler* m_handler;
+
+protected:
+ virtual void notifyFontChanged() override;
+
+private Q_SLOTS:
+ void bookmarkListUpdate();
+
+public:
+ TagList* GetList();
+ void editTag(TagRef tag);
+
+ TagListWidget(QWidget* parent, ViewFrame* view, BinaryViewRef data);
+ virtual ~TagListWidget();
+};
+
+
+class BINARYNINJAUIAPI TagListDialog: public QDialog
+{
+ Q_OBJECT
+
+public:
+ typedef std::function<void(const TagRef&)> AddFn;
+
+private:
+ BinaryViewRef m_data;
+ TagList* m_list;
+ FilteredView* m_filter;
+
+ AddFn m_addFn;
+
+ QPushButton* m_removeButton;
+
+public:
+ TagListDialog(QWidget* parent, ViewFrame* frame, BinaryViewRef data, AddFn addFn);
+ void setFilter(TagList::FilterFn filter);
+
+private Q_SLOTS:
+ void updateActive(const QItemSelection&, const QItemSelection&);
+ void createTag();
+ void createTagAccept(TagTypeRef tt);
+ void removeTag();
+};
diff --git a/ui/tagtypelist.h b/ui/tagtypelist.h
new file mode 100644
index 00000000..cc7015a9
--- /dev/null
+++ b/ui/tagtypelist.h
@@ -0,0 +1,142 @@
+#pragma once
+
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QItemSelectionModel>
+#include <QtWidgets/QTableView>
+#include <QtWidgets/QItemDelegate>
+#include <QtWidgets/QDialog>
+#include <QtWidgets/QComboBox>
+#include "binaryninjaapi.h"
+#include "dockhandler.h"
+#include "viewframe.h"
+
+
+class BINARYNINJAUIAPI TagTypeListModel: public QAbstractItemModel
+{
+ Q_OBJECT
+
+ QWidget* m_owner;
+ BinaryViewRef m_data;
+ std::vector<TagTypeRef> m_refs;
+
+public:
+ TagTypeListModel(QWidget* parent, BinaryViewRef data);
+
+ TagTypeRef& GetRef(int index) { return m_refs[index]; }
+ const TagTypeRef& GetRef(int index) const { return m_refs[index]; }
+
+ virtual QModelIndex index(int row, int col, const QModelIndex& parent) const override;
+ virtual QModelIndex parent(const QModelIndex& i) const override;
+ virtual bool hasChildren(const QModelIndex& parent) const override;
+ virtual int rowCount(const QModelIndex& parent) const override;
+ virtual int columnCount(const QModelIndex& parent) const override;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
+ virtual QVariant data(const QModelIndex& i, int role) const override;
+ virtual bool setData(const QModelIndex& i, const QVariant& value, int role = Qt::EditRole) override;
+ virtual void sort(int column, Qt::SortOrder order) override;
+ virtual Qt::ItemFlags flags(const QModelIndex& i) const override;
+
+ bool setModelData(const std::vector<TagTypeRef>& refs, QItemSelectionModel* selectionModel, int sortColumn, Qt::SortOrder sortOrder, bool& selectionUpdated);
+};
+
+
+class BINARYNINJAUIAPI TagTypeItemDelegate: public QItemDelegate
+{
+ Q_OBJECT
+
+ QFont m_font;
+ int m_baseline, m_charWidth, m_charHeight, m_charOffset;
+
+ void initFont();
+
+public:
+ TagTypeItemDelegate(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;
+ virtual void setEditorData(QWidget* editor, const QModelIndex& index) const override;
+ virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override;
+};
+
+
+class BINARYNINJAUIAPI TagTypeList: public QTableView, public DockContextHandler, public BinaryNinja::BinaryDataNotification
+{
+ Q_OBJECT
+ Q_INTERFACES(DockContextHandler)
+
+ ViewFrame* m_view;
+ TagTypeListModel* m_list;
+ TagTypeItemDelegate* m_itemDelegate;
+ BinaryViewRef m_data;
+ UIActionHandler* m_handler;
+ UIActionHandler m_actionHandler;
+ ContextMenuManager* m_contextMenuManager;
+ Menu* m_menu;
+
+ QTimer* m_updateTimer;
+ bool m_needsUpdate;
+
+protected:
+ virtual void contextMenuEvent(QContextMenuEvent* event) override;
+
+ virtual void OnDataMetadataUpdated(BinaryNinja::BinaryView*, uint64_t) override;
+
+private:
+ void createTagType();
+ void removeTagType();
+
+private Q_SLOTS:
+ void updateTimerEvent();
+
+public:
+ TagTypeList(QWidget* parent, ViewFrame* view, BinaryViewRef data, Menu* menu = nullptr);
+ virtual ~TagTypeList();
+ virtual void notifyFontChanged() override;
+
+ static void registerActions();
+
+ void updateData();
+ bool hasSelection();
+};
+
+class BINARYNINJAUIAPI TagTypeDialogModel: public QAbstractItemModel
+{
+ Q_OBJECT
+
+ QWidget* m_owner;
+ BinaryViewRef m_data;
+ std::vector<TagTypeRef> m_refs;
+
+public:
+ TagTypeDialogModel(QWidget* parent, BinaryViewRef data);
+
+ TagTypeRef& GetRef(int index) { return m_refs[index]; }
+ const TagTypeRef& GetRef(int index) const { return m_refs[index]; }
+
+ virtual QModelIndex index(int row, int col, const QModelIndex& parent) const override;
+ virtual QModelIndex parent(const QModelIndex& i) const override;
+ virtual bool hasChildren(const QModelIndex& parent) const override;
+ virtual int rowCount(const QModelIndex& parent) const override;
+ virtual int columnCount(const QModelIndex& parent) const override;
+ virtual QVariant data(const QModelIndex& i, int role) const override;
+};
+
+class BINARYNINJAUIAPI TagTypeSelectDialog: public QDialog
+{
+ Q_OBJECT
+
+ BinaryViewRef m_data;
+ TagTypeDialogModel* m_model;
+ QComboBox* m_tagTypeList;
+
+private Q_SLOTS:
+ void select();
+
+public:
+ TagTypeSelectDialog(QWidget* parent, BinaryViewRef data);
+
+Q_SIGNALS:
+ void selected(TagTypeRef tagType);
+};
diff --git a/ui/uitypes.h b/ui/uitypes.h
index 557063f3..9859cdb2 100644
--- a/ui/uitypes.h
+++ b/ui/uitypes.h
@@ -55,6 +55,8 @@ typedef BinaryNinja::Ref<BinaryNinja::Section> SectionRef;
typedef BinaryNinja::Ref<BinaryNinja::Segment> SegmentRef;
typedef BinaryNinja::Ref<BinaryNinja::Structure> StructureRef;
typedef BinaryNinja::Ref<BinaryNinja::Symbol> SymbolRef;
+typedef BinaryNinja::Ref<BinaryNinja::Tag> TagRef;
+typedef BinaryNinja::Ref<BinaryNinja::TagType> TagTypeRef;
typedef BinaryNinja::Ref<BinaryNinja::TemporaryFile> TemporaryFileRef;
typedef BinaryNinja::Ref<BinaryNinja::Transform> TransformRef;
typedef BinaryNinja::Ref<BinaryNinja::Type> TypeRef;
diff --git a/ui/viewframe.h b/ui/viewframe.h
index 0a73ad89..fefc72d2 100644
--- a/ui/viewframe.h
+++ b/ui/viewframe.h
@@ -246,6 +246,11 @@ public:
void nextCrossReference();
void prevCrossReference();
+ void showTags();
+ void editTag(TagRef tag);
+ void nextTag();
+ void prevTag();
+
virtual UIActionContext actionContext();
void bindActions();
static void registerActions();