┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/search/widgetmenu.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/search/widgetmenu.h')
-rw-r--r--src/search/widgetmenu.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/search/widgetmenu.h b/src/search/widgetmenu.h
new file mode 100644
index 000000000..def75354f
--- /dev/null
+++ b/src/search/widgetmenu.h
@@ -0,0 +1,63 @@
+/*
+ SPDX-FileCopyrightText: 2025 Felix Ernst <[email protected]>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#ifndef WIDGETMENU_H
+#define WIDGETMENU_H
+
+#include <QMenu>
+
+class QMouseEvent;
+class QShowEvent;
+
+namespace Search
+{
+
+/**
+ * @brief A QMenu that contains nothing but a lazily constructed widget.
+ *
+ * Usually QMenus contain a list of actions. WidgetMenu allows showing any QWidget instead. This is useful to show popups, random text, or full user interfaces
+ * when a button is pressed or a menu action in a QMenu is hovered.
+ *
+ * This class also encapsulates lazy construction of the widget within. It will only be created when this menu is actually being opened.
+ */
+class WidgetMenu : public QMenu
+{
+public:
+ explicit WidgetMenu(QWidget *parent = nullptr);
+
+protected:
+ /**
+ * Overrides the weird QMenu Tab key handling with the usual QWidget one.
+ */
+ bool focusNextPrevChild(bool next) override;
+
+ /**
+ * Overrides the QMenu behaviour of closing itself when clicked with the non-closing QWidget one.
+ */
+ void mouseReleaseEvent(QMouseEvent *event) override;
+
+ /**
+ * This unfortuantely needs to be explicitly called to resize the WidgetMenu because the size of a QMenu will not automatically change to fit the QWidgets
+ * within.
+ */
+ void resizeToFitContents();
+
+ /**
+ * Move focus to the widget when this WidgetMenu is shown.
+ */
+ void showEvent(QShowEvent *event) override;
+
+private:
+ /**
+ * @return the widget which is contained in this WidgetMenu. This method is at most called once per WidgetMenu object when the WidgetMenu is about to be
+ * shown for the first time. The ownership of the widget will be transfered to an internal QWidgetAction.
+ */
+ virtual QWidget *init() = 0;
+};
+
+}
+
+#endif // WIDGETMENU_H