diff options
| author | Mason Reed <mason@vector35.com> | 2025-03-10 11:05:40 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-04-02 05:36:54 -0400 |
| commit | 25cc02431b61097b2adfc2fbc493b648b0300c3b (patch) | |
| tree | a79d9c4f4f67234d3bf9bda413e8608f479a4cc8 /view/sharedcache/ui/dsctriage.h | |
| parent | fa85bf28502286c4821427c5d0ed91a7ed46f8f6 (diff) | |
[SharedCache] Refactor Shared Cache
In absence of a better name, this commit refactors the shared cache code.
Diffstat (limited to 'view/sharedcache/ui/dsctriage.h')
| -rw-r--r-- | view/sharedcache/ui/dsctriage.h | 188 |
1 files changed, 17 insertions, 171 deletions
diff --git a/view/sharedcache/ui/dsctriage.h b/view/sharedcache/ui/dsctriage.h index 39f06ce7..8c4ceb3f 100644 --- a/view/sharedcache/ui/dsctriage.h +++ b/view/sharedcache/ui/dsctriage.h @@ -2,118 +2,32 @@ // Created by kat on 8/15/24. // -#include <sharedcacheapi.h> #include <binaryninjaapi.h> +#include <QStyledItemDelegate> + #include "uitypes.h" #include "viewframe.h" #include "animation.h" #include "uicontext.h" -#include <QTableView> -#include <QStandardItemModel> -#include <QSortFilterProxyModel> -#include <QHeaderView> #include "filter.h" +#include "symboltable.h" #ifndef BINARYNINJA_DSCTRIAGE_H #define BINARYNINJA_DSCTRIAGE_H - -class DSCCacheBlocksView : public QWidget -{ - Q_OBJECT - - BinaryViewRef m_data; - Ref<SharedCacheAPI::SharedCache> m_cache; - - uint64_t m_backingCacheCount = 0; - std::vector<SharedCacheAPI::BackingCache> m_backingCaches; - - std::atomic<BNDSCViewLoadProgress> m_currentProgress; - std::vector<uint64_t> m_blockSizeRatios; - std::vector<uint64_t> m_targetBlockSizeForAnimation; - uint64_t m_averageBlockSizeForAnimationInterp = 0; - std::vector<uint64_t> m_blockLuminance; - Animation* m_blockWaveAnimation; - Animation* m_blockExpandAnimation; - Animation* m_blockAutoselectAnimation; - - int m_selectedBlock = -1; - - int getBlockIndexAtPosition(const QPoint& clickPosition); - - void blockSelected(int index); - -public: - DSCCacheBlocksView(QWidget* parent, BinaryViewRef data, Ref<SharedCacheAPI::SharedCache> cache); - virtual ~DSCCacheBlocksView() override; - -protected: - void mousePressEvent(QMouseEvent* event) override; - void mouseReleaseEvent(QMouseEvent* event) override; - void mouseDoubleClickEvent(QMouseEvent* event) override; - void mouseMoveEvent(QMouseEvent* event) override; - void keyPressEvent(QKeyEvent* event) override; - void keyReleaseEvent(QKeyEvent* event) override; - void focusInEvent(QFocusEvent* event) override; - void focusOutEvent(QFocusEvent* event) override; - void enterEvent(QEnterEvent* event) override; - void leaveEvent(QEvent* event) override; - void paintEvent(QPaintEvent* event) override; - void resizeEvent(QResizeEvent* event) override; - -public: - QSize sizeHint() const override; - QSize minimumSizeHint() const override; - -signals: - void loadDone(); - void selectionChanged(const SharedCacheAPI::BackingCache& index, bool automatic); -}; - - -class CollapsibleSection : public QWidget -{ - Q_OBJECT - - QLabel* m_titleLabel; - QLabel* m_subtitleRightLabel; - QPushButton* m_collapseButton; - - bool m_collapsed = true; - - Animation* m_onContentAddedAnimation; - - QWidget* m_contentWidgetContainer; - QWidget* m_contentWidget; - -protected: - QSize sizeHint() const override; - -public: - CollapsibleSection(QWidget* parent); - void setTitle(const QString& title); - void setSubtitleRight(const QString& subtitle); - - void setContentWidget(QWidget* contentWidget); - - void setCollapsed(bool collapsed, bool animated = true); - bool isCollapsed() const { return m_collapsed; } -}; - - class FilterableTableView : public QTableView, public FilterTarget { Q_OBJECT bool m_filterByHiding; public: - FilterableTableView(QWidget* parent = nullptr, bool filterByHiding = true) + explicit FilterableTableView(QWidget* parent = nullptr, bool filterByHiding = true) : QTableView(parent), m_filterByHiding(filterByHiding) { viewport()->installEventFilter(this); } - ~FilterableTableView() override {} + ~FilterableTableView() override = default; void setFilter(const std::string& filter) override { if (!m_filterByHiding) @@ -183,102 +97,34 @@ signals: void filterTextChanged(const QString& text); }; -class SymbolTableView; - -class SymbolTableModel : public QAbstractTableModel { - Q_OBJECT - - SymbolTableView* m_parent; - std::string m_filter; - std::vector<SharedCacheAPI::DSCSymbol> m_symbols; - -public: - explicit SymbolTableModel(SymbolTableView* parent); - - int rowCount(const QModelIndex& parent = QModelIndex()) const override; - int columnCount(const QModelIndex& parent = QModelIndex()) const override; - QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; - - void updateSymbols(); - - void setFilter(std::string text); - - const SharedCacheAPI::DSCSymbol& symbolAt(int row) const; -}; - - -class SymbolTableView : public QTableView, public FilterTarget -{ - Q_OBJECT - friend class SymbolTableModel; - - std::vector<SharedCacheAPI::DSCSymbol> m_symbols; - - SymbolTableModel* m_model; - -public: - SymbolTableView(QWidget* parent, Ref<SharedCacheAPI::SharedCache> cache); - virtual ~SymbolTableView() override; - - void scrollToFirstItem() override { - if (model()->rowCount() > 0) { - scrollTo(model()->index(0, 0)); - } - } - - void scrollToCurrentItem() override { - QModelIndex currentIndex = selectionModel()->currentIndex(); - if (currentIndex.isValid()) { - scrollTo(currentIndex); - } - } - - void selectFirstItem() override { - if (model()->rowCount() > 0) { - QModelIndex firstIndex = model()->index(0, 0); - selectionModel()->select(firstIndex, QItemSelectionModel::ClearAndSelect); - } - } - - void activateFirstItem() override { - if (model()->rowCount() > 0) { - QModelIndex firstIndex = model()->index(0, 0); - setCurrentIndex(firstIndex); - emit activated(firstIndex); - } - } - - SharedCacheAPI::DSCSymbol getSymbolAtRow(int row) const - { - return m_model->symbolAt(row); - } - - void setFilter(const std::string& filter) override; -}; - - -class DSCTriageView : public QWidget, public View +class DSCTriageView : public QWidget, public View, public UIContextNotification { BinaryViewRef m_data; QVBoxLayout* m_layout; - Ref<SharedCacheAPI::SharedCache> m_cache; SplitTabWidget* m_triageTabs; DockableTabCollection* m_triageCollection; - SplitTabWidget* m_bottomRegionTabs; - DockableTabCollection* m_bottomRegionCollection; + QStandardItemModel* m_imageModel; + + SymbolTableView* m_symbolTable; - std::vector<SharedCacheAPI::SharedCacheMachOHeader> m_headers; + QStandardItemModel* m_mappingModel; + + QStandardItemModel* m_regionModel; public: DSCTriageView(QWidget* parent, BinaryViewRef data); + ~DSCTriageView() override; BinaryViewRef getData() override; void setSelectionOffsets(BNAddressRange range) override {}; QFont getFont() override; bool navigate(uint64_t offset) override; uint64_t getCurrentOffset() override; + + void OnAfterOpenFile(UIContext* context, FileContext* file, ViewFrame* frame) override; + void RefreshData(); + void setImageLoaded(uint64_t imageHeaderAddr); }; |
