From 08c5286c19fd78fa9d3b9f469a639c7a1013f22e Mon Sep 17 00:00:00 2001 From: Josh Ferrell Date: Thu, 9 May 2024 22:53:01 -0400 Subject: History widget --- ui/historyview.h | 92 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 19 deletions(-) (limited to 'ui/historyview.h') 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 #include #include -#include +#include -class BINARYNINJAUIAPI HistorySidebarWidget : public SidebarWidget, public FilterTarget +enum class HistoryOption +{ + ShowDates, +}; + + +class BINARYNINJAUIAPI HistoryEntryItemModel : public QAbstractItemModel, public BinaryNinja::BinaryDataNotification, public UIContextNotification +{ + std::vector m_undoEntries; + std::vector m_redoEntries; + + FileMetadataRef m_file; + BinaryViewRef m_data; + std::unordered_set 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 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 progress); public: HistorySidebarWidget(BinaryViewRef data); - + ~HistorySidebarWidget(); void notifyFontChanged() override; QWidget* headerWidget() override { return m_header; } }; -- cgit v1.3.1