summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2019-05-14 14:44:44 -0400
committerBrian Potchik <brian@vector35.com>2019-05-14 14:44:44 -0400
commita8b00d8ea6c6e0b5c39c08ef28da4abf06610e09 (patch)
tree54150252056ae9e109b7d6b151cf1b51aa0aa4c4
parent62cf046e921ff8917ad542bc8f6974ed4ee63bd9 (diff)
Add dynamic dock widget support for UI plugins.
-rw-r--r--ui/dockhandler.h19
-rw-r--r--ui/viewframe.h12
2 files changed, 22 insertions, 9 deletions
diff --git a/ui/dockhandler.h b/ui/dockhandler.h
index eb64cfc2..e0b62c27 100644
--- a/ui/dockhandler.h
+++ b/ui/dockhandler.h
@@ -15,6 +15,7 @@ class Menu;
class View;
class ViewFrame;
+
struct BINARYNINJAUIAPI DockProperties
{
DockProperties() { };
@@ -37,6 +38,7 @@ struct BINARYNINJAUIAPI DockProperties
std::function<void()> actionOnShow;
};
+
struct DockSizePrefs
{
DockSizePrefs() { }
@@ -46,6 +48,7 @@ struct DockSizePrefs
bool nonUniformVisibility = false;
};
+
class BINARYNINJAUIAPI DockContextHandler
{
protected:
@@ -59,6 +62,7 @@ public:
DockContextHandler(QWidget* widget, const QString& name);
virtual ~DockContextHandler();
+ QString getName() { return m_name; }
QWidget* getParentWindow() { return m_parentWindow; }
virtual void notifyFontChanged() { }
@@ -70,6 +74,7 @@ public:
};
Q_DECLARE_INTERFACE(DockContextHandler, "binary.ninja.dockcontexthandler/1.0");
+
class BINARYNINJAUIAPI DockHandler: public QObject
{
Q_OBJECT
@@ -83,10 +88,13 @@ class BINARYNINJAUIAPI DockHandler: public QObject
bool m_shouldResizeDocks = false;
std::map<Qt::DockWidgetArea, bool> m_enableHiddenGroupSave;
- // TODO
+ uint64_t m_currentOffset = 0;
+
friend class DockContextHandler;
- std::map<QString, DockContextHandler*> m_dockContexts;
- DockContextHandler* getDockContextHandler(const QString&, QWidget* widget, bool viewSensitive = false);
+ std::map<QWidget*, DockContextHandler*> m_contexts;
+ std::map<QString, std::function<QWidget*(const QString&, ViewFrame*, BinaryViewRef)>> m_widgetFactories;
+ DockContextHandler* getDockContextHandler(QWidget* widget);
+ bool addDockWidget(const QString& name, QWidget* widget, Qt::DockWidgetArea area, Qt::Orientation orientation, bool defaultVisibility);
public:
explicit DockHandler(QObject* parent, int windowIndex);
@@ -96,7 +104,9 @@ public:
void reset(bool initial = false);
void reset(const QString& name);
void resizeDocksOnShow(bool resizeDocks) { m_resizeDocksRequest = resizeDocks; }
- bool addDockWidget(const QString& name, QWidget* primaryWidget, Qt::DockWidgetArea area = Qt::BottomDockWidgetArea, Qt::Orientation orientation = Qt::Horizontal, bool defaultVisibility = false);
+ bool addDockWidget(QWidget* widget, Qt::DockWidgetArea area = Qt::BottomDockWidgetArea, Qt::Orientation orientation = Qt::Horizontal, bool defaultVisibility = false);
+ bool addDockWidget(const QString& name, const std::function<QWidget*(const QString&, ViewFrame*, BinaryViewRef)>& createWidget, Qt::DockWidgetArea area = Qt::BottomDockWidgetArea, Qt::Orientation orientation = Qt::Horizontal, bool defaultVisibility = false);
+ void createDynamicWidgets(ViewFrame* frame, BinaryViewRef data, std::map<QString, QPointer<QWidget>>& store, std::vector<QString> filter, bool isExcludeFilter = true);
QDockWidget* getDockWidget(const QString& name);
ViewFrame* getViewFrame() { return m_viewFrame; }
bool isVisible(const QString& name);
@@ -122,4 +132,5 @@ public Q_SLOTS:
void viewChanged(ViewFrame* frame);
void visibilityChanged(bool visible);
void topLevelChanged(bool topLevel);
+ void removeWidget(QObject* object);
};
diff --git a/ui/viewframe.h b/ui/viewframe.h
index 8abb63fa..d08fa38e 100644
--- a/ui/viewframe.h
+++ b/ui/viewframe.h
@@ -10,6 +10,7 @@
#include <stack>
#include <utility>
#include <vector>
+#include "dockhandler.h"
#include "filecontext.h"
#include "viewtype.h"
#include "action.h"
@@ -79,8 +80,9 @@ public:
void setBinaryDataNavigable(bool navigable) { m_binaryDataNavigable = navigable; }
virtual bool closeRequest() { return true; }
- virtual void closing() {}
- virtual void updateFonts() {}
+ virtual void closing() { }
+ virtual void updateFonts() { }
+ virtual void updateTheme() { }
virtual void undo();
virtual void redo();
@@ -161,11 +163,12 @@ class BINARYNINJAUIAPI ViewFrame : public QWidget
Q_OBJECT
private:
- QWidget* createView(const QString& typeName, ViewType* type, BinaryViewRef data, bool createExtendedViews = true);
+ QWidget* createView(const QString& typeName, ViewType* type, BinaryViewRef data, bool createDynamicWidgets = true);
HistoryEntry* getHistoryEntry();
FileContext* m_context;
BinaryViewRef m_data;
+ DockHandler* m_docks;
QWidget* m_view;
QWidget* m_viewContainer;
QVBoxLayout* m_viewLayout;
@@ -187,7 +190,7 @@ protected:
void setView(QWidget* view);
public:
- explicit ViewFrame(QWidget* parent, FileContext* file, const QString& type, bool createExtendedViews = false);
+ explicit ViewFrame(QWidget* parent, FileContext* file, const QString& type, bool createDynamicWidgets = false);
virtual ~ViewFrame();
FileContext* getFileContext() const { return m_context; }
@@ -227,7 +230,6 @@ public:
void closing();
void updateFonts();
- void updateOffset(uint64_t offset);
void updateTheme();
void addHistoryEntry();
void back();