diff options
| author | Glenn Smith <couleeapps@gmail.com> | 2019-05-28 13:47:14 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2019-08-01 18:36:03 -0400 |
| commit | 087fdd83b85dd894d5b895557a378bb01828d0ff (patch) | |
| tree | 8f9846be65885fa97cf934aa2e7dbd22cf150765 /ui | |
| parent | 9bb1a15b800da0ac5b60c40e3b10321e4efc5a1b (diff) | |
Tags
Diffstat (limited to 'ui')
| -rw-r--r-- | ui/action.h | 12 | ||||
| -rw-r--r-- | ui/flowgraphwidget.h | 5 | ||||
| -rw-r--r-- | ui/linearview.h | 5 | ||||
| -rw-r--r-- | ui/taglist.h | 231 | ||||
| -rw-r--r-- | ui/tagtypelist.h | 142 | ||||
| -rw-r--r-- | ui/uitypes.h | 2 | ||||
| -rw-r--r-- | ui/viewframe.h | 5 |
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(); |
