#ifndef SECTIONSWIDGET_H #define SECTIONSWIDGET_H #include #include #include #include #include #include #include #include #include "core/Cutter.h" #include "CutterDockWidget.h" class CutterTreeView; class QAbstractItemView; class MainWindow; class SectionsWidget; class AbstractAddrDock; class AddrDockScene; class QGraphicsSceneMouseEvent; class RawAddrDock; class VirtualAddrDock; class QuickFilterView; class QGraphicsView; class QGraphicsRectItem; class SectionsModel : public QAbstractListModel { Q_OBJECT friend SectionsWidget; private: QList *sections; public: enum Column { NameColumn = 0, SizeColumn, AddressColumn, EndAddressColumn, PermissionsColumn, EntropyColumn, ColumnCount }; enum Role { SectionDescriptionRole = Qt::UserRole }; SectionsModel(QList *sections, QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; }; class SectionsProxyModel : public QSortFilterProxyModel { Q_OBJECT public: SectionsProxyModel(SectionsModel *sourceModel, QObject *parent = nullptr); protected: bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; }; class SectionsWidget : public CutterDockWidget { Q_OBJECT public: explicit SectionsWidget(MainWindow *main, QAction *action = nullptr); ~SectionsWidget(); private slots: void refreshSections(); void refreshDocks(); void onSectionsDoubleClicked(const QModelIndex &index); protected: void resizeEvent(QResizeEvent *event) override; private: QList sections; SectionsModel *sectionsModel; SectionsProxyModel *proxyModel; CutterTreeView *sectionsTable; MainWindow *main; QWidget *dockWidgetContents; QuickFilterView *quickFilterView; QWidget *addrDockWidget; RawAddrDock *rawAddrDock; VirtualAddrDock *virtualAddrDock; QToolButton *toggleButton; /** * RefreshDeferrer for loading the section data */ RefreshDeferrer *sectionsRefreshDeferrer; /** * RefreshDeferrer for updating the visualization docks */ RefreshDeferrer *dockRefreshDeferrer; void initSectionsTable(); void initQuickFilter(); void initConnects(); void initAddrMapDocks(); void drawIndicatorOnAddrDocks(); void updateToggle(); }; class AbstractAddrDock : public QDockWidget { Q_OBJECT friend SectionsWidget; public: explicit AbstractAddrDock(SectionsModel *model, QWidget *parent = nullptr); ~AbstractAddrDock(); virtual void updateDock(); protected: int indicatorHeight; int indicatorParamPosY; float heightThreshold; float heightDivisor; int rectOffset; int rectWidthMin; int rectWidthMax; QColor indicatorColor; QColor textColor; AddrDockScene *addrDockScene; QGraphicsView *graphicsView; SectionsProxyModel *proxyModel; void addTextItem(QColor color, QPoint pos, QString string); int getAdjustedSize(int size, int validMinSize); int getRectWidth(); int getIndicatorWidth(); int getValidMinSize(); virtual RVA getSizeOfSection(const SectionDescription §ion) =0; virtual RVA getAddressOfSection(const SectionDescription §ion) =0; private: void drawIndicator(QString name, float ratio); }; class AddrDockScene : public QGraphicsScene { Q_OBJECT public: explicit AddrDockScene(QWidget *parent = nullptr); ~AddrDockScene(); bool disableCenterOn; QHash nameAddrMap; QHash nameAddrSizeMap; QHash seekAddrMap; QHash seekAddrSizeMap; QHash namePosYMap; QHash nameHeightMap; protected: void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; private: RVA getAddrFromPos(int posY, bool seek); }; class RawAddrDock : public AbstractAddrDock { Q_OBJECT public: explicit RawAddrDock(SectionsModel *model, QWidget *parent = nullptr); ~RawAddrDock() = default; void updateDock() override; protected: RVA getSizeOfSection(const SectionDescription §ion) override { return section.size; }; RVA getAddressOfSection(const SectionDescription §ion) override { return section.paddr; }; }; class VirtualAddrDock : public AbstractAddrDock { Q_OBJECT public: explicit VirtualAddrDock(SectionsModel *model, QWidget *parent = nullptr); ~VirtualAddrDock() = default; void updateDock() override; protected: RVA getSizeOfSection(const SectionDescription §ion) override { return section.vsize; }; RVA getAddressOfSection(const SectionDescription §ion) override { return section.vaddr; }; }; #endif // SECTIONSWIDGET_H