diff options
| author | Josh Ferrell <josh@vector35.com> | 2024-05-09 22:53:01 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2024-05-14 15:11:16 -0400 |
| commit | 08c5286c19fd78fa9d3b9f469a639c7a1013f22e (patch) | |
| tree | 9f8c4dca8a387431d3c9b2209bcdf88f8dfc832a /ui | |
| parent | cb407be11b08c1c427fcf33a49974155e522e14a (diff) | |
History widget
Diffstat (limited to 'ui')
| -rw-r--r-- | ui/historyview.h | 92 | ||||
| -rw-r--r-- | ui/notificationsdispatcher.h | 7 | ||||
| -rw-r--r-- | ui/render.h | 10 |
3 files changed, 84 insertions, 25 deletions
diff --git a/ui/historyview.h b/ui/historyview.h index 06f6561d..4f747fa3 100644 --- a/ui/historyview.h +++ b/ui/historyview.h @@ -1,44 +1,98 @@ #pragma once -#include "filter.h" +#include "render.h" #include "sidebarwidget.h" +#include <qlistview.h> #include <qsortfilterproxymodel.h> #include <qstandarditemmodel.h> -#include <qtreeview.h> +#include <qstyleditemdelegate.h> -class BINARYNINJAUIAPI HistorySidebarWidget : public SidebarWidget, public FilterTarget +enum class HistoryOption +{ + ShowDates, +}; + + +class BINARYNINJAUIAPI HistoryEntryItemModel : public QAbstractItemModel, public BinaryNinja::BinaryDataNotification, public UIContextNotification +{ + std::vector<UndoEntryRef> m_undoEntries; + std::vector<UndoEntryRef> m_redoEntries; + + FileMetadataRef m_file; + BinaryViewRef m_data; + std::unordered_set<HistoryOption> m_options; + QSettings m_settings; + + UndoEntryRef entryForRow(int row) const; + + QString getSettingKeyForOption(HistoryOption option) const; + + virtual void OnUndoEntryAdded(BinaryNinja::BinaryView* data, BinaryNinja::UndoEntry* entry) override; + virtual void OnUndoEntryTaken(BinaryNinja::BinaryView* data, BinaryNinja::UndoEntry* entry) override; + virtual void OnRedoEntryTaken(BinaryNinja::BinaryView* data, BinaryNinja::UndoEntry* entry) override; + + virtual void OnAfterSaveFile(UIContext* context, FileContext* file, ViewFrame* frame) override; + + void hardReload(); + + public: + HistoryEntryItemModel(QWidget* parent, BinaryViewRef data); + ~HistoryEntryItemModel(); + + virtual QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; + virtual QModelIndex parent(const QModelIndex& child) const override; + + virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override; + virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override; + + virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; + void toggleOption(HistoryOption option); + bool isOptionSet(HistoryOption option); +}; + + +class BINARYNINJAUIAPI HistoryEntryItemDelegate : public QStyledItemDelegate { Q_OBJECT - QTreeView* m_tree; - QStandardItemModel* m_model; - QSortFilterProxyModel* m_proxyModel; + + QFont m_font; + int m_baseline, m_charWidth, m_charHeight, m_charOffset; + + RenderContext m_render; + + public: + HistoryEntryItemDelegate(QWidget* parent = nullptr); + + void updateFonts(); + + virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; +}; + + +class BINARYNINJAUIAPI HistorySidebarWidget : public SidebarWidget +{ + Q_OBJECT + QListView* m_entryList; + HistoryEntryItemModel* m_model; + HistoryEntryItemDelegate* m_itemDelegate; QWidget* m_header; - FilteredView* m_libFilter; BinaryViewRef m_data; - ContextMenuManager* m_contextMenuManager; - Menu m_contextMenu; bool m_updating = false; - - std::unordered_map<std::string, QPersistentModelIndex> m_idIndices; - - virtual void scrollToFirstItem() override; - virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; - virtual void setFilter(const std::string& filter) override; + bool m_atBottom = true; virtual void contextMenuEvent(QContextMenuEvent*) override; void itemDoubleClicked(const QModelIndex& index); + void scrollBarValueChanged(int value); void scrollBarRangeChanged(int min, int max); - void populateTree(); + void resetToSelectedEntry(std::function<bool(size_t, size_t)> progress); public: HistorySidebarWidget(BinaryViewRef data); - + ~HistorySidebarWidget(); void notifyFontChanged() override; QWidget* headerWidget() override { return m_header; } }; diff --git a/ui/notificationsdispatcher.h b/ui/notificationsdispatcher.h index a65e2dac..f3b3a7bd 100644 --- a/ui/notificationsdispatcher.h +++ b/ui/notificationsdispatcher.h @@ -127,7 +127,7 @@ private: std::unique_ptr<SymbolInfo> m_symbolInfo; std::variant<std::monostate, BinaryDataChangeInfo, FunctionRef, BinaryNinja::DataVariable, TagTypeRef, BinaryNinja::TagReference, StringInfo, TypeChangeInfo, SegmentRef, SectionRef, ComponentInfo, - ExternalLibraryRef, ExternalLocationRef, TypeArchiveInfo, TypeArchiveRef> m_object; + ExternalLibraryRef, ExternalLocationRef, TypeArchiveInfo, TypeArchiveRef, UndoEntryRef> m_object; public: NotificationEvent(NotificationType source): m_source(source) { } @@ -146,6 +146,7 @@ public: NotificationEvent(NotificationType source, BinaryNinja::ExternalLocation* location): m_source(source), m_object(location) { } NotificationEvent(NotificationType source, TypeArchiveInfo&& typeArchiveInfo): m_source(source), m_object(std::move(typeArchiveInfo)) { } NotificationEvent(NotificationType source, BinaryNinja::TypeArchive* archive): m_source(source), m_object(archive) { } + NotificationEvent(NotificationType source, BinaryNinja::UndoEntry* entry): m_source(source), m_object(entry) { } void cacheSymbolInfo(); SymbolInfo* getSymbolInfo() const { return m_symbolInfo.get(); } @@ -297,6 +298,10 @@ public: void OnTypeArchiveDetached(BinaryNinja::BinaryView* data, const std::string& id, const std::string& path) override; void OnTypeArchiveConnected(BinaryNinja::BinaryView* data, BinaryNinja::TypeArchive* archive) override; void OnTypeArchiveDisconnected(BinaryNinja::BinaryView* data, BinaryNinja::TypeArchive* archive) override; + + void OnUndoEntryAdded(BinaryNinja::BinaryView* data, BinaryNinja::UndoEntry* entry) override; + void OnUndoEntryTaken(BinaryNinja::BinaryView* data, BinaryNinja::UndoEntry* entry) override; + void OnRedoEntryTaken(BinaryNinja::BinaryView* data, BinaryNinja::UndoEntry* entry) override; }; diff --git a/ui/render.h b/ui/render.h index 8dc0d158..39393e4c 100644 --- a/ui/render.h +++ b/ui/render.h @@ -112,7 +112,7 @@ class BINARYNINJAUIAPI RenderContext size_t tokenIndex, const std::vector<BinaryNinja::InstructionTextToken>& tokens); HighlightTokenState getHighlightTokenForTextToken(const BinaryNinja::InstructionTextToken& token); - void drawText(QPainter& p, int x, int y, QColor color, const QString& text); + void drawText(QPainter& p, int x, int y, QColor color, const QString& text) const; void drawUnderlinedText(QPainter& p, int x, int y, QColor color, const QString& text); void drawSeparatorLine(QPainter& p, QColor top, QColor bottom, QColor line, const QRect& rect); @@ -120,14 +120,14 @@ class BINARYNINJAUIAPI RenderContext void drawLinearDisassemblyLineBackground( QPainter& p, BNLinearDisassemblyLineType type, const QRect& rect, const QRect& dirtyRect, int gutterWidth); - void drawDisassemblyLine(QPainter& p, int left, int top, + int drawDisassemblyLine(QPainter& p, int left, int top, const std::vector<BinaryNinja::InstructionTextToken>& tokens, HighlightTokenState& highlight, - bool highlightOnly = false); + bool highlightOnly = false) const; void drawHexEditorLine(QPainter& p, int left, int top, const HexEditorHighlightState& highlight, BinaryViewRef view, uint64_t lineStartAddr, size_t cols, size_t firstCol, size_t count, bool cursorVisible, bool cursorAscii, size_t cursorPos, bool byteCursor); - QFont getFont() { return m_fontParams.getFont(); } - QFont getEmojiFont() { return m_fontParams.getEmojiFont(); } + QFont getFont() const { return m_fontParams.getFont(); } + QFont getEmojiFont() const { return m_fontParams.getEmojiFont(); } void setFont(const QFont& font); }; |
