File indexing completed on 2024-05-12 07:51:13
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <QColor> 0010 #include <QSGGeometryNode> 0011 #include <QVector2D> 0012 #include <QVector4D> 0013 0014 #include "shadowedrectanglematerial.h" 0015 0016 struct QSGMaterialType; 0017 class ShadowedBorderRectangleMaterial; 0018 0019 /** 0020 * Scene graph node for a shadowed rectangle. 0021 * 0022 * This node will set up the geometry and materials for a shadowed rectangle, 0023 * optionally with rounded corners. 0024 * 0025 * \note You must call updateGeometry() after setting properties of this node, 0026 * otherwise the node's state will not correctly reflect all the properties. 0027 * 0028 * \sa ShadowedRectangle 0029 */ 0030 class ShadowedRectangleNode : public QSGGeometryNode 0031 { 0032 public: 0033 ShadowedRectangleNode(); 0034 0035 /** 0036 * Set whether to draw a border. 0037 * 0038 * Note that this will switch between a material with or without border. 0039 * This means this needs to be called before any other setters. 0040 */ 0041 void setBorderEnabled(bool enabled); 0042 0043 void setRect(const QRectF &rect); 0044 void setSize(qreal size); 0045 void setRadius(const QVector4D &radius); 0046 void setColor(const QColor &color); 0047 void setShadowColor(const QColor &color); 0048 void setOffset(const QVector2D &offset); 0049 void setBorderWidth(qreal width); 0050 void setBorderColor(const QColor &color); 0051 void setShaderType(ShadowedRectangleMaterial::ShaderType type); 0052 0053 /** 0054 * Update the geometry for this node. 0055 * 0056 * This is done as an explicit step to avoid the geometry being recreated 0057 * multiple times while updating properties. 0058 */ 0059 void updateGeometry(); 0060 0061 protected: 0062 virtual ShadowedRectangleMaterial *createBorderlessMaterial(); 0063 virtual ShadowedBorderRectangleMaterial *createBorderMaterial(); 0064 virtual QSGMaterialType *borderMaterialType(); 0065 virtual QSGMaterialType *borderlessMaterialType(); 0066 0067 QSGGeometry *m_geometry; 0068 ShadowedRectangleMaterial *m_material = nullptr; 0069 ShadowedRectangleMaterial::ShaderType m_shaderType = ShadowedRectangleMaterial::ShaderType::Standard; 0070 0071 private: 0072 QRectF m_rect; 0073 qreal m_size = 0.0; 0074 QVector4D m_radius = QVector4D{0.0, 0.0, 0.0, 0.0}; 0075 QVector2D m_offset = QVector2D{0.0, 0.0}; 0076 QVector2D m_aspect = QVector2D{1.0, 1.0}; 0077 qreal m_borderWidth = 0.0; 0078 QColor m_borderColor; 0079 };