summaryrefslogtreecommitdiff
path: root/ui/globalarea.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2021-10-07 12:57:07 -0600
committerRusty Wagner <rusty.wagner@gmail.com>2021-10-26 16:16:50 -0600
commit644f9709668eca8c206d662bf40361180ed1cb8c (patch)
treebc75058cfc894de891aa8419def6b9063bff2943 /ui/globalarea.h
parentcb46d56c6c95a945bd2835d042ec1c79d16a16ef (diff)
Replace log/scripting console dock widgets with global area concept
Diffstat (limited to 'ui/globalarea.h')
-rw-r--r--ui/globalarea.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/ui/globalarea.h b/ui/globalarea.h
new file mode 100644
index 00000000..c49679a1
--- /dev/null
+++ b/ui/globalarea.h
@@ -0,0 +1,121 @@
+#pragma once
+
+#include <QtWidgets/QWidget>
+#include "theme.h"
+#include "viewframe.h"
+#include "tabwidget.h"
+
+class BINARYNINJAUIAPI GlobalAreaWidget: public QWidget
+{
+ Q_OBJECT
+
+protected:
+ QString m_title;
+ UIActionHandler m_actionHandler;
+ ContextMenuManager* m_contextMenuManager = nullptr;
+ Menu* m_menu = nullptr;
+
+public:
+ GlobalAreaWidget(const QString& title);
+
+ const QString& title() const { return m_title; }
+
+ 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 focus();
+};
+
+class BINARYNINJAUIAPI GlobalAreaTabStyle: public DockableTabStyle
+{
+ int closeButtonSize(const QWidget* widget) const;
+
+public:
+ virtual QSize sizeForTab(const QWidget* widget, const DockableTabInfo& info, int idx,
+ int count, int active) const override;
+ virtual QRect closeButtonRect(const QWidget* widget, const DockableTabInfo& info, int idx,
+ int count, int active) const override;
+ virtual QRect closeIconRect(const QWidget* widget, const DockableTabInfo& info, int idx,
+ int count, int active) const override;
+ virtual void paintTab(const QWidget* widget, QStylePainter& p, const DockableTabInfo& info, int idx,
+ int count, int active, DockableTabInteractionState state, const QRect& rect) const override;
+ virtual DockableTabStyle* duplicate() override;
+};
+
+class BINARYNINJAUIAPI GlobalAreaHideButton: public QWidget
+{
+ Q_OBJECT
+
+ bool m_mouseInside = false;
+ bool m_buttonDown = false;
+ QTimer* m_timer;
+
+public:
+ GlobalAreaHideButton();
+ virtual QSize sizeHint() const override;
+
+protected:
+ virtual void paintEvent(QPaintEvent* event) override;
+ virtual void enterEvent(QEnterEvent* event) override;
+ virtual void leaveEvent(QEvent* event) override;
+ virtual void mouseMoveEvent(QMouseEvent* event) override;
+ virtual void mousePressEvent(QMouseEvent* event) override;
+ virtual void mouseReleaseEvent(QMouseEvent* event) override;
+
+private Q_SLOTS:
+ void underMouseTimerEvent();
+
+Q_SIGNALS:
+ void clicked();
+};
+
+class BINARYNINJAUIAPI GlobalArea: public QWidget
+{
+ Q_OBJECT
+
+ SplitTabWidget* m_tabs;
+ DockableTabCollection* m_collection;
+ QSplitter* m_parentSplitter = nullptr;
+ std::optional<QList<int>> m_pendingParentSplitterSizes, m_savedParentSplitterSizes;
+
+ static std::vector<std::function<GlobalAreaWidget*(UIContext*)>> m_widgetFactories;
+
+ QString actionNameForWidget(const QString &title);
+ static QVariant sizesToVariant(const QList<int>& sizes);
+ static std::optional<QList<int>> variantToSizes(const QVariant& variant);
+
+public:
+ GlobalArea();
+ void setSplitter(QSplitter* splitter);
+
+ void addWidget(GlobalAreaWidget* widget, bool canClose = false);
+ static void addWidget(const std::function<GlobalAreaWidget*(UIContext*)>& createWidget);
+
+ void initRegisteredWidgets(UIContext* context);
+
+ void updateFonts();
+ void updateTheme();
+ void updateViewLocation(View* view, const ViewLocation& viewLocation);
+ void viewChanged(ViewFrame* frame);
+
+ bool isWidgetVisible(const QString& title);
+
+ bool toggleVisible();
+ bool toggleWidgetVisible(const QString& title);
+ void focusWidget(const QString& title);
+
+ void saveSizes(const QSettings& settings, const QString& windowStateName);
+ void saveState(const QSettings& settings, const QString& windowStateName);
+ void restoreSizes(const QSettings& settings, const QString& windowStateName);
+ void restoreState(const QSettings& settings, const QString& windowStateName);
+
+Q_SIGNALS:
+ void widgetClosed(GlobalAreaWidget* widget);
+
+private Q_SLOTS:
+ void currentChanged(QWidget* widget);
+ void tabClosed(QWidget* widget);
+ void hideButtonClicked();
+};