forked from Vector35/binaryninja-api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdockhandler.h
178 lines (151 loc) · 5.44 KB
/
dockhandler.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#pragma once
#include <QtCore/QObject>
#include <QtCore/QSettings>
#include <QtWidgets/QDockWidget>
#include <map>
#include "binaryninjaapi.h"
#include "action.h"
#include "viewframe.h"
#include "uitypes.h"
class ContextMenuManager;
class DockHandler;
class Menu;
/*!
\defgroup dockhandler DockHandler
\ingroup uiapi
*/
/*!
\ingroup dockhandler
*/
struct BINARYNINJAUIAPI DockProperties
{
DockProperties() {};
DockProperties(QDockWidget* dw, bool vis, Qt::DockWidgetArea dar, Qt::Orientation dor, bool dvis, bool vs) :
dockWidget(dw), visibleState(vis), defaultArea(dar), defaultOrientation(dor), defaultVisibility(dvis),
viewSensitive(vs), neverBeenVisible(true), sizeStash(0, 0), actionOnShow(nullptr)
{}
DockProperties(const DockProperties& dp) :
dockWidget(dp.dockWidget), visibleState(dp.visibleState), defaultArea(dp.defaultArea),
defaultOrientation(dp.defaultOrientation), defaultVisibility(dp.defaultVisibility),
viewSensitive(dp.viewSensitive), neverBeenVisible(dp.neverBeenVisible), sizeStash(dp.sizeStash),
actionOnShow(dp.actionOnShow)
{}
DockProperties& operator=(const DockProperties& dp)
{
dockWidget = dp.dockWidget;
visibleState = dp.visibleState;
defaultArea = dp.defaultArea;
defaultOrientation = dp.defaultOrientation;
defaultVisibility = dp.defaultVisibility;
viewSensitive = dp.viewSensitive;
neverBeenVisible = dp.neverBeenVisible;
sizeStash = dp.sizeStash;
actionOnShow = dp.actionOnShow;
return *this;
}
QDockWidget* dockWidget;
bool visibleState;
Qt::DockWidgetArea defaultArea;
Qt::Orientation defaultOrientation;
bool defaultVisibility;
bool viewSensitive;
bool neverBeenVisible;
QSize sizeStash;
std::function<void()> actionOnShow;
};
/*!
\ingroup dockhandler
*/
struct DockSizePrefs
{
DockSizePrefs() {}
QList<QDockWidget*> docks;
QList<int> hDockSizes;
QList<int> vDockSizes;
bool nonUniformVisibility = false;
};
/*!
\ingroup dockhandler
*/
class BINARYNINJAUIAPI DockContextHandler
{
protected:
QString m_name;
UIActionHandler m_actionHandler;
ContextMenuManager* m_contextMenuManager = nullptr;
Menu* m_menu = nullptr;
QWidget* m_parentWindow;
public:
DockContextHandler(QWidget* widget, const QString& name);
virtual ~DockContextHandler();
QString getName() const { return m_name; }
QWidget* getParentWindow() const { return m_parentWindow; }
virtual void notifyFontChanged() {}
virtual void notifyOffsetChanged(uint64_t /*offset*/) {}
virtual void notifyThemeChanged() {}
virtual void notifyViewChanged(ViewFrame* /*frame*/) {}
virtual void notifyViewLocationChanged(View* /*view*/, const ViewLocation& /*viewLocation*/) {}
virtual void notifyVisibilityChanged(bool /*visible*/) {}
virtual bool shouldBeVisible(ViewFrame* /*frame*/) { return true; }
};
Q_DECLARE_INTERFACE(DockContextHandler, "binary.ninja.dockcontexthandler/1.0");
/*!
\ingroup dockhandler
*/
class BINARYNINJAUIAPI DockHandler : public QObject
{
Q_OBJECT
int m_windowIndex = 0;
ViewFrame* m_viewFrame = nullptr;
View* m_view = nullptr;
BinaryViewRef m_data;
std::map<QString, DockProperties> m_docks;
bool m_resizeDocksRequest = false;
bool m_shouldResizeDocks = false;
std::map<Qt::DockWidgetArea, bool> m_enableHiddenGroupSave;
std::map<View*, ViewLocation> m_currentViewLocation;
friend class DockContextHandler;
std::map<QWidget*, DockContextHandler*> m_contexts;
std::map<QString, std::pair<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);
void close();
void notifyRestoredFromState();
void reset(bool initial = false);
void reset(const QString& name);
void resizeDocksOnShow(bool resizeDocks) { m_resizeDocksRequest = resizeDocks; }
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);
void setVisible(const QString& name, bool visible);
void saveState(QSettings& settings, const QString& windowStateName);
void restoreState(QSettings& settings, const QString& windowStateName);
void saveDockSizes(bool nullFrame = false);
void restoreDockSizes();
bool shouldResizeDocks();
void updateFonts();
void clearViewLocation(View* view);
void updateViewLocation(View* view, const ViewLocation& viewLocation);
void updateTheme();
void addActionOnShow(const QString& name, const std::function<void()>& action);
static DockHandler* getActiveDockHandler();
Q_SIGNALS:
void notifyVisibilityChanged();
public Q_SLOTS:
void viewChanged(ViewFrame* frame);
void visibilityChanged(bool visible);
void topLevelChanged(bool topLevel);
void removeWidget(QObject* object);
};