20#include "windowshadow.h"
21#include "boxshadowrenderer.h"
32const CompositeShadowParams s_shadowParams[] = {
34 CompositeShadowParams(),
36 CompositeShadowParams(
38 ShadowParams(
QPoint(0, 0), 16, 0.26),
39 ShadowParams(
QPoint(0, -2), 8, 0.16)),
41 CompositeShadowParams(
43 ShadowParams(
QPoint(0, 0), 20, 0.24),
44 ShadowParams(
QPoint(0, -2), 10, 0.14)),
46 CompositeShadowParams(
48 ShadowParams(
QPoint(0, 0), 24, 0.22),
49 ShadowParams(
QPoint(0, -3), 12, 0.12)),
51 CompositeShadowParams(
53 ShadowParams(
QPoint(0, 0), 32, 0.1),
54 ShadowParams(
QPoint(0, -3), 16, 0.05))
57WindowShadow::WindowShadow(
QObject *parent) noexcept
64WindowShadow::~WindowShadow()
68CompositeShadowParams WindowShadow::lookupShadowParams(
int shadowSizeEnum)
70 switch (shadowSizeEnum) {
72 return s_shadowParams[0];
74 return s_shadowParams[1];
76 return s_shadowParams[2];
78 return s_shadowParams[3];
80 return s_shadowParams[4];
83 return s_shadowParams[3];
87void WindowShadow::classBegin()
89 m_shadowTiles = this->shadowTiles();
92void WindowShadow::componentComplete()
97void WindowShadow::setView(
QWindow *view)
108QWindow *WindowShadow::view()
const
113void WindowShadow::setGeometry(
const QRect &rect)
115 if (rect != m_rect) {
117 emit geometryChanged();
122QRect WindowShadow::geometry()
const
127void WindowShadow::setRadius(qreal value)
129 if (m_radius != value) {
131 emit radiusChanged();
139qreal WindowShadow::strength()
const
144void WindowShadow::setStrength(qreal strength)
146 if (m_strength != strength) {
147 m_strength = strength;
152 emit strengthChanged();
156void WindowShadow::onViewVisibleChanged(
bool visible)
158 if (visible && m_view) {
163void WindowShadow::configureTiles()
167TileSet WindowShadow::shadowTiles()
169 const qreal frameRadius = m_radius;
170 const CompositeShadowParams params = lookupShadowParams(ShadowVeryLarge);
175 auto withOpacity = [](
const QColor &color, qreal opacity) ->
QColor {
177 c.setAlphaF(opacity);
182 const qreal strength = m_strength;
184 const QSize boxSize = BoxShadowRenderer::calculateMinimumBoxSize(params.shadow1.radius)
185 .
expandedTo(BoxShadowRenderer::calculateMinimumBoxSize(params.shadow2.radius));
187 const qreal dpr = qApp->devicePixelRatio();
189 BoxShadowRenderer shadowRenderer;
190 shadowRenderer.setBorderRadius(frameRadius);
191 shadowRenderer.setBoxSize(boxSize);
192 shadowRenderer.setDevicePixelRatio(dpr);
194 shadowRenderer.addShadow(params.shadow1.offset, params.shadow1.radius,
195 withOpacity(color, params.shadow1.opacity * strength));
196 shadowRenderer.addShadow(params.shadow2.offset, params.shadow2.radius,
197 withOpacity(color, params.shadow2.opacity * strength));
199 QImage shadowTexture = shadowRenderer.render();
204 boxRect.moveCenter(outerRect.center());
210 int Shadow_Overlap = 3;
212 boxRect.left() - outerRect.left() - Shadow_Overlap - params.offset.
x(),
213 boxRect.top() - outerRect.top() - Shadow_Overlap - params.offset.
y(),
214 outerRect.right() - boxRect.right() - Shadow_Overlap + params.offset.
x(),
215 outerRect.bottom() - boxRect.bottom() - Shadow_Overlap + params.offset.
y());
220 painter.drawRoundedRect(
228 const QPoint innerRectTopLeft = outerRect.center();
231 innerRectTopLeft.
x(),
232 innerRectTopLeft.
y(),
240 const CompositeShadowParams params = lookupShadowParams(ShadowVeryLarge);
244 const QSize boxSize = BoxShadowRenderer::calculateMinimumBoxSize(params.shadow1.radius)
245 .
expandedTo(BoxShadowRenderer::calculateMinimumBoxSize(params.shadow2.radius));
247 const QSize shadowSize = BoxShadowRenderer::calculateMinimumShadowTextureSize(boxSize, params.shadow1.radius, params.shadow1.offset)
248 .
expandedTo(BoxShadowRenderer::calculateMinimumShadowTextureSize(boxSize, params.shadow2.radius, params.shadow2.offset));
253 boxRect.moveCenter(shadowRect.center());
255 int Shadow_Overlap = 4;
257 boxRect.left() - shadowRect.left() - Shadow_Overlap - params.offset.
x(),
258 boxRect.top() - shadowRect.top() - Shadow_Overlap - params.offset.
y(),
259 shadowRect.right() - boxRect.right() - Shadow_Overlap + params.offset.
x(),
260 shadowRect.bottom() - boxRect.bottom() - Shadow_Overlap + params.offset.
y());
tilesets are collections of stretchable pixmaps corresponding to a given widget corners,...
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
CompositionMode_DestinationOut
qreal devicePixelRatio() const const
QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags)
QSize expandedTo(const QSize &otherSize) const const
void visibleChanged(bool arg)