From 411acbaa4a1d217e731d3df0b189445117be3b26 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 19 Mar 2019 15:41:08 -0400 Subject: Add in progress UI API headers --- ui/disassemblyview.h | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 ui/disassemblyview.h (limited to 'ui/disassemblyview.h') diff --git a/ui/disassemblyview.h b/ui/disassemblyview.h new file mode 100644 index 00000000..477081fb --- /dev/null +++ b/ui/disassemblyview.h @@ -0,0 +1,179 @@ +#pragma once + +#include +#include +#include +#include +#include +#include "binaryninjaapi.h" +#include "viewframe.h" +#include "instructionedit.h" +#include "render.h" +#include "progressindicator.h" +#include "commentdialog.h" +#include "menus.h" +#include "statusbarwidget.h" +#include "flowgraphwidget.h" + +#define FUNCTION_UPDATE_CHECK_INTERVAL 100 + +class BINARYNINJAUIAPI DisassemblyHistoryEntry: public FlowGraphHistoryEntry +{ + BNFunctionGraphType m_graphType; + +public: + BNFunctionGraphType getGraphType() const { return m_graphType; } + void setGraphType(BNFunctionGraphType type) { m_graphType = type; } +}; + +class DisassemblyContainer; + +class BINARYNINJAUIAPI DisassemblyView: public FlowGraphWidget +{ + Q_OBJECT + +friend class DisassemblyFunctionHeader; + +public: + explicit DisassemblyView(DisassemblyContainer* parent, BinaryViewRef data, FunctionRef func = nullptr, + bool navToAddr = false, uint64_t addr = 0); + + virtual bool navigate(uint64_t pos) override; + virtual bool navigateToFunction(FunctionRef func, uint64_t pos) override; + + virtual HistoryEntry* getHistoryEntry() override; + virtual void navigateToHistoryEntry(HistoryEntry* entry) override; + + virtual StatusBarWidget* getStatusBarWidget() override; + + void setGraphType(BNFunctionGraphType type); + void setOption(BNDisassemblyOption option, bool state = true); + void toggleOption(BNDisassemblyOption option); + + DisassemblySettingsRef getSettings(); + + virtual void onFunctionSelected(FunctionRef func) override; + virtual void onHighlightChanged(const HighlightTokenState& highlight) override; + + static void registerActions(); + +private: + class DisassemblyViewOptionsWidget: public QLabel + { + public: + DisassemblyViewOptionsWidget(DisassemblyView* parent); + + protected: + virtual void mousePressEvent(QMouseEvent* event); + virtual void enterEvent(QEvent* event); + virtual void leaveEvent(QEvent* event); + + private: + DisassemblyView* m_view; + Menu m_menu; + ContextMenuManager m_contextMenuManager; + }; + + class DisassemblyViewStatusBarWidget: public StatusBarWidget + { + public: + DisassemblyViewStatusBarWidget(DisassemblyView* parent); + virtual void updateStatus() override; + + private: + DisassemblyView* m_view; + DisassemblyViewOptionsWidget* m_options; + }; + + void bindActions(); + + BNFunctionGraphType m_graphType; + std::set m_options; + DisassemblyContainer* m_container; + +private Q_SLOTS: + void viewInHexEditor(); + void viewInLinearDisassembly(); +}; + + +class BINARYNINJAUIAPI DisassemblyFunctionHeader: public QWidget +{ + Q_OBJECT + + DisassemblyContainer* m_container; + + BinaryViewRef m_data; + FunctionRef m_func; + + QProgressIndicator* m_updateIndicator; + QTimer* m_updateTimer; + + RenderContext m_render; + std::vector m_lines; + size_t m_width; + HighlightTokenState m_highlight; + + void adjustSize(int width, int height); + +private Q_SLOTS: + void updateTimerEvent(); + +protected: + virtual void paintEvent(QPaintEvent* event) override; + virtual void resizeEvent(QResizeEvent* event) override; + + virtual void mousePressEvent(QMouseEvent* event) override; + virtual void mouseDoubleClickEvent(QMouseEvent* event) override; + +public: + DisassemblyFunctionHeader(DisassemblyContainer* parent, BinaryViewRef data); + + void updateFonts(); + void setCurrentFunction(FunctionRef func); + void setHighlightToken(const HighlightTokenState& state); + + virtual QSize sizeHint() const override; +}; + +class BINARYNINJAUIAPI DisassemblyContainer: public QWidget, public ViewContainer +{ + Q_OBJECT + + ViewFrame* m_viewFrame; + DisassemblyView* m_view; + DisassemblyFunctionHeader* m_funcHeader; + QWidget* m_analysisWarning; + QLabel* m_analysisWarningText; + +public: + explicit DisassemblyContainer(QWidget* parent, BinaryViewRef data, ViewFrame* view, FunctionRef func = nullptr, + bool navToAddr = false, uint64_t addr = 0); + virtual View* getView() override { return m_view; } + ViewFrame* getViewFrame() { return m_viewFrame; } + + DisassemblyView* getDisassembly() const { return m_view; } + DisassemblyFunctionHeader* getFunctionHeader() const { return m_funcHeader; } + + void updateFonts(); + void refreshHeader(FunctionRef func); + void setCurrentFunction(FunctionRef func); + void setHeaderHighlightToken(const HighlightTokenState& state); + +protected: + virtual void focusInEvent(QFocusEvent* event) override; + +private Q_SLOTS: + void linkActivatedEvent(const QString& link); +}; + +class DisassemblyViewType: public ViewType +{ + static DisassemblyViewType* m_instance; + +public: + DisassemblyViewType(); + virtual int getPriority(BinaryViewRef data, const QString& filename); + virtual QWidget* create(BinaryViewRef data, ViewFrame* viewFrame); + static void init(); +}; -- cgit v1.3.1