diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2025-06-17 21:35:08 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2025-06-23 15:19:52 -0400 |
| commit | f59acf14a8a8630a5b9a0e0cb422a1192f247f5d (patch) | |
| tree | 7018ad230557f9e1fcb68cbbd4e6fdefb9b3005a /ui | |
| parent | df2691ad3443fdf9767869be73c1014f49383239 (diff) | |
Allow sidebar icons to be hidden
Diffstat (limited to 'ui')
| -rw-r--r-- | ui/globalarea.h | 3 | ||||
| -rw-r--r-- | ui/sidebar.h | 10 | ||||
| -rw-r--r-- | ui/sidebarcontainer.h | 16 | ||||
| -rw-r--r-- | ui/sidebaricons.h | 2 | ||||
| -rw-r--r-- | ui/sidebarwidget.h | 64 | ||||
| -rw-r--r-- | ui/workflowmonitor.h | 1 |
6 files changed, 91 insertions, 5 deletions
diff --git a/ui/globalarea.h b/ui/globalarea.h index f040b802..5ef9d541 100644 --- a/ui/globalarea.h +++ b/ui/globalarea.h @@ -215,5 +215,6 @@ public: SidebarWidgetLocation defaultLocation() const override { return SidebarWidgetLocation::LeftBottom; } SidebarContextSensitivity contextSensitivity() const override { return GlobalSidebarContext; } bool alwaysShowTabs() const override { return true; } - bool hideIfNoContent() const override { return true; } + SidebarIconVisibility defaultIconVisibility() const override { return InvisibleIfNoContent; } + SidebarContentClassifier* contentClassifier(ViewFrame*, BinaryViewRef) override; }; diff --git a/ui/sidebar.h b/ui/sidebar.h index f4cc81f9..df749fe4 100644 --- a/ui/sidebar.h +++ b/ui/sidebar.h @@ -60,6 +60,7 @@ class BINARYNINJAUIAPI Sidebar : public QObject static std::set<Sidebar*> m_instances; static std::set<SidebarWidgetType*> m_defaultTypes; static std::optional<SidebarMetrics> m_metrics; + static std::map<QString, SidebarIconVisibility> m_iconVisibility; private Q_SLOTS: void containerUpdated(); @@ -122,6 +123,8 @@ public: bool isContentActive() const; bool isSideContentActive() const; bool isBottomContentActive() const; + bool allIconsVisible() const; + std::vector<SidebarWidgetType*> hiddenIcons() const; void updateTheme(); void updateFonts(); @@ -146,6 +149,8 @@ public: static std::vector<SidebarWidgetType*> typesForContainerLocation(SidebarContainerLocation location); static void initSavedTypeOrdering(); static void saveTypeOrdering(); + static void initIconVisibility(); + static void saveIconVisibility(); static SidebarMetrics metrics(); static void refreshMetrics(); @@ -153,6 +158,11 @@ public: static std::set<SidebarWidgetType*> defaultTypes() { return m_defaultTypes; } static void setDefaultTypes(const std::set<SidebarWidgetType*>& types) { m_defaultTypes = types; } + static SidebarIconVisibility iconVisibility(SidebarWidgetType* type); + static SidebarIconVisibility iconVisibility(const QString& name); + static void setIconVisibility(SidebarWidgetType* type, SidebarIconVisibility visibility); + static void setIconVisibility(const QString& name, SidebarIconVisibility visibility); + static Sidebar* current() { UIContext* context = UIContext::activeContext(); diff --git a/ui/sidebarcontainer.h b/ui/sidebarcontainer.h index 3ab30c83..acd27761 100644 --- a/ui/sidebarcontainer.h +++ b/ui/sidebarcontainer.h @@ -4,10 +4,9 @@ #include <QtWidgets/QStackedWidget> #include <QtWidgets/QWidget> #include "splitter.h" +#include "sidebarwidget.h" class Sidebar; -class SidebarWidgetType; -class SidebarWidgetAndHeader; class SplitPaneWidget; /*! @@ -88,17 +87,22 @@ class BINARYNINJAUIAPI SidebarWidgetContainer : public QWidget std::map<SplitPaneWidget*, std::map<ViewFrame*, std::map<QString, std::map<SidebarWidgetType*, SidebarWidgetAndHeader*>>>> m_widgets; + std::map<SplitPaneWidget*, + std::map<ViewFrame*, std::map<QString, std::map<SidebarWidgetType*, SidebarContentClassifier*>>>> + m_contentClassifiers; std::map<SplitPaneWidget*, std::map<QString, std::set<SidebarWidgetType*>>> m_priorWidgets; std::map<SidebarWidgetType*, SidebarFloatingWidgetState> m_savedFloatingWidgetState; SidebarStackedWidget& stackedWidgetForType(SidebarWidgetType* type); std::vector<SidebarWidgetAndHeader*> widgetsForContext() const; + std::vector<SidebarContentClassifier*> contentClassifiersForContext() const; void insertWidgetIntoContainer(SidebarWidgetType* type, QStackedWidget* widget); void updateContentsVisibility(); private Q_SLOTS: void floatingWidgetClosed(SidebarWidgetType* type); + void childContentClassificationChanged(); public: SidebarWidgetContainer(Sidebar* sidebar, SidebarContainerLocation location); @@ -134,8 +138,11 @@ public: SidebarWidget* widgetWithTitle(SidebarWidgetType* type, const QString& title) const; bool hasWidgetWithTitle(SidebarWidgetType* type, const QString& title) const; bool activateWidgetWithTitle(SidebarWidgetType* type, const QString& title) const; - bool hasContent(SidebarWidgetType* type) const; - bool shouldHide(SidebarWidgetType* type) const; + SidebarContentClassification contentClassification(SidebarWidgetType* type); + bool hasContent(SidebarWidgetType* type); + bool shouldHide(SidebarWidgetType* type); + + SidebarContentClassifier* contentClassifier(SidebarWidgetType* type); virtual QSize sizeHint() const override; @@ -162,4 +169,5 @@ public: Q_SIGNALS: void showContents(); void hideContents(); + void contentClassificationChanged(); }; diff --git a/ui/sidebaricons.h b/ui/sidebaricons.h index b68ace9e..7ba57f77 100644 --- a/ui/sidebaricons.h +++ b/ui/sidebaricons.h @@ -78,9 +78,11 @@ class BINARYNINJAUIAPI SidebarIconsWidget : public QWidget std::pair<SidebarWidgetLocation, size_t> findDropLocation(int y) const; QRect placeholderRect() const; bool shouldBeVisible() const; + bool shouldContainMoreIcon() const; private Q_SLOTS: void containerUpdated(); + void contentClassificationChanged(); protected: virtual void paintEvent(QPaintEvent* event) override; diff --git a/ui/sidebarwidget.h b/ui/sidebarwidget.h index 8308991e..44b6ea8c 100644 --- a/ui/sidebarwidget.h +++ b/ui/sidebarwidget.h @@ -188,6 +188,51 @@ enum SidebarContextSensitivity /*! \ingroup sidebar */ +enum SidebarIconVisibility +{ + AlwaysShowSidebarIcon, + HideSidebarIconIfNoContent, + AlwaysHideSidebarIcon, + InvisibleIfNoContent +}; + +/*! + \ingroup sidebar +*/ +enum SidebarContentClassification +{ + SidebarHasRelevantContent, + SidebarHasGeneralMessage, + SidebarHasNoContent, + SidebarIsWidgetContainer +}; + +class BINARYNINJAUIAPI SidebarContentClassifier : public QObject +{ + Q_OBJECT + +public: + virtual SidebarContentClassification contentClassification() = 0; + virtual void notifyViewChanged(ViewFrame*) {} + +Q_SIGNALS: + void contentClassificationChanged(); +}; + +class BINARYNINJAUIAPI StaticSidebarContentClassifier : public SidebarContentClassifier +{ + Q_OBJECT + + SidebarContentClassification m_classification; + +public: + StaticSidebarContentClassifier(SidebarContentClassification classification) : m_classification(classification) {} + SidebarContentClassification contentClassification() override { return m_classification; } +}; + +/*! + \ingroup sidebar +*/ class BINARYNINJAUIAPI SidebarWidgetType { SidebarIcon m_icon; @@ -213,8 +258,14 @@ public: virtual SidebarWidgetLocation defaultLocation() const; virtual SidebarContextSensitivity contextSensitivity() const; virtual bool alwaysShowTabs() const { return false; } + + /*! + \deprecated Use `defaultIconVisibility()` + */ virtual bool hideIfNoContent() const { return false; } + virtual SidebarIconVisibility defaultIconVisibility() const; + virtual SidebarWidget* createWidget(ViewFrame* /*frame*/, BinaryViewRef /*data*/) { return nullptr; } virtual SidebarWidget* createInvalidContextWidget(); virtual QWidget* headerWidget(SplitPaneWidget* /*panes*/, ViewFrame* /*frame*/, BinaryViewRef /*data*/) @@ -228,5 +279,18 @@ public: virtual bool canUseAsPane(SplitPaneWidget* /*panes*/, BinaryViewRef /*data*/) const { return false; } virtual Pane* createPane(SplitPaneWidget* /*panes*/, BinaryViewRef /*data*/) { return nullptr; } + virtual SidebarContentClassifier* contentClassifier(ViewFrame* /*frame*/, BinaryViewRef /*data*/) + { + return nullptr; + } + void updateTheme(); }; + +class BINARYNINJAUIAPI MoreSidebarWidgetType : public SidebarWidgetType +{ +public: + MoreSidebarWidgetType(); + + static MoreSidebarWidgetType* instance(); +}; diff --git a/ui/workflowmonitor.h b/ui/workflowmonitor.h index 1a5a81f1..94fe7062 100644 --- a/ui/workflowmonitor.h +++ b/ui/workflowmonitor.h @@ -102,6 +102,7 @@ public: SidebarWidgetLocation defaultLocation() const override { return SidebarWidgetLocation::LeftReference; } SidebarContextSensitivity contextSensitivity() const override { return PerViewTypeSidebarContext; } + SidebarIconVisibility defaultIconVisibility() const override { return AlwaysHideSidebarIcon; } SidebarWidget* createWidget(ViewFrame* frame, BinaryViewRef data) override; |
