diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-03-19 15:41:08 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-03-20 13:00:17 -0400 |
| commit | 411acbaa4a1d217e731d3df0b189445117be3b26 (patch) | |
| tree | 49b5c5290058ffb98dd23ec9a7c1a49921254d15 /ui/disassemblyview.h | |
| parent | ca1bc587c22928bbd7198813064c9615c3c12771 (diff) | |
Add in progress UI API headers
Diffstat (limited to 'ui/disassemblyview.h')
| -rw-r--r-- | ui/disassemblyview.h | 179 |
1 files changed, 179 insertions, 0 deletions
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 <QtWidgets/QAbstractScrollArea> +#include <QtCore/QPointer> +#include <QtWidgets/QSplitter> +#include <QtWidgets/QLabel> +#include <mutex> +#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<BNDisassemblyOption> 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<BinaryNinja::DisassemblyTextLine> 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(); +}; |
