Sfoglia il codice sorgente

frontend: Add Menu Checkbox widget

Update MenuCheckBox.hpp
Warchamp7 3 mesi fa
parent
commit
3e5cd44fd5

+ 2 - 0
frontend/cmake/ui-components.cmake

@@ -48,6 +48,8 @@ target_sources(
     components/MediaControls.hpp
     components/MenuButton.cpp
     components/MenuButton.hpp
+    components/MenuCheckBox.cpp
+    components/MenuCheckBox.hpp
     components/Multiview.cpp
     components/Multiview.hpp
     components/MuteCheckBox.hpp

+ 109 - 0
frontend/components/MenuCheckBox.cpp

@@ -0,0 +1,109 @@
+/******************************************************************************
+    Copyright (C) 2025 by Taylor Giampaolo <[email protected]>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+******************************************************************************/
+
+#include "MenuCheckBox.hpp"
+
+#include <QMenu>
+
+MenuCheckBox::MenuCheckBox(const QString &text, QWidget *parent) : QCheckBox(text, parent)
+{
+	setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+	setContentsMargins(0, 0, 0, 0);
+
+	if (auto menu = qobject_cast<QMenu *>(parent)) {
+		connect(menu, &QMenu::hovered, this, [this, menu](QAction *action) {
+			if (action != menuAction) {
+				setHovered(false);
+				update();
+			}
+		});
+		connect(menu, &QMenu::aboutToHide, this, [this]() { setHovered(false); });
+	}
+}
+
+void MenuCheckBox::setAction(QAction *action)
+{
+	menuAction = action;
+}
+
+void MenuCheckBox::focusInEvent(QFocusEvent *)
+{
+	setHovered(true);
+}
+
+void MenuCheckBox::mousePressEvent(QMouseEvent *event)
+{
+	if (event->button() == Qt::LeftButton) {
+		mousePressInside = true;
+		event->accept();
+	} else {
+		QCheckBox::mousePressEvent(event);
+	}
+}
+
+void MenuCheckBox::mouseMoveEvent(QMouseEvent *event)
+{
+	if (!rect().contains(event->pos())) {
+		mousePressInside = false;
+	}
+	event->accept();
+}
+
+void MenuCheckBox::mouseReleaseEvent(QMouseEvent *event)
+{
+	if (event->button() == Qt::LeftButton) {
+		if (mousePressInside && rect().contains(event->pos())) {
+			toggle();
+		}
+		event->accept();
+	} else {
+		QCheckBox::mouseReleaseEvent(event);
+	}
+
+	mousePressInside = false;
+}
+
+void MenuCheckBox::enterEvent(QEnterEvent *)
+{
+	setHovered(true);
+	update();
+}
+
+void MenuCheckBox::leaveEvent(QEvent *)
+{
+	setHovered(false);
+	update();
+}
+
+void MenuCheckBox::paintEvent(QPaintEvent *)
+{
+	QStylePainter p(this);
+	QStyleOptionButton opt;
+	initStyleOption(&opt);
+
+	if (isHovered) {
+		opt.state |= QStyle::State_MouseOver;
+		opt.state |= QStyle::State_Selected;
+	}
+
+	p.drawControl(QStyle::CE_CheckBox, opt);
+}
+
+void MenuCheckBox::setHovered(bool hovered)
+{
+	isHovered = hovered;
+}

+ 50 - 0
frontend/components/MenuCheckBox.hpp

@@ -0,0 +1,50 @@
+/******************************************************************************
+    Copyright (C) 2025 by Taylor Giampaolo <[email protected]>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+******************************************************************************/
+
+#pragma once
+
+#include <QCheckBox>
+#include <QPointer>
+
+class QStyleOptionButton;
+class QStylePainter;
+class QMouseEvent;
+
+class MenuCheckBox : public QCheckBox {
+	Q_OBJECT
+
+public:
+	explicit MenuCheckBox(const QString &text, QWidget *parent = nullptr);
+
+	void setAction(QAction *action);
+
+protected:
+	void focusInEvent(QFocusEvent *event) override;
+	void mousePressEvent(QMouseEvent *event) override;
+	void mouseMoveEvent(QMouseEvent *event) override;
+	void mouseReleaseEvent(QMouseEvent *event) override;
+	void enterEvent(QEnterEvent *event) override;
+	void leaveEvent(QEvent *event) override;
+	void paintEvent(QPaintEvent *event) override;
+
+private:
+	QPointer<QAction> menuAction = nullptr;
+	bool mousePressInside = false;
+
+	bool isHovered = false;
+	void setHovered(bool hovered);
+};