From f59acf14a8a8630a5b9a0e0cb422a1192f247f5d Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 17 Jun 2025 21:35:08 -0400 Subject: Allow sidebar icons to be hidden --- ui/globalarea.h | 3 ++- ui/sidebar.h | 10 ++++++++ ui/sidebarcontainer.h | 16 +++++++++---- ui/sidebaricons.h | 2 ++ ui/sidebarwidget.h | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ ui/workflowmonitor.h | 1 + 6 files changed, 91 insertions(+), 5 deletions(-) (limited to 'ui') 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 m_instances; static std::set m_defaultTypes; static std::optional m_metrics; + static std::map 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 hiddenIcons() const; void updateTheme(); void updateFonts(); @@ -146,6 +149,8 @@ public: static std::vector 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 defaultTypes() { return m_defaultTypes; } static void setDefaultTypes(const std::set& 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 #include #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>>> m_widgets; + std::map>>> + m_contentClassifiers; std::map>> m_priorWidgets; std::map m_savedFloatingWidgetState; SidebarStackedWidget& stackedWidgetForType(SidebarWidgetType* type); std::vector widgetsForContext() const; + std::vector 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 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 @@ -185,6 +185,51 @@ enum SidebarContextSensitivity PerPaneSidebarContext }; +/*! + \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 */ @@ -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; -- cgit v1.3.1