summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-04-27 10:29:51 -0400
committerBrian Potchik <brian@vector35.com>2025-04-27 10:29:51 -0400
commit54990215c2ad8bda17de857a7fe97d9a7559364f (patch)
treec48f5215c7b9bc4b70391dc8aea48bf72193e9ca /ui
parentaf87287534221d6c5b0e3425dfcbc84800b7c2f0 (diff)
Add initial Workflow Monitor UI and support for nested subflows.
Diffstat (limited to 'ui')
-rw-r--r--ui/workflowmonitor.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/ui/workflowmonitor.h b/ui/workflowmonitor.h
new file mode 100644
index 00000000..7dcb05a5
--- /dev/null
+++ b/ui/workflowmonitor.h
@@ -0,0 +1,83 @@
+#pragma once
+
+#include <QAction>
+#include <QToolBar>
+#include <QPushButton>
+#include <QIcon>
+#include <QLabel>
+#include <QPropertyAnimation>
+#include "binaryninjaapi.h"
+#include "sidebarwidget.h"
+#include "uicontext.h"
+
+
+class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget
+{
+ Q_OBJECT
+ Q_PROPERTY(qreal dotBrightness READ dotBrightness WRITE setDotBrightness)
+
+ BinaryViewRef m_data;
+ FunctionRef m_function;
+ WorkflowRef m_workflow;
+
+ Menu* m_menu;
+ ContextMenuManager* m_contextMenuManager;
+ UIActionHandler m_actionHandler;
+
+ QToolBar* m_toolbar;
+
+ QAction* m_startAction;
+ QAction* m_haltAction;
+ QAction* m_stepAction;
+ QAction* m_resetAction;
+ QAction* m_toggleSuspendAction;
+ QAction* m_toggleLogAction;
+ QAction* m_topologyAction;
+ QPushButton* m_contextButton;
+ QLabel* m_contextLabel;
+
+ std::map<std::string, QIcon> m_iconCache;
+ std::map<std::string, QColor> m_colorCache;
+ std::string m_lastState;
+ QColor m_lastStatusColor;
+ QColor m_labelColor;
+
+ QLabel* m_currentActivity;
+ QLabel* m_statusIndicator;
+ QPropertyAnimation* m_dotAnimation;
+ qreal m_dotBrightness;
+ bool m_animationRunning;
+
+ virtual void contextMenuEvent(QContextMenuEvent*) override;
+
+ void updateToolbarActions(bool force = false);
+ void updateToolbarIcons();
+ void setupToolbar();
+ void setupActions();
+ void updateStatusIndicator();
+
+ qreal dotBrightness() const;
+ void setDotBrightness(qreal brightness);
+
+public:
+ WorkflowMonitorWidget(BinaryViewRef data);
+ ~WorkflowMonitorWidget();
+
+ void notifyRefresh() override;
+ void notifyFontChanged() override;
+ void notifyThemeChanged() override;
+ void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation) override;
+
+ void startDotAnimation();
+ void stopDotAnimation();
+};
+
+
+class BINARYNINJAUIAPI WorkflowMonitorWidgetType : public SidebarWidgetType
+{
+public:
+ WorkflowMonitorWidgetType();
+ SidebarWidget* createWidget(ViewFrame* frame, BinaryViewRef data) override;
+ SidebarWidgetLocation defaultLocation() const override { return SidebarWidgetLocation::LeftReference; }
+ SidebarContextSensitivity contextSensitivity() const override { return PerViewTypeSidebarContext; }
+};