From c80262b75947c7a408483482f445b812a4611478 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Thu, 16 Feb 2023 14:44:53 -0500 Subject: LogView: keep a local cache of bv valid ranges to avoid taking a lock in the core while painting --- ui/logview.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ui/logview.h b/ui/logview.h index 19251df7..62926c3c 100644 --- a/ui/logview.h +++ b/ui/logview.h @@ -88,7 +88,7 @@ class BINARYNINJAUIAPI LogListFilterProxyModel : public QSortFilterProxyModel \ingroup logview */ -class BINARYNINJAUIAPI LogListModel : public QAbstractItemModel, public BinaryNinja::LogListener +class BINARYNINJAUIAPI LogListModel : public QAbstractItemModel, BinaryNinja::LogListener { Q_OBJECT @@ -156,7 +156,7 @@ class BINARYNINJAUIAPI LogListModel : public QAbstractItemModel, public BinaryNi \ingroup logview */ -class BINARYNINJAUIAPI LogItemDelegate : public QStyledItemDelegate +class BINARYNINJAUIAPI LogItemDelegate : public QStyledItemDelegate, public BinaryNinja::BinaryDataNotification { Q_OBJECT @@ -164,11 +164,14 @@ class BINARYNINJAUIAPI LogItemDelegate : public QStyledItemDelegate ViewFrame* m_viewFrame = nullptr; View* m_view = nullptr; BinaryViewRef m_data; - + std::vector> m_validRanges; QFont m_font; int m_height; - bool IsNavigable(const QString& str, const std::pair& offsetLen, uint64_t& value, bool highlight) const; + bool isNavigable(const QString& str, const std::pair& offsetLen, uint64_t& value, bool highlight) const; + void cacheValidRanges(); + bool isAddressValid(uint64_t addr) const; + public: LogItemDelegate(QWidget* parent); @@ -176,7 +179,9 @@ class BINARYNINJAUIAPI LogItemDelegate : public QStyledItemDelegate 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 OnSegmentAdded(BinaryNinja::BinaryView*, BinaryNinja::Segment*) override { cacheValidRanges(); } + virtual void OnSegmentRemoved(BinaryNinja::BinaryView*, BinaryNinja::Segment*) override { cacheValidRanges(); } + virtual void OnSegmentUpdated(BinaryNinja::BinaryView*, BinaryNinja::Segment*) override { cacheValidRanges(); } protected: bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) override; -- cgit v1.3.1