summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2021-08-05 15:37:27 -0400
committerGlenn Smith <glenn@vector35.com>2021-08-09 16:13:30 -0400
commitb9dc0db6462d87833f9bb0fb6cef0f8049b2f74e (patch)
tree352402cd1f9a1e907eb2258570a931b391c7fee8
parent8944453db679cbd2606816648a19fbe21f9f6bb7 (diff)
Fancier tags list
-rw-r--r--ui/taglist.h87
-rw-r--r--ui/tagtypelist.h3
2 files changed, 56 insertions, 34 deletions
diff --git a/ui/taglist.h b/ui/taglist.h
index fb7ecce8..9331e0d9 100644
--- a/ui/taglist.h
+++ b/ui/taglist.h
@@ -2,7 +2,7 @@
#include <QtCore/QAbstractItemModel>
#include <QtCore/QItemSelectionModel>
-#include <QtWidgets/QTableView>
+#include <QtWidgets/QTreeView>
#include <QtWidgets/QTabWidget>
#include <QtWidgets/QStyledItemDelegate>
#include <QtWidgets/QDialog>
@@ -13,6 +13,19 @@
#include "tagtypelist.h"
+class BINARYNINJAUIAPI TagListItem
+{
+public:
+// explicit TagListItem(QVariant data, TagListItem* parent = nullptr);
+// ~TagListItem();
+
+protected:
+ TagListItem* m_parent;
+ std::vector<TagListItem*> m_children;
+ QVariant m_data;
+};
+
+
class BINARYNINJAUIAPI TagListModel: public QAbstractItemModel
{
Q_OBJECT
@@ -20,7 +33,9 @@ class BINARYNINJAUIAPI TagListModel: public QAbstractItemModel
protected:
QWidget* m_owner;
BinaryViewRef m_data;
- std::vector<BinaryNinja::TagReference> m_refs;
+ std::map<TagTypeRef, size_t> m_typeIndexes;
+ std::vector<std::pair<TagTypeRef, std::vector<BinaryNinja::TagReference>>> m_refs;
+ std::map<int, QSize> m_sectionSizeHints;
DisassemblySettingsRef m_settings;
private:
@@ -33,11 +48,21 @@ private:
QVariant GetDataColumn(const BinaryNinja::TagReference& ref) const;
QVariant GetPreviewColumn(const BinaryNinja::TagReference& ref) const;
+ QVariant GetIconColumn(const TagTypeRef& ref) const;
+ QVariant GetLocationColumn(const TagTypeRef& ref) const;
+ QVariant GetDataColumn(const TagTypeRef& ref) const;
+ QVariant GetPreviewColumn(const TagTypeRef& 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]; }
+ BinaryNinja::TagReference& GetRef(const QModelIndex& index);
+ const BinaryNinja::TagReference& GetRef(const QModelIndex& index) const;
+
+ void SetSectionSizeHints(const std::map<int, QSize>& sizes) { m_sectionSizeHints = sizes; }
+
+ TagTypeRef GetTypeRef(const QModelIndex& index);
+ const TagTypeRef GetTypeRef(const QModelIndex& index) const;
virtual QModelIndex index(int row, int col, const QModelIndex& parent) const override;
virtual QModelIndex parent(const QModelIndex& i) const override;
@@ -50,17 +75,7 @@ public:
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;
+ bool setModelData(const std::vector<std::pair<TagTypeRef, std::vector<BinaryNinja::TagReference>>>& refs, QItemSelectionModel* selectionModel, int sortColumn, Qt::SortOrder sortOrder, bool& selectionUpdated);
};
@@ -69,7 +84,7 @@ class BINARYNINJAUIAPI TagItemDelegate: public QStyledItemDelegate
Q_OBJECT
protected:
- QFont m_font, m_emojiFont;
+ QFont m_font, m_monospaceFont, m_emojiFont;
int m_baseline, m_charWidth, m_charHeight, m_charOffset;
void initFont();
@@ -85,21 +100,13 @@ public:
};
-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,
+class BINARYNINJAUIAPI TagList: public QTreeView,
public BinaryNinja::BinaryDataNotification, public FilterTarget
{
Q_OBJECT
ViewFrame* m_view;
+ class TagListWidget* m_listWidget;
TagListModel* m_list;
TagItemDelegate* m_itemDelegate;
BinaryViewRef m_data;
@@ -108,6 +115,7 @@ class BINARYNINJAUIAPI TagList: public QTableView,
ContextMenuManager* m_contextMenuManager;
FilteredView* m_filterView;
Menu* m_menu;
+ std::unordered_map<std::string, bool> m_expandedItems;
public:
typedef std::function<bool(const BinaryNinja::TagReference&)> FilterFn;
@@ -135,10 +143,6 @@ protected:
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 OnAnalysisFunctionUpdated(BinaryNinja::BinaryView* view, BinaryNinja::Function* func) override;
virtual void OnTagAdded(BinaryNinja::BinaryView*, const BinaryNinja::TagReference&) override;
@@ -154,6 +158,12 @@ private Q_SLOTS:
void updateTimerEvent();
void referenceActivated(const QModelIndex& idx);
+ void saveExpanded();
+ void restoreExpanded();
+
+public Q_SLOTS:
+ void showContextMenu();
+
public:
TagList(QWidget* parent, ViewFrame* view, BinaryViewRef data, TagListModel* model = nullptr, Menu* menu = nullptr);
virtual ~TagList();
@@ -173,6 +183,11 @@ public:
bool hasSelection();
void navigateToNext();
void navigateToPrev();
+
+ void scrollToFirstItem() override;
+ void scrollToCurrentItem() override;
+ void selectFirstItem() override;
+ void activateFirstItem() override;
};
@@ -183,11 +198,11 @@ class BINARYNINJAUIAPI TagListWidget: public SidebarWidget
ViewFrame* m_view;
QTabWidget* m_tabs;
- TagList* m_bookmarkList;
- FilteredView* m_bookmarkFilter;
-
TagList* m_notificationList;
FilteredView* m_notificationFilter;
+ QWidget* m_header;
+
+ FilterEdit* m_filterEdit;
TagTypeList* m_typeList;
@@ -198,16 +213,20 @@ protected:
virtual void notifyFontChanged() override;
private Q_SLOTS:
- void bookmarkListUpdate();
+ void showContextMenu();
+ void onTabChanged(int which);
public:
TagList* GetList();
void editTag(TagRef tag);
+ TagList* getNotificationList() { return m_notificationList; }
+ FilteredView* getNotificationFilter() { return m_notificationFilter; }
TagListWidget(ViewFrame* view, BinaryViewRef data);
virtual ~TagListWidget();
virtual void focus() override;
+ virtual QWidget* headerWidget() override { return m_header; }
};
diff --git a/ui/tagtypelist.h b/ui/tagtypelist.h
index 5b692715..43267c21 100644
--- a/ui/tagtypelist.h
+++ b/ui/tagtypelist.h
@@ -103,6 +103,9 @@ private Q_SLOTS:
void updateTimerEvent();
void needRepaint();
+public Q_SLOTS:
+ void showContextMenu();
+
public:
TagTypeList(QWidget* parent, ViewFrame* view, BinaryViewRef data, Menu* menu = nullptr);
virtual ~TagTypeList();