Compare commits
61 Commits
master
...
features/e
| Author | SHA1 | Date |
|---|---|---|
|
|
d1153d3707 | |
|
|
3834597d51 | |
|
|
4438498e6f | |
|
|
92a8c7e395 | |
|
|
e8657d72ff | |
|
|
c5bdecce00 | |
|
|
9cedf5f71b | |
|
|
f0c8de601f | |
|
|
621923c5dd | |
|
|
c3aea9a4a3 | |
|
|
fb4494bdbb | |
|
|
3121f0b5c7 | |
|
|
cb583abc38 | |
|
|
242f063925 | |
|
|
d397e4f26a | |
|
|
02a63cdd76 | |
|
|
e49da68ab3 | |
|
|
dd1136a32b | |
|
|
bba0a680bf | |
|
|
56b1ecf707 | |
|
|
cb9b83bbca | |
|
|
ccb79967f4 | |
|
|
a79650a76e | |
|
|
ac2ee95962 | |
|
|
880ae2abdf | |
|
|
6ad68a6da8 | |
|
|
e1069d9292 | |
|
|
ec5bb05f4a | |
|
|
0b0933122c | |
|
|
5e0eaf9f6d | |
|
|
4184e4ccf8 | |
|
|
583cf4e87f | |
|
|
f3ee4749b8 | |
|
|
f9674760c0 | |
|
|
717960f15f | |
|
|
862e566507 | |
|
|
361b5d532e | |
|
|
0df5775e3e | |
|
|
d9ebaa8b03 | |
|
|
7f410a0781 | |
|
|
a286603676 | |
|
|
26a05e9b7b | |
|
|
450d20ec5a | |
|
|
908d302236 | |
|
|
06a32bf29b | |
|
|
e75445e17d | |
|
|
e0acd82619 | |
|
|
3e32a14264 | |
|
|
7837ff6c8c | |
|
|
728dffd1df | |
|
|
f4fdc125e6 | |
|
|
dda2525970 | |
|
|
245491724d | |
|
|
048e76d021 | |
|
|
7615cffdd4 | |
|
|
162534c13c | |
|
|
ff1b479938 | |
|
|
725500fdaf | |
|
|
7f6e77d53d | |
|
|
0392f8ea36 | |
|
|
a90f1c4439 |
|
|
@ -202,6 +202,7 @@ jobs:
|
||||||
install-deps: "true"
|
install-deps: "true"
|
||||||
modules: "qtwebengine"
|
modules: "qtwebengine"
|
||||||
cached: ${{ steps.cache-qt-5-15.outputs.cache-hit }}
|
cached: ${{ steps.cache-qt-5-15.outputs.cache-hit }}
|
||||||
|
setup-python: "false"
|
||||||
tools: ""
|
tools: ""
|
||||||
set-env: "true"
|
set-env: "true"
|
||||||
tools-only: "false"
|
tools-only: "false"
|
||||||
|
|
@ -215,6 +216,7 @@ jobs:
|
||||||
install-deps: "true"
|
install-deps: "true"
|
||||||
modules: "qtwebengine qtshadertools"
|
modules: "qtwebengine qtshadertools"
|
||||||
cached: ${{ steps.cache-qt-6-2.outputs.cache-hit }}
|
cached: ${{ steps.cache-qt-6-2.outputs.cache-hit }}
|
||||||
|
setup-python: "false"
|
||||||
tools: ""
|
tools: ""
|
||||||
set-env: "true"
|
set-env: "true"
|
||||||
tools-only: "false"
|
tools-only: "false"
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ function(qsk_add_example target)
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(qsk_add_shaders target shader_name)
|
function(qsk_add_shaders target)
|
||||||
|
|
||||||
cmake_parse_arguments( arg "" "" "FILES" ${ARGN} )
|
cmake_parse_arguments( arg "" "" "FILES" ${ARGN} )
|
||||||
|
|
||||||
|
|
@ -160,7 +160,7 @@ function(qsk_add_shaders target shader_name)
|
||||||
list(APPEND outfiles "${qsbname}.qsb")
|
list(APPEND outfiles "${qsbname}.qsb")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
qt6_add_shaders( ${target} ${shader_name} BATCHABLE PRECOMPILE QUIET
|
qt6_add_shaders( ${target} "qskshaders" BATCHABLE PRECOMPILE QUIET
|
||||||
PREFIX "/qskinny/shaders" ${ARGV} OUTPUTS ${outfiles} )
|
PREFIX "/qskinny/shaders" ${ARGV} OUTPUTS ${outfiles} )
|
||||||
|
|
||||||
# pass on OUTPUT_TARGETS to the caller of this function
|
# pass on OUTPUT_TARGETS to the caller of this function
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,9 @@
|
||||||
|
|
||||||
#include "QskMaterial3ProgressBarSkinlet.h"
|
#include "QskMaterial3ProgressBarSkinlet.h"
|
||||||
#include <QskProgressBar.h>
|
#include <QskProgressBar.h>
|
||||||
#include <QskBoxHints.h>
|
#include <QskBoxShapeMetrics.h>
|
||||||
|
#include <QskBoxBorderMetrics.h>
|
||||||
|
#include <QskBoxBorderColors.h>
|
||||||
#include <QskMargins.h>
|
#include <QskMargins.h>
|
||||||
#include <QskClipNode.h>
|
#include <QskClipNode.h>
|
||||||
#include <QskSGNode.h>
|
#include <QskSGNode.h>
|
||||||
|
|
@ -63,11 +65,11 @@ QSGNode* QskMaterial3ProgressBarSkinlet::updateStopIndicatorNode(
|
||||||
else
|
else
|
||||||
rect.setBottom( rect.top() + rect.width() );
|
rect.setBottom( rect.top() + rect.width() );
|
||||||
|
|
||||||
QskBoxHints hints;
|
const auto color = progressBar->gradientHint( Q::Fill ).endColor();
|
||||||
hints.shape = progressBar->boxShapeHint( Q::Fill );
|
const auto shape = progressBar->boxShapeHint( Q::Fill );
|
||||||
hints.gradient = progressBar->gradientHint( Q::Fill ).endColor();
|
|
||||||
|
|
||||||
return updateBoxNode( progressBar, node, rect, hints );
|
return updateBoxNode( progressBar, node, rect, shape,
|
||||||
|
QskBoxBorderMetrics(), QskBoxBorderColors(), color );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* QskMaterial3ProgressBarSkinlet::updateGrooveClipNode(
|
QSGNode* QskMaterial3ProgressBarSkinlet::updateGrooveClipNode(
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ StorageBarSkinlet::StorageBarSkinlet( QskSkin* skin )
|
||||||
setNodeRoles( { Pictures, Music, Videos, Documents, Others, Free } );
|
setNodeRoles( { Pictures, Music, Videos, Documents, Others, Free } );
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF StorageBarSkinlet::subControlRect( const QskSkinnable* skinnable,
|
QRectF StorageBarSkinlet::subControlRect( const QskSkinnable* skinnable, const QRectF& contentsRect,
|
||||||
const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const
|
QskAspect::Subcontrol subControl ) const
|
||||||
{
|
{
|
||||||
const auto* const bar = static_cast< const S* >( skinnable );
|
const auto* const bar = static_cast< const S* >( skinnable );
|
||||||
|
|
||||||
|
|
@ -70,29 +70,35 @@ QRectF StorageBarSkinlet::subControlRect( const QskSkinnable* skinnable,
|
||||||
return Inherited::subControlRect( skinnable, contentsRect, subControl );
|
return Inherited::subControlRect( skinnable, contentsRect, subControl );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
inline QSGNode* updateSegmentBoxNode(
|
||||||
|
const S* const skinnable, const QskAspect::Subcontrol& subcontrol, QSGNode* const node )
|
||||||
|
{
|
||||||
|
return QskSkinlet::updateBoxNode( skinnable, node, skinnable->subControlRect( subcontrol ),
|
||||||
|
skinnable->gradientHint( subcontrol ), subcontrol );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QSGNode* StorageBarSkinlet::updateSubNode(
|
QSGNode* StorageBarSkinlet::updateSubNode(
|
||||||
const QskSkinnable* const skinnable, const quint8 nodeRole, QSGNode* const node ) const
|
const QskSkinnable* const skinnable, const quint8 nodeRole, QSGNode* const node ) const
|
||||||
{
|
{
|
||||||
|
const auto* const bar = static_cast< const S* >( skinnable );
|
||||||
|
|
||||||
switch ( nodeRole )
|
switch ( nodeRole )
|
||||||
{
|
{
|
||||||
case Pictures:
|
case Pictures:
|
||||||
return updateBoxNode( skinnable, node, S::Pictures );
|
return updateSegmentBoxNode( bar, S::Pictures, node );
|
||||||
|
|
||||||
case Music:
|
case Music:
|
||||||
return updateBoxNode( skinnable, node, S::Music );
|
return updateSegmentBoxNode( bar, S::Music, node );
|
||||||
|
|
||||||
case Videos:
|
case Videos:
|
||||||
return updateBoxNode( skinnable, node, S::Videos );
|
return updateSegmentBoxNode( bar, S::Videos, node );
|
||||||
|
|
||||||
case Documents:
|
case Documents:
|
||||||
return updateBoxNode( skinnable, node, S::Documents );
|
return updateSegmentBoxNode( bar, S::Documents, node );
|
||||||
|
|
||||||
case Others:
|
case Others:
|
||||||
return updateBoxNode( skinnable, node, S::Others );
|
return updateSegmentBoxNode( bar, S::Others, node );
|
||||||
|
|
||||||
case Free:
|
case Free:
|
||||||
return updateBoxNode( skinnable, node, S::Free );
|
return updateSegmentBoxNode( bar, S::Free, node );
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return Inherited::updateSubNode( skinnable, nodeRole, node );
|
return Inherited::updateSubNode( skinnable, nodeRole, node );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ add_subdirectory(shadows)
|
||||||
add_subdirectory(shapes)
|
add_subdirectory(shapes)
|
||||||
add_subdirectory(charts)
|
add_subdirectory(charts)
|
||||||
add_subdirectory(plots)
|
add_subdirectory(plots)
|
||||||
|
add_subdirectory(parrots)
|
||||||
|
|
||||||
if (BUILD_INPUTCONTEXT)
|
if (BUILD_INPUTCONTEXT)
|
||||||
add_subdirectory(inputpanel)
|
add_subdirectory(inputpanel)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
############################################################################
|
||||||
|
# QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
Overlay.h Overlay.cpp
|
||||||
|
TextureFilterMaterial.h TextureFilterMaterial.cpp
|
||||||
|
TextureFilterNode.h TextureFilterNode.cpp
|
||||||
|
main.cpp)
|
||||||
|
|
||||||
|
qt_add_resources(SOURCES images.qrc)
|
||||||
|
|
||||||
|
if (QT_VERSION_MAJOR VERSION_LESS 6)
|
||||||
|
qt_add_resources(SOURCES shaders.qrc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
qsk_add_example(parrots ${SOURCES})
|
||||||
|
|
||||||
|
if (QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
|
||||||
|
|
||||||
|
qt6_add_shaders(parrots "shaders"
|
||||||
|
|
||||||
|
BATCHABLE
|
||||||
|
PRECOMPILE
|
||||||
|
|
||||||
|
QUIET
|
||||||
|
|
||||||
|
PREFIX
|
||||||
|
"/shaders"
|
||||||
|
|
||||||
|
FILES
|
||||||
|
shaders/blur-vulkan.vert
|
||||||
|
shaders/blur-vulkan.frag
|
||||||
|
shaders/rgbswap-vulkan.frag
|
||||||
|
|
||||||
|
OUTPUTS
|
||||||
|
blur.vert.qsb
|
||||||
|
blur.frag.qsb
|
||||||
|
rgbswap.vert.qsb
|
||||||
|
)
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
@ -0,0 +1,206 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "Overlay.h"
|
||||||
|
#include "TextureFilterNode.h"
|
||||||
|
#include "TextureFilterMaterial.h"
|
||||||
|
|
||||||
|
#include <QskSkinlet.h>
|
||||||
|
#include <QskQuick.h>
|
||||||
|
#include <QskBoxShapeMetrics.h>
|
||||||
|
#include <QskBoxBorderMetrics.h>
|
||||||
|
#include <QskBoxBorderColors.h>
|
||||||
|
#include <QskGradient.h>
|
||||||
|
#include <QskSceneTexture.h>
|
||||||
|
#include <QskSGNode.h>
|
||||||
|
#include <QskRgbValue.h>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class Material final : public TextureFilterMaterial
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using TextureFilterMaterial::TextureFilterMaterial;
|
||||||
|
|
||||||
|
QSGMaterialType* type() const override
|
||||||
|
{
|
||||||
|
static QSGMaterialType staticType;
|
||||||
|
return &staticType;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class FilterNode final : public TextureFilterNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FilterNode( bool useRhi, QSGTexture* texture )
|
||||||
|
{
|
||||||
|
QString shaders[] = { ":/shaders/blur.vert", ":/shaders/blur.frag" };
|
||||||
|
|
||||||
|
if ( useRhi )
|
||||||
|
{
|
||||||
|
shaders[0] += ".qsb";
|
||||||
|
shaders[1] += ".qsb";
|
||||||
|
}
|
||||||
|
|
||||||
|
setFlag( QSGNode::OwnsMaterial, true );
|
||||||
|
setTextureMaterial( new Material( shaders[0], shaders[1] ) );
|
||||||
|
|
||||||
|
setOwnsTexture( true );
|
||||||
|
setTexture( texture );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Skinlet final : public QskSkinlet
|
||||||
|
{
|
||||||
|
using Inherited = QskSkinlet;
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum NodeRole { FillRole, BorderRole };
|
||||||
|
|
||||||
|
Skinlet()
|
||||||
|
{
|
||||||
|
setNodeRoles( { FillRole, BorderRole } );
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF subControlRect( const QskSkinnable*,
|
||||||
|
const QRectF& contentsRect, QskAspect::Subcontrol ) const override
|
||||||
|
{
|
||||||
|
return contentsRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* updateSubNode( const QskSkinnable* skinnable,
|
||||||
|
quint8 nodeRole, QSGNode* node ) const override
|
||||||
|
{
|
||||||
|
const auto overlay = static_cast< const Overlay* >( skinnable );
|
||||||
|
|
||||||
|
switch ( nodeRole )
|
||||||
|
{
|
||||||
|
case FillRole:
|
||||||
|
return updateFillNode( overlay, node );
|
||||||
|
|
||||||
|
case BorderRole:
|
||||||
|
return updateBoxNode( skinnable, node, Overlay::Panel );
|
||||||
|
};
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSGNode* updateFillNode( const Overlay* overlay, QSGNode* node ) const
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
There should be a way to avoid the clip node by passing the
|
||||||
|
vertex list directly to the texture node. TODO ...
|
||||||
|
*/
|
||||||
|
using Q = Overlay;
|
||||||
|
|
||||||
|
QSGNode* clipNode = nullptr;
|
||||||
|
QSGNode* textureNode = nullptr;
|
||||||
|
|
||||||
|
if ( node )
|
||||||
|
{
|
||||||
|
if ( node->firstChild() )
|
||||||
|
{
|
||||||
|
clipNode = node;
|
||||||
|
textureNode = node->firstChild();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textureNode = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
textureNode = updateTextureNode( overlay, textureNode );
|
||||||
|
|
||||||
|
if ( overlay->boxShapeHint( Q::Panel ).isRectangle() )
|
||||||
|
{
|
||||||
|
delete clipNode;
|
||||||
|
clipNode = nullptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clipNode = updateBoxClipNode( overlay, clipNode, Q::Panel );
|
||||||
|
QskSGNode::setParentNode( textureNode, clipNode );
|
||||||
|
}
|
||||||
|
|
||||||
|
return clipNode ? clipNode : textureNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* updateTextureNode( const Overlay* overlay, QSGNode* node ) const
|
||||||
|
{
|
||||||
|
const auto window = overlay->window();
|
||||||
|
|
||||||
|
const auto rect = overlay->subControlRect( Overlay::Panel );
|
||||||
|
if ( rect.isEmpty() )
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
auto rootNode = qskScenegraphAnchorNode( window );
|
||||||
|
if ( rootNode == nullptr )
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
auto textureNode = static_cast< FilterNode* >( node );
|
||||||
|
if ( textureNode == nullptr )
|
||||||
|
{
|
||||||
|
auto texture = new QskSceneTexture( window );
|
||||||
|
QObject::connect( texture, &QskSceneTexture::updateRequested,
|
||||||
|
overlay, &QQuickItem::update );
|
||||||
|
|
||||||
|
const bool useRhi = qskRenderingHardwareInterface( window );
|
||||||
|
|
||||||
|
textureNode = new FilterNode( useRhi, texture );
|
||||||
|
}
|
||||||
|
|
||||||
|
auto texture = qobject_cast< QskSceneTexture* >( textureNode->texture() );
|
||||||
|
Q_ASSERT( texture );
|
||||||
|
|
||||||
|
if ( texture->isDirty() || rect != textureNode->rect() )
|
||||||
|
{
|
||||||
|
texture->setFiltering(
|
||||||
|
overlay->smooth() ? QSGTexture::Linear : QSGTexture::Nearest );
|
||||||
|
|
||||||
|
auto finalNode = const_cast< QSGTransformNode* >( qskItemNode( overlay ) );
|
||||||
|
|
||||||
|
texture->render( rootNode, finalNode,
|
||||||
|
rect.translated( overlay->position() ) );
|
||||||
|
|
||||||
|
textureNode->markDirty( QSGNode::DirtyMaterial );
|
||||||
|
}
|
||||||
|
|
||||||
|
textureNode->setRect( rect );
|
||||||
|
|
||||||
|
return textureNode;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
QSK_SUBCONTROL( Overlay, Panel )
|
||||||
|
|
||||||
|
Overlay::Overlay( QQuickItem* parent )
|
||||||
|
: Inherited( parent )
|
||||||
|
{
|
||||||
|
setSkinlet( new Skinlet() );
|
||||||
|
|
||||||
|
setBoxBorderMetricsHint( Panel, 1 );
|
||||||
|
setBoxBorderColorsHint( Panel, QskRgb::toTransparent( QskRgb::DarkGrey, 100 ) );
|
||||||
|
setBoxShapeHint( Panel, QskBoxShapeMetrics( 25, Qt::RelativeSize ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
Overlay::~Overlay()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF Overlay::layoutRectForSize( const QSizeF& size ) const
|
||||||
|
{
|
||||||
|
return subControlContentsRect( size, Panel );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Overlay::geometryChange(
|
||||||
|
const QRectF& newGeometry, const QRectF& oldGeometry )
|
||||||
|
{
|
||||||
|
Inherited::geometryChange( newGeometry, oldGeometry );
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "moc_Overlay.cpp"
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QskControl.h>
|
||||||
|
|
||||||
|
class Overlay : public QskControl
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
using Inherited = QskControl;
|
||||||
|
|
||||||
|
public:
|
||||||
|
QSK_SUBCONTROLS( Panel )
|
||||||
|
|
||||||
|
Overlay( QQuickItem* = nullptr );
|
||||||
|
~Overlay() override;
|
||||||
|
|
||||||
|
QRectF layoutRectForSize( const QSizeF& ) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void geometryChange( const QRectF&, const QRectF& ) override;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "TextureFilterMaterial.h"
|
||||||
|
|
||||||
|
#include <qsgmaterial.h>
|
||||||
|
#include <qsgmaterialshader.h>
|
||||||
|
#include <qsgtexture.h>
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
#include <qsgmaterialrhishader.h>
|
||||||
|
using RhiShader = QSGMaterialRhiShader;
|
||||||
|
#else
|
||||||
|
using RhiShader = QSGMaterialShader;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class ShaderGL : public QSGMaterialShader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void setSource( QOpenGLShader::ShaderType type, const QString& fileName )
|
||||||
|
{
|
||||||
|
setShaderSourceFile( type, fileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const* attributeNames() const override
|
||||||
|
{
|
||||||
|
static char const* const names[] = { "in_vertex", "in_coord", nullptr };
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initialize() override
|
||||||
|
{
|
||||||
|
QSGMaterialShader::initialize();
|
||||||
|
|
||||||
|
auto p = program();
|
||||||
|
|
||||||
|
m_matrixId = p->uniformLocation( "matrix" );
|
||||||
|
m_opacityId = p->uniformLocation( "opacity" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateState( const QSGMaterialShader::RenderState& state,
|
||||||
|
QSGMaterial* newMaterial, QSGMaterial* oldMaterial ) override
|
||||||
|
{
|
||||||
|
auto p = program();
|
||||||
|
|
||||||
|
if ( state.isMatrixDirty() )
|
||||||
|
p->setUniformValue( m_matrixId, state.combinedMatrix() );
|
||||||
|
|
||||||
|
if ( state.isOpacityDirty() )
|
||||||
|
p->setUniformValue( m_opacityId, state.opacity() );
|
||||||
|
|
||||||
|
auto material = static_cast< TextureFilterMaterial* >( newMaterial );
|
||||||
|
|
||||||
|
if ( auto texture = material->texture() )
|
||||||
|
{
|
||||||
|
auto textureId = -1;
|
||||||
|
|
||||||
|
if ( auto oldMat = static_cast< TextureFilterMaterial* >( oldMaterial ) )
|
||||||
|
{
|
||||||
|
if ( oldMat->texture() )
|
||||||
|
textureId = oldMat->texture()->textureId();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( texture->textureId() != textureId )
|
||||||
|
texture->bind();
|
||||||
|
else
|
||||||
|
texture->updateBindOptions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_matrixId = -1;
|
||||||
|
int m_opacityId = -1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class ShaderRhi : public RhiShader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ShaderRhi()
|
||||||
|
{
|
||||||
|
setFlag( UpdatesGraphicsPipelineState, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
void setSource( QOpenGLShader::ShaderType type, const QString& fileName )
|
||||||
|
{
|
||||||
|
setShaderSourceFile( type, fileName );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void setSource( Stage stage, const QString& filename )
|
||||||
|
{
|
||||||
|
setShaderFileName( stage, filename );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool updateUniformData( RenderState& state,
|
||||||
|
QSGMaterial*, QSGMaterial* ) override
|
||||||
|
{
|
||||||
|
Q_ASSERT( state.uniformData()->size() >= 68 );
|
||||||
|
|
||||||
|
auto data = state.uniformData()->data();
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if ( state.isMatrixDirty() )
|
||||||
|
{
|
||||||
|
const auto matrix = state.combinedMatrix();
|
||||||
|
memcpy( data + 0, matrix.constData(), 64 );
|
||||||
|
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( state.isOpacityDirty() )
|
||||||
|
{
|
||||||
|
const float opacity = state.opacity();
|
||||||
|
memcpy( data + 64, &opacity, 4 );
|
||||||
|
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateSampledImage( RenderState& state, int binding,
|
||||||
|
QSGTexture** texture, QSGMaterial* newMaterial, QSGMaterial* ) override
|
||||||
|
{
|
||||||
|
Q_UNUSED( binding );
|
||||||
|
Q_ASSERT( binding == 1 );
|
||||||
|
|
||||||
|
auto mat = dynamic_cast< TextureFilterMaterial* >( newMaterial );
|
||||||
|
if ( auto txt = mat->texture() )
|
||||||
|
{
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
txt->updateRhiTexture( state.rhi(), state.resourceUpdateBatch() );
|
||||||
|
#else
|
||||||
|
txt->commitTextureOperations( state.rhi(), state.resourceUpdateBatch() );
|
||||||
|
#endif
|
||||||
|
*texture = txt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
|
||||||
|
QSGMaterialShader* TextureFilterMaterial::createShader() const
|
||||||
|
{
|
||||||
|
if ( flags() & QSGMaterial::RhiShaderWanted )
|
||||||
|
{
|
||||||
|
auto shader = new ShaderRhi();
|
||||||
|
|
||||||
|
shader->setSource( ShaderRhi::VertexStage, m_shaderFiles[ 0 ] );
|
||||||
|
shader->setSource( ShaderRhi::FragmentStage, m_shaderFiles[ 1 ] );
|
||||||
|
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto shader = new ShaderGL();
|
||||||
|
|
||||||
|
shader->setSource( QOpenGLShader::Vertex, m_shaderFiles[ 0 ] );
|
||||||
|
shader->setSource( QOpenGLShader::Fragment, m_shaderFiles[ 1 ] );
|
||||||
|
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
QSGMaterialShader* TextureFilterMaterial::createShader(
|
||||||
|
QSGRendererInterface::RenderMode ) const
|
||||||
|
{
|
||||||
|
auto shader = new ShaderRhi();
|
||||||
|
|
||||||
|
shader->setSource( ShaderRhi::VertexStage, m_shaderFiles[ 0 ] );
|
||||||
|
shader->setSource( ShaderRhi::FragmentStage, m_shaderFiles[ 1 ] );
|
||||||
|
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TextureFilterMaterial::TextureFilterMaterial(
|
||||||
|
const QString& vertexShaderFile, const QString& fragmentShaderFile )
|
||||||
|
: m_shaderFiles{ vertexShaderFile, fragmentShaderFile }
|
||||||
|
{
|
||||||
|
setFlag( Blending | RequiresFullMatrix, true );
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
setFlag( SupportsRhiShader, true );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureFilterMaterial::~TextureFilterMaterial()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int TextureFilterMaterial::compare( const QSGMaterial* other ) const
|
||||||
|
{
|
||||||
|
auto material = static_cast< const TextureFilterMaterial* >( other );
|
||||||
|
|
||||||
|
const auto key1 = texture()->comparisonKey();
|
||||||
|
const auto key2 = material->texture()->comparisonKey();
|
||||||
|
|
||||||
|
return ( key1 == key2 ) ? 0 : ( ( key1 > key2 ) ? 1 : -1 );
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <qsgmaterial.h>
|
||||||
|
#include <qstring.h>
|
||||||
|
|
||||||
|
class QSGTexture;
|
||||||
|
|
||||||
|
class TextureFilterMaterial : public QSGMaterial
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TextureFilterMaterial( const QString& vertexShaderSourceFile,
|
||||||
|
const QString& fragmentShaderSourceFile );
|
||||||
|
|
||||||
|
~TextureFilterMaterial() override;
|
||||||
|
|
||||||
|
int compare( const QSGMaterial* other ) const override;
|
||||||
|
|
||||||
|
void setTexture( QSGTexture* texture ) { m_texture = texture; }
|
||||||
|
QSGTexture* texture() const { return m_texture; }
|
||||||
|
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
QSGMaterialShader* createShader(
|
||||||
|
QSGRendererInterface::RenderMode ) const override final;
|
||||||
|
#else
|
||||||
|
QSGMaterialShader* createShader() const override final;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSGTexture* m_texture = nullptr;
|
||||||
|
const QString m_shaderFiles[ 2 ];
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "TextureFilterNode.h"
|
||||||
|
#include "TextureFilterMaterial.h"
|
||||||
|
|
||||||
|
#include <qsgtexture.h>
|
||||||
|
#include <private/qsgnode_p.h>
|
||||||
|
|
||||||
|
class TextureFilterNodePrivate final : public QSGGeometryNodePrivate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TextureFilterNodePrivate()
|
||||||
|
: geometry( QSGGeometry::defaultAttributes_TexturedPoint2D(), 4 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGGeometry geometry;
|
||||||
|
QRectF rect;
|
||||||
|
|
||||||
|
bool ownsTexture = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureFilterNode::TextureFilterNode()
|
||||||
|
: QSGGeometryNode( *new TextureFilterNodePrivate )
|
||||||
|
{
|
||||||
|
Q_D( TextureFilterNode );
|
||||||
|
|
||||||
|
setGeometry( &d->geometry );
|
||||||
|
setFlag( QSGNode::OwnsMaterial, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureFilterNode::~TextureFilterNode()
|
||||||
|
{
|
||||||
|
setTexture( nullptr );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureFilterNode::setTextureMaterial( TextureFilterMaterial* material )
|
||||||
|
{
|
||||||
|
QSGTexture* texture = nullptr;
|
||||||
|
if ( auto oldMaterial = textureMaterial() )
|
||||||
|
texture = oldMaterial->texture();
|
||||||
|
|
||||||
|
Inherited::setMaterial( material );
|
||||||
|
|
||||||
|
if ( material )
|
||||||
|
material->setTexture( texture );
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureFilterMaterial* TextureFilterNode::textureMaterial() const
|
||||||
|
{
|
||||||
|
return dynamic_cast< TextureFilterMaterial* >( material() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureFilterNode::setTexture( QSGTexture* texture )
|
||||||
|
{
|
||||||
|
if ( auto mat = textureMaterial() )
|
||||||
|
{
|
||||||
|
if ( ownsTexture() && mat->texture() != texture )
|
||||||
|
delete mat->texture();
|
||||||
|
|
||||||
|
mat->setTexture( texture );
|
||||||
|
markDirty( QSGNode::DirtyMaterial );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGTexture* TextureFilterNode::texture() const
|
||||||
|
{
|
||||||
|
auto mat = textureMaterial();
|
||||||
|
return mat ? mat->texture() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureFilterNode::setRect( const QRectF& rect )
|
||||||
|
{
|
||||||
|
Q_D( TextureFilterNode );
|
||||||
|
|
||||||
|
if ( rect != d->rect )
|
||||||
|
{
|
||||||
|
d->rect = rect;
|
||||||
|
|
||||||
|
QSGGeometry::updateTexturedRectGeometry(
|
||||||
|
&d->geometry, rect, QRectF( 0, 0, 1, 1 ) );
|
||||||
|
|
||||||
|
d->geometry.markVertexDataDirty();
|
||||||
|
markDirty( QSGNode::DirtyGeometry );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF TextureFilterNode::rect() const
|
||||||
|
{
|
||||||
|
return d_func()->rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureFilterNode::setOwnsTexture( bool on )
|
||||||
|
{
|
||||||
|
d_func()->ownsTexture = on;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TextureFilterNode::ownsTexture() const
|
||||||
|
{
|
||||||
|
return d_func()->ownsTexture;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <qsgnode.h>
|
||||||
|
|
||||||
|
class TextureFilterMaterial;
|
||||||
|
class TextureFilterNodePrivate;
|
||||||
|
|
||||||
|
class QSGTexture;
|
||||||
|
|
||||||
|
class TextureFilterNode : public QSGGeometryNode
|
||||||
|
{
|
||||||
|
using Inherited = QSGGeometryNode;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TextureFilterNode();
|
||||||
|
~TextureFilterNode();
|
||||||
|
|
||||||
|
void setTexture( QSGTexture* );
|
||||||
|
QSGTexture* texture() const;
|
||||||
|
|
||||||
|
void setOwnsTexture( bool );
|
||||||
|
bool ownsTexture() const;
|
||||||
|
|
||||||
|
void setRect( const QRectF& );
|
||||||
|
QRectF rect() const;
|
||||||
|
|
||||||
|
void setTextureMaterial( TextureFilterMaterial* );
|
||||||
|
TextureFilterMaterial* textureMaterial() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setMaterial( QSGMaterial* ) = delete;
|
||||||
|
|
||||||
|
Q_DECLARE_PRIVATE( TextureFilterNode )
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
<!DOCTYPE RCC>
|
||||||
|
<RCC version="1.0">
|
||||||
|
|
||||||
|
<qresource>
|
||||||
|
<file>images/parrots.jpg</file>
|
||||||
|
</qresource>
|
||||||
|
|
||||||
|
</RCC>
|
||||||
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
|
|
@ -0,0 +1,179 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <SkinnyNamespace.h>
|
||||||
|
|
||||||
|
#include <QskFunctions.h>
|
||||||
|
#include <QskLinearBox.h>
|
||||||
|
#include <QskPushButton.h>
|
||||||
|
#include <QskQuick.h>
|
||||||
|
#include <QskWindow.h>
|
||||||
|
#include <QskGraphicLabel.h>
|
||||||
|
#include <QskGraphic.h>
|
||||||
|
#include <QskEvent.h>
|
||||||
|
#include <QskRgbValue.h>
|
||||||
|
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <SkinnyShortcut.h>
|
||||||
|
#include <qmath.h>
|
||||||
|
|
||||||
|
#include "Overlay.h"
|
||||||
|
|
||||||
|
class Image : public QskGraphicLabel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Image( QQuickItem* parent = nullptr )
|
||||||
|
: QskGraphicLabel( parent )
|
||||||
|
{
|
||||||
|
const QImage image( ":/images/parrots.jpg" );
|
||||||
|
setGraphic( QskGraphic::fromImage( image ) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ForegroundItem : public QskLinearBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ForegroundItem( QQuickItem* parent = nullptr )
|
||||||
|
: QskLinearBox( Qt::Vertical, parent )
|
||||||
|
{
|
||||||
|
setMargins( 20 );
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
auto label = new Image( this );
|
||||||
|
label->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
|
||||||
|
label->setLayoutAlignmentHint( Qt::AlignCenter );
|
||||||
|
label->setObjectName( "miniParrots" );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto button = new QskPushButton( "Button", this );
|
||||||
|
button->setLayoutAlignmentHint( Qt::AlignHCenter | Qt::AlignBottom );
|
||||||
|
|
||||||
|
button->setObjectName( "button" );
|
||||||
|
setObjectName( "foreground" );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class BackgroundItem : public QskControl
|
||||||
|
{
|
||||||
|
using Inherited = QskControl;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BackgroundItem( QQuickItem* parent = nullptr )
|
||||||
|
: QskControl( parent )
|
||||||
|
{
|
||||||
|
setObjectName( "background" );
|
||||||
|
|
||||||
|
m_label = new Image( this );
|
||||||
|
m_label->setFillMode( QskGraphicLabel::Stretch );
|
||||||
|
m_label->setObjectName( "parrots" );
|
||||||
|
|
||||||
|
startTimer( 20 );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void timerEvent( QTimerEvent* ) override
|
||||||
|
{
|
||||||
|
updateLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void geometryChange( const QRectF& newGeometry,
|
||||||
|
const QRectF& oldGeometry ) override
|
||||||
|
{
|
||||||
|
Inherited::geometryChange( newGeometry, oldGeometry );
|
||||||
|
updateLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updateLabel()
|
||||||
|
{
|
||||||
|
static int counter = 0;
|
||||||
|
|
||||||
|
const auto angle = counter++ / 50.0 * M_PI * 2.0;
|
||||||
|
|
||||||
|
const auto x = std::cos( angle );
|
||||||
|
const auto y = std::sin( angle );
|
||||||
|
|
||||||
|
const qreal margin = 20;
|
||||||
|
|
||||||
|
auto labelRect = rect();
|
||||||
|
labelRect.adjust( margin, margin, -margin, -margin );
|
||||||
|
labelRect.translate( margin * x, margin * y );
|
||||||
|
|
||||||
|
if ( m_label )
|
||||||
|
m_label->setGeometry( labelRect );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QskGraphicLabel* m_label = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MainView : public QskControl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MainView( QQuickItem* parent = nullptr )
|
||||||
|
: QskControl( parent )
|
||||||
|
{
|
||||||
|
setPolishOnResize( true );
|
||||||
|
|
||||||
|
m_background = new BackgroundItem( this );
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
auto box = new QskBox( m_background );
|
||||||
|
box->setGeometry( 20, 20, 600, 400 );
|
||||||
|
box->setFillGradient( QskRgb::SaddleBrown );
|
||||||
|
box->setObjectName( "redBox" );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
m_overlay = new Overlay( m_background );
|
||||||
|
m_overlay->setAutoLayoutChildren( true );
|
||||||
|
m_overlay->setObjectName( "overlay" );
|
||||||
|
|
||||||
|
(void )new ForegroundItem( m_overlay );
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
auto box = new QskBox( m_background );
|
||||||
|
box->setGeometry( 50, 50, 400, 200 );
|
||||||
|
box->setFillGradient( QskRgb::PaleGreen );
|
||||||
|
box->setObjectName( "blueBox" );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
setObjectName( "mainView" );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void updateLayout() override
|
||||||
|
{
|
||||||
|
if ( m_background )
|
||||||
|
m_background->setGeometry( rect() );
|
||||||
|
|
||||||
|
QRectF blurredRect( QPointF(), 0.7 * size() );
|
||||||
|
blurredRect.moveCenter( rect().center() );
|
||||||
|
|
||||||
|
if ( m_overlay )
|
||||||
|
qskSetItemGeometry( m_overlay, blurredRect );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
BackgroundItem* m_background = nullptr;
|
||||||
|
Overlay* m_overlay = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
QGuiApplication app( argc, argv );
|
||||||
|
|
||||||
|
SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts );
|
||||||
|
|
||||||
|
QskWindow window;
|
||||||
|
window.setColor( Qt::darkGray );
|
||||||
|
window.addItem( new MainView( window.contentItem() ) );
|
||||||
|
window.resize( 800, 600 );
|
||||||
|
window.show();
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
<!DOCTYPE RCC>
|
||||||
|
<RCC version="1.0">
|
||||||
|
<qresource>
|
||||||
|
<file>shaders/blur.vert</file>
|
||||||
|
<file>shaders/blur.frag</file>
|
||||||
|
<file>shaders/rgbswap.frag</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
#version 440
|
||||||
|
|
||||||
|
layout( location = 0 ) in vec2 coord;
|
||||||
|
layout( location = 0 ) out vec4 fragColor;
|
||||||
|
|
||||||
|
layout( binding = 1 ) uniform sampler2D source;
|
||||||
|
|
||||||
|
layout( std140, binding = 0 ) uniform buf
|
||||||
|
{
|
||||||
|
mat4 matrix;
|
||||||
|
float opacity;
|
||||||
|
} ubuf;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 delta = vec2( 0.01, 0.01 );
|
||||||
|
|
||||||
|
fragColor =(
|
||||||
|
0.0538 * texture( source, coord - 3.182 * delta )
|
||||||
|
+ 0.3229 * texture( source, coord - 1.364 * delta )
|
||||||
|
+ 0.2466 * texture( source, coord )
|
||||||
|
+ 0.3229 * texture( source, coord + 1.364 * delta )
|
||||||
|
+ 0.0538 * texture( source, coord + 3.182 * delta )
|
||||||
|
) * ubuf.opacity;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
#version 440
|
||||||
|
|
||||||
|
layout( location = 0 ) in vec4 in_vertex;
|
||||||
|
layout( location = 1 ) in vec2 in_coord;
|
||||||
|
|
||||||
|
layout( location = 0 ) out vec2 coord;
|
||||||
|
|
||||||
|
layout( std140, binding = 0 ) uniform buf
|
||||||
|
{
|
||||||
|
mat4 matrix;
|
||||||
|
float opacity;
|
||||||
|
} ubuf;
|
||||||
|
|
||||||
|
out gl_PerVertex { vec4 gl_Position; };
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
coord = in_coord;
|
||||||
|
gl_Position = ubuf.matrix * in_vertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
uniform sampler2D source;
|
||||||
|
uniform lowp float opacity;
|
||||||
|
|
||||||
|
varying highp vec2 coord;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 delta = vec2( 0.01, 0.01 );
|
||||||
|
|
||||||
|
gl_FragColor =(
|
||||||
|
0.0538 * texture2D( source, coord - 3.182 * delta )
|
||||||
|
+ 0.3229 * texture2D( source, coord - 1.364 * delta )
|
||||||
|
+ 0.2466 * texture2D( source, coord )
|
||||||
|
+ 0.3229 * texture2D( source, coord + 1.364 * delta )
|
||||||
|
+ 0.0538 * texture2D( source, coord + 3.182 * delta)
|
||||||
|
) * opacity;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
uniform highp mat4 matrix;
|
||||||
|
|
||||||
|
attribute highp vec4 in_vertex;
|
||||||
|
attribute highp vec2 in_coord;
|
||||||
|
|
||||||
|
varying highp vec2 coord;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
coord = in_coord;
|
||||||
|
gl_Position = matrix * in_vertex;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
#version 440
|
||||||
|
|
||||||
|
layout( location = 0 ) in vec2 coord;
|
||||||
|
layout( location = 0 ) out vec4 fragColor;
|
||||||
|
|
||||||
|
layout( binding = 1 ) uniform sampler2D source;
|
||||||
|
|
||||||
|
layout( std140, binding = 0 ) uniform buf
|
||||||
|
{
|
||||||
|
mat4 matrix;
|
||||||
|
float opacity;
|
||||||
|
} ubuf;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 c = texture( source, coord );
|
||||||
|
fragColor = c.yzxw * ubuf.opacity;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
uniform sampler2D source;
|
||||||
|
uniform lowp float opacity;
|
||||||
|
|
||||||
|
varying highp vec2 coord;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 c = texture2D( source, coord );
|
||||||
|
gl_FragColor = c.yzxw * opacity;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
function qsbcompile {
|
||||||
|
qsbfile=`echo $1 | sed 's/-vulkan//'`
|
||||||
|
qsb --glsl 100es,120,150 --hlsl 50 --msl 12 -b -o ${qsbfile}.qsb $1
|
||||||
|
}
|
||||||
|
|
||||||
|
qsbcompile blur-vulkan.vert
|
||||||
|
qsbcompile blur-vulkan.frag
|
||||||
|
qsbcompile rgbswap-vulkan.frag
|
||||||
|
|
@ -9,7 +9,6 @@
|
||||||
#include <QskSGNode.h>
|
#include <QskSGNode.h>
|
||||||
#include <QskTextOptions.h>
|
#include <QskTextOptions.h>
|
||||||
#include <QskTextColors.h>
|
#include <QskTextColors.h>
|
||||||
#include <QskBoxHints.h>
|
|
||||||
|
|
||||||
#include <QskPlotCurve.h>
|
#include <QskPlotCurve.h>
|
||||||
#include <QskPlotCorridor.h>
|
#include <QskPlotCorridor.h>
|
||||||
|
|
@ -144,10 +143,8 @@ QSGNode* PlotCursorSkinlet::updateSampleNode( const QskSkinnable* skinnable,
|
||||||
|
|
||||||
if ( subControl == Q::LabelPanel )
|
if ( subControl == Q::LabelPanel )
|
||||||
{
|
{
|
||||||
auto hints = skinnable->boxHints( subControl );
|
const auto gradient = skinnable->gradientHint( aspect );
|
||||||
hints.gradient = skinnable->gradientHint( aspect );
|
return updateBoxNode( skinnable, node, rect, gradient, subControl );
|
||||||
|
|
||||||
return updateBoxNode( skinnable, node, rect, hints );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( subControl == Q::LabelText )
|
if ( subControl == Q::LabelText )
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,6 @@ if (QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
|
||||||
shaders/arcshadow-vulkan.vert
|
shaders/arcshadow-vulkan.vert
|
||||||
shaders/arcshadow-vulkan.frag
|
shaders/arcshadow-vulkan.frag
|
||||||
)
|
)
|
||||||
qsk_add_shaders( ${target} "qskArcShaders" FILES ${SHADERS} OUTPUT_TARGETS shader_target)
|
qsk_add_shaders( ${target} FILES ${SHADERS} OUTPUT_TARGETS shader_target)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#include <QskSkinlet.h>
|
#include <QskSkinlet.h>
|
||||||
#include <QskArcNode.h>
|
#include <QskArcNode.h>
|
||||||
#include <QskArcHints.h>
|
#include <QskArcMetrics.h>
|
||||||
#include <QskShadowMetrics.h>
|
#include <QskShadowMetrics.h>
|
||||||
#include <QskSGNode.h>
|
#include <QskSGNode.h>
|
||||||
#include <QskRgbValue.h>
|
#include <QskRgbValue.h>
|
||||||
|
|
@ -107,7 +107,14 @@ namespace
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto arcNode = QskSGNode::ensureNode< QskArcNode >( node );
|
auto arcNode = QskSGNode::ensureNode< QskArcNode >( node );
|
||||||
arcNode->setArcData( rect, arc->arcHints( Q::Arc ) );
|
|
||||||
|
const auto metrics = arc->arcMetricsHint( Q::Arc );
|
||||||
|
const auto fillGradient = arc->gradientHint( Q::Arc );
|
||||||
|
|
||||||
|
const auto borderColor = arc->color( Q::Arc | QskAspect::Border );
|
||||||
|
const auto borderWidth = arc->metric( Q::Arc | QskAspect::Border );
|
||||||
|
|
||||||
|
arcNode->setArcData( rect, metrics, borderWidth, borderColor, fillGradient );
|
||||||
|
|
||||||
return arcNode;
|
return arcNode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ Slider::Slider( const QString& text, qreal min, qreal max,
|
||||||
m_slider->setBoundaries( min, max );
|
m_slider->setBoundaries( min, max );
|
||||||
m_slider->setStepSize( step );
|
m_slider->setStepSize( step );
|
||||||
m_slider->setSnapping( true );
|
m_slider->setSnapping( true );
|
||||||
m_slider->setTickPolicy( Qsk::Never ); // too many steps
|
|
||||||
m_slider->setValue( value );
|
m_slider->setValue( value );
|
||||||
|
|
||||||
m_valueLabel = new QskTextLabel( this );
|
m_valueLabel = new QskTextLabel( this );
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
list(APPEND HEADERS
|
list(APPEND HEADERS
|
||||||
common/QskArcMetrics.h
|
common/QskArcMetrics.h
|
||||||
common/QskArcHints.h
|
|
||||||
common/QskAspect.h
|
common/QskAspect.h
|
||||||
common/QskBoxBorderColors.h
|
common/QskBoxBorderColors.h
|
||||||
common/QskBoxBorderMetrics.h
|
common/QskBoxBorderMetrics.h
|
||||||
|
|
@ -42,7 +41,6 @@ list(APPEND HEADERS
|
||||||
|
|
||||||
list(APPEND SOURCES
|
list(APPEND SOURCES
|
||||||
common/QskArcMetrics.cpp
|
common/QskArcMetrics.cpp
|
||||||
common/QskArcHints.cpp
|
|
||||||
common/QskAspect.cpp
|
common/QskAspect.cpp
|
||||||
common/QskBoxBorderColors.cpp
|
common/QskBoxBorderColors.cpp
|
||||||
common/QskBoxBorderMetrics.cpp
|
common/QskBoxBorderMetrics.cpp
|
||||||
|
|
@ -510,7 +508,7 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
|
if (QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
|
||||||
qsk_add_shaders( ${target} "qskshaders" FILES ${SHADERS} OUTPUT_TARGETS shader_target)
|
qsk_add_shaders( ${target} FILES ${SHADERS} OUTPUT_TARGETS shader_target)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_include_directories(${target} PUBLIC
|
target_include_directories(${target} PUBLIC
|
||||||
|
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) The authors
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "QskArcHints.h"
|
|
||||||
#include "QskRgbValue.h"
|
|
||||||
|
|
||||||
static inline qreal qskInterpolated( qreal from, qreal to, qreal ratio )
|
|
||||||
{
|
|
||||||
return from + ( to - from ) * ratio;
|
|
||||||
}
|
|
||||||
|
|
||||||
QskArcHints::QskArcHints()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QskArcHints::QskArcHints( const QskArcMetrics& metrics, qreal borderWidth,
|
|
||||||
const QColor& borderColor, const QskGradient& gradient )
|
|
||||||
: metrics( metrics )
|
|
||||||
, borderWidth( borderWidth )
|
|
||||||
, borderColor( borderColor )
|
|
||||||
, gradient( gradient )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QskArcHints::isVisible() const
|
|
||||||
{
|
|
||||||
if ( metrics.isNull() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ( borderWidth > 0.0 && borderColor.isValid() && borderColor.alpha() > 0 )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return gradient.isVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
QskArcHints QskArcHints::toAbsolute( const QSizeF& size ) const noexcept
|
|
||||||
{
|
|
||||||
return QskArcHints( metrics.toAbsolute( size ),
|
|
||||||
borderWidth, borderColor, gradient );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskArcHints QskArcHints::interpolated(
|
|
||||||
const QskArcHints& to, qreal value ) const noexcept
|
|
||||||
{
|
|
||||||
return QskArcHints(
|
|
||||||
metrics.interpolated( to.metrics, value ),
|
|
||||||
qskInterpolated( borderWidth, to.borderWidth, value ),
|
|
||||||
QskRgb::interpolated( borderColor, to.borderColor, value ),
|
|
||||||
gradient.interpolated( to.gradient, value )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
|
||||||
|
|
||||||
#include <qdebug.h>
|
|
||||||
|
|
||||||
QDebug operator<<( QDebug debug, const QskArcHints& hints )
|
|
||||||
{
|
|
||||||
debug << hints.metrics << hints.borderWidth
|
|
||||||
<< hints.borderColor << hints.gradient;
|
|
||||||
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "moc_QskArcHints.cpp"
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) The authors
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QSK_ARC_HINTS_H
|
|
||||||
#define QSK_ARC_HINTS_H
|
|
||||||
|
|
||||||
#include "QskArcMetrics.h"
|
|
||||||
#include "QskGradient.h"
|
|
||||||
#include <qcolor.h>
|
|
||||||
|
|
||||||
class QSK_EXPORT QskArcHints
|
|
||||||
{
|
|
||||||
Q_GADGET
|
|
||||||
|
|
||||||
Q_PROPERTY( QskArcMetrics metrics MEMBER metrics )
|
|
||||||
Q_PROPERTY( qreal borderWidth MEMBER borderWidth )
|
|
||||||
Q_PROPERTY( QColor borderColor MEMBER borderColor )
|
|
||||||
|
|
||||||
public:
|
|
||||||
QskArcHints();
|
|
||||||
QskArcHints( const QskArcMetrics&, qreal borderWidth,
|
|
||||||
const QColor& borderColor, const QskGradient& );
|
|
||||||
|
|
||||||
QskArcHints toAbsolute( const QSizeF& ) const noexcept;
|
|
||||||
|
|
||||||
QskArcHints interpolated(
|
|
||||||
const QskArcHints&, qreal value ) const noexcept;
|
|
||||||
|
|
||||||
bool isVisible() const;
|
|
||||||
|
|
||||||
QskArcMetrics metrics;
|
|
||||||
qreal borderWidth = 0.0;
|
|
||||||
|
|
||||||
QColor borderColor;
|
|
||||||
QskGradient gradient;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
|
||||||
|
|
||||||
class QDebug;
|
|
||||||
QSK_EXPORT QDebug operator<<( QDebug, const QskArcHints& );
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -81,7 +81,7 @@ QskGradient::QskGradient( const QColor& color1, const QColor& color2 )
|
||||||
QskGradient::QskGradient( QGradient::Preset preset )
|
QskGradient::QskGradient( QGradient::Preset preset )
|
||||||
: QskGradient()
|
: QskGradient()
|
||||||
{
|
{
|
||||||
setStops( qskFromQGradientStops( QGradient( preset ).stops() ) );
|
setStops( qskBuildGradientStops( QGradient( preset ).stops() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::QskGradient( const QVector< QskGradientStop >& stops )
|
QskGradient::QskGradient( const QVector< QskGradientStop >& stops )
|
||||||
|
|
@ -165,7 +165,7 @@ QskGradient::QskGradient( const QGradient& qGradient )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setStops( qskFromQGradientStops( qGradient.stops() ) );
|
setStops( qskBuildGradientStops( qGradient.stops() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::QskGradient( const QskGradient& other ) noexcept
|
QskGradient::QskGradient( const QskGradient& other ) noexcept
|
||||||
|
|
@ -305,7 +305,7 @@ void QskGradient::setStops( const QColor& color1, const QColor& color2 )
|
||||||
|
|
||||||
void QskGradient::setStops( QGradient::Preset preset )
|
void QskGradient::setStops( QGradient::Preset preset )
|
||||||
{
|
{
|
||||||
const auto stops = qskFromQGradientStops( QGradient( preset ).stops() );
|
const auto stops = qskBuildGradientStops( QGradient( preset ).stops() );
|
||||||
setStops( stops );
|
setStops( stops );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,31 +23,6 @@ static void qskRegisterGradientStop()
|
||||||
|
|
||||||
Q_CONSTRUCTOR_FUNCTION( qskRegisterGradientStop )
|
Q_CONSTRUCTOR_FUNCTION( qskRegisterGradientStop )
|
||||||
|
|
||||||
static inline qreal qskBoundedStopPos( qreal pos )
|
|
||||||
{
|
|
||||||
if ( ( pos < 0.0 ) || qFuzzyIsNull( pos ) )
|
|
||||||
return 0.0;
|
|
||||||
|
|
||||||
if ( ( pos > 1.0 ) || qFuzzyCompare( pos, 1.0 ) )
|
|
||||||
return 1.0;
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline QVector< QskGradientStop >
|
|
||||||
qskNormalizedStops( const QVector< QskGradientStop >& stops )
|
|
||||||
{
|
|
||||||
auto s = stops;
|
|
||||||
|
|
||||||
if ( s.first().position() > 0.0 )
|
|
||||||
s.prepend( QskGradientStop( 0.0, s.first().color() ) );
|
|
||||||
|
|
||||||
if ( s.last().position() < 1.0 )
|
|
||||||
s.append( QskGradientStop( 1.0, s.last().color() ) );
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QskGradientStop::setPosition( qreal position ) noexcept
|
void QskGradientStop::setPosition( qreal position ) noexcept
|
||||||
{
|
{
|
||||||
m_position = position;
|
m_position = position;
|
||||||
|
|
@ -81,19 +56,26 @@ QskHashValue QskGradientStop::hash( QskHashValue seed ) const noexcept
|
||||||
return qHashBits( &m_color, sizeof( m_color ), hash );
|
return qHashBits( &m_color, sizeof( m_color ), hash );
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradientStop QskGradientStop::interpolated(
|
QColor QskGradientStop::interpolated(
|
||||||
const QskGradientStop& to, qreal ratio ) const
|
const QskGradientStop& s1, const QskGradientStop& s2, qreal position ) noexcept
|
||||||
{
|
{
|
||||||
return QskGradientStop(
|
if ( s1.color() == s2.color() )
|
||||||
m_position + ( to.m_position - m_position ) * ratio,
|
return s1.color();
|
||||||
QskRgb::interpolated( m_color, to.m_color, ratio )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant QskGradientStop::interpolate(
|
auto min = &s1;
|
||||||
const QskGradientStop& from, const QskGradientStop& to, qreal ratio )
|
auto max = &s2;
|
||||||
{
|
|
||||||
return QVariant::fromValue( from.interpolated( to, ratio ) );
|
if ( min->position() > max->position() )
|
||||||
|
std::swap( min, max );
|
||||||
|
|
||||||
|
if ( position <= min->position() )
|
||||||
|
return min->color();
|
||||||
|
|
||||||
|
if ( position >= max->position() )
|
||||||
|
return max->color();
|
||||||
|
|
||||||
|
const qreal r = ( position - min->position() ) / ( max->position() - min->position() );
|
||||||
|
return QskRgb::interpolated( min->color(), max->color(), r );
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
|
|
@ -113,23 +95,19 @@ QDebug operator<<( QDebug debug, const QskGradientStop& stop )
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "moc_QskGradientStop.cpp"
|
||||||
|
|
||||||
// some helper functions around QskGradientStops
|
// some helper functions around QskGradientStops
|
||||||
|
|
||||||
static inline QColor qskColorAtPosition(
|
static inline QColor qskInterpolatedColor(
|
||||||
const QskGradientStop& s1, const QskGradientStop& s2, qreal pos )
|
const QskGradientStops& stops, int index1, int index2, qreal position )
|
||||||
{
|
{
|
||||||
const auto dp = s2.position() - s1.position();
|
const auto max = static_cast< int >( stops.count() ) - 1;
|
||||||
if ( qFuzzyIsNull( dp ) )
|
|
||||||
return s1.color();
|
|
||||||
|
|
||||||
return QskRgb::interpolated(
|
index1 = qBound( 0, index1, max );
|
||||||
s1.color(), s2.color(), ( pos - s1.position() ) / dp );
|
index2 = qBound( 0, index2, max );
|
||||||
}
|
|
||||||
|
|
||||||
static inline QskGradientStop qskCreateStopAtPosition(
|
return QskGradientStop::interpolated( stops[ index1 ], stops[ index2 ], position );
|
||||||
const QskGradientStop& s1, const QskGradientStop& s2, qreal pos )
|
|
||||||
{
|
|
||||||
return { pos, qskColorAtPosition( s1, s2, pos ) };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qskIsVisible( const QskGradientStops& stops ) noexcept
|
bool qskIsVisible( const QskGradientStops& stops ) noexcept
|
||||||
|
|
@ -300,126 +278,43 @@ QColor qskInterpolatedColorAt( const QskGradientStops& stops, qreal pos ) noexce
|
||||||
if ( stops.isEmpty() )
|
if ( stops.isEmpty() )
|
||||||
return QColor();
|
return QColor();
|
||||||
|
|
||||||
|
pos = qBound( 0.0, pos, 1.0 );
|
||||||
|
|
||||||
if ( pos <= stops.first().position() )
|
if ( pos <= stops.first().position() )
|
||||||
return stops.first().color();
|
return stops.first().color();
|
||||||
|
|
||||||
for ( int i = 1; i < stops.count(); i++ )
|
for ( int i = 1; i < stops.count(); i++ )
|
||||||
{
|
{
|
||||||
if ( pos <= stops[ i ].position() )
|
if ( pos <= stops[i].position() )
|
||||||
return qskColorAtPosition( stops[ i - 1 ], stops[ i ], pos );
|
return qskInterpolatedColor( stops, i - 1, i, pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
return stops.last().color();
|
return stops.last().color();
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradientStops qskReplacedGradientStops( const QskGradientStops& gradientStops,
|
|
||||||
const QskGradientStop& stop1, const QskGradientStop& stop2 )
|
|
||||||
{
|
|
||||||
if ( stop1.position() >= stop2.position() )
|
|
||||||
return gradientStops;
|
|
||||||
|
|
||||||
const auto s1 = QskGradientStop( qskBoundedStopPos( stop1.position() ), stop1.color() );
|
|
||||||
const auto s2 = QskGradientStop( qskBoundedStopPos( stop2.position() ), stop2.color() );
|
|
||||||
|
|
||||||
QskGradientStops stops;
|
|
||||||
|
|
||||||
if ( s1.position() == 0.0 && s2.position() == 1.0 )
|
|
||||||
{
|
|
||||||
stops = { s1, s2 };
|
|
||||||
}
|
|
||||||
else if ( qskIsMonochrome( gradientStops ) )
|
|
||||||
{
|
|
||||||
stops.reserve( 4 );
|
|
||||||
|
|
||||||
const auto c = gradientStops.isEmpty()
|
|
||||||
? QColor::fromRgba( 0 ) : gradientStops.first().color();
|
|
||||||
|
|
||||||
if ( s1.position() > 0.0 )
|
|
||||||
stops += { s1.position(), c };
|
|
||||||
|
|
||||||
stops += s1;
|
|
||||||
stops += s2;
|
|
||||||
|
|
||||||
if ( s2.position() < 1.0 )
|
|
||||||
stops += { s2.position(), c };
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// not the most efficient implementation - maybe later TODO ...
|
|
||||||
const auto stops0 = qskNormalizedStops( gradientStops );
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
if ( s1.position() > 0.0 )
|
|
||||||
{
|
|
||||||
while ( s1.position() > stops0[i].position() )
|
|
||||||
stops += stops0[i++];
|
|
||||||
|
|
||||||
if ( s1.position() == stops0[i].position() )
|
|
||||||
stops += stops0[i++];
|
|
||||||
else
|
|
||||||
stops += qskCreateStopAtPosition( stops0[i - 1], stops0[i], s1.position() );
|
|
||||||
}
|
|
||||||
|
|
||||||
stops += s1;
|
|
||||||
|
|
||||||
while ( s2.position() > stops0[i].position() )
|
|
||||||
i++;
|
|
||||||
|
|
||||||
stops += s2;
|
|
||||||
|
|
||||||
if ( s2.position() < 1.0 )
|
|
||||||
{
|
|
||||||
while ( stops0[i + 1].position() == s2.position() )
|
|
||||||
i++;
|
|
||||||
|
|
||||||
if ( s2.position() != stops0[i].position() )
|
|
||||||
stops += qskCreateStopAtPosition( stops0[i - 1], stops0[i], s2.position() );
|
|
||||||
|
|
||||||
while( i < stops0.count() )
|
|
||||||
stops += stops0[i++];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stops;
|
|
||||||
}
|
|
||||||
|
|
||||||
QskGradientStops qskClippedGradientStops(
|
|
||||||
const QskGradientStops& stops, qreal from, qreal to )
|
|
||||||
{
|
|
||||||
return qskReplacedGradientStops( stops, { from, 0 }, { to, 0 } );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskGradientStops qskExtractedGradientStops(
|
QskGradientStops qskExtractedGradientStops(
|
||||||
const QskGradientStops& stops, qreal from, qreal to )
|
const QskGradientStops& gradientStops, qreal from, qreal to )
|
||||||
{
|
{
|
||||||
if ( ( from > to ) || ( to > 1.0 ) || ( from < 0.0 ) || stops.isEmpty() )
|
if ( ( from > to ) || ( from > 1.0 ) || gradientStops.isEmpty() )
|
||||||
return QskGradientStops();
|
return QskGradientStops();
|
||||||
|
|
||||||
from = qskBoundedStopPos( from );
|
if ( ( from <= 0.0 ) && ( to >= 1.0 ) )
|
||||||
to = qskBoundedStopPos( to );
|
return gradientStops;
|
||||||
|
|
||||||
if ( ( from == 0.0 ) && ( to == 1.0 ) )
|
from = qMax( from, 0.0 );
|
||||||
return stops;
|
to = qMin( to, 1.0 );
|
||||||
|
|
||||||
if ( from == to )
|
QVector< QskGradientStop > stops1 = gradientStops;
|
||||||
{
|
|
||||||
const auto color = qskInterpolatedColorAt( stops, from );
|
|
||||||
|
|
||||||
QVector< QskGradientStop > s;
|
#if 1
|
||||||
s.reserve( 2 );
|
// not the most efficient implementation - maybe later TODO ...
|
||||||
s += QskGradientStop( 0.0, color );
|
|
||||||
s += QskGradientStop( 1.0, color );
|
|
||||||
|
|
||||||
return s;
|
if ( stops1.first().position() > 0.0 )
|
||||||
}
|
stops1.prepend( QskGradientStop( 0.0, stops1.first().color() ) );
|
||||||
|
|
||||||
/*
|
if ( stops1.last().position() < 1.0 )
|
||||||
For situations where we have no stops at 0.0 and 1.0 we insert them
|
stops1.append( QskGradientStop( 1.0, stops1.last().color() ) );
|
||||||
manually. Not the most efficient implementation, but we avoid having
|
#endif
|
||||||
to deal with these situations for the moment. TODO ...
|
|
||||||
*/
|
|
||||||
const auto stops1 = qskNormalizedStops( stops );
|
|
||||||
|
|
||||||
QVector< QskGradientStop > stops2;
|
QVector< QskGradientStop > stops2;
|
||||||
stops2.reserve( stops1.count() );
|
stops2.reserve( stops1.count() );
|
||||||
|
|
@ -436,26 +331,26 @@ QskGradientStops qskExtractedGradientStops(
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if ( from == 0.0 )
|
for ( ; i < stops1.count(); i++ )
|
||||||
{
|
{
|
||||||
stops2 += stops1[i++];
|
if ( stops1[i].position() > from )
|
||||||
}
|
break;
|
||||||
else
|
|
||||||
{
|
|
||||||
while( stops1[++i].position() <= from ); // skip leading stops
|
|
||||||
|
|
||||||
stops2 += QskGradientStop( 0.0,
|
|
||||||
qskColorAtPosition( stops1[i - 1], stops1[ i ], from ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while ( stops1[i].position() < to )
|
stops2 += QskGradientStop( 0.0,
|
||||||
|
qskInterpolatedColor( stops1, i - 1, i, from ) );
|
||||||
|
|
||||||
|
for ( ; i < stops1.count(); i++ )
|
||||||
{
|
{
|
||||||
|
if ( stops1[i].position() >= to )
|
||||||
|
break;
|
||||||
|
|
||||||
const auto pos = ( stops1[i].position() - from ) / ( to - from );
|
const auto pos = ( stops1[i].position() - from ) / ( to - from );
|
||||||
stops2 += QskGradientStop( pos, stops1[i++].color() );
|
stops2 += QskGradientStop( pos, stops1[i].color() );
|
||||||
}
|
}
|
||||||
|
|
||||||
stops2 += QskGradientStop( 1.0,
|
stops2 += QskGradientStop( 1.0,
|
||||||
qskColorAtPosition( stops1[i - 1], stops1[ i ], to ) );
|
qskInterpolatedColor( stops1, i, i + 1, to ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return stops2;
|
return stops2;
|
||||||
|
|
@ -472,7 +367,7 @@ QskGradientStops qskRevertedGradientStops( const QskGradientStops& stops )
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector< QskGradientStop > qskFromQGradientStops( const QGradientStops& qtStops )
|
QVector< QskGradientStop > qskBuildGradientStops( const QGradientStops& qtStops )
|
||||||
{
|
{
|
||||||
QVector< QskGradientStop > stops;
|
QVector< QskGradientStop > stops;
|
||||||
stops.reserve( qtStops.count() );
|
stops.reserve( qtStops.count() );
|
||||||
|
|
@ -568,5 +463,3 @@ QGradientStops qskToQGradientStops( const QskGradientStops& stops )
|
||||||
|
|
||||||
return qStops;
|
return qStops;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "moc_QskGradientStop.cpp"
|
|
||||||
|
|
|
||||||
|
|
@ -45,10 +45,8 @@ class QSK_EXPORT QskGradientStop
|
||||||
void setRgb( QRgb ) noexcept;
|
void setRgb( QRgb ) noexcept;
|
||||||
QRgb rgb() const noexcept;
|
QRgb rgb() const noexcept;
|
||||||
|
|
||||||
QskGradientStop interpolated( const QskGradientStop&, qreal ) const;
|
static QColor interpolated(
|
||||||
|
const QskGradientStop&, const QskGradientStop&, qreal position ) noexcept;
|
||||||
static QVariant interpolate( const QskGradientStop&,
|
|
||||||
const QskGradientStop&, qreal );
|
|
||||||
|
|
||||||
QskHashValue hash( QskHashValue seed ) const noexcept;
|
QskHashValue hash( QskHashValue seed ) const noexcept;
|
||||||
|
|
||||||
|
|
@ -131,48 +129,27 @@ QSK_EXPORT QskGradientStops qskInterpolatedGradientStops(
|
||||||
const QskGradientStops&, bool, const QskGradientStops&, bool,
|
const QskGradientStops&, bool, const QskGradientStops&, bool,
|
||||||
qreal ratio );
|
qreal ratio );
|
||||||
|
|
||||||
// interpolating colors in direction of a color.
|
|
||||||
QSK_EXPORT QskGradientStops qskInterpolatedGradientStops(
|
QSK_EXPORT QskGradientStops qskInterpolatedGradientStops(
|
||||||
const QskGradientStops&, const QColor&, qreal ratio );
|
const QskGradientStops&, const QColor&, qreal ratio );
|
||||||
|
|
||||||
// interpolating colors starting from a color.
|
|
||||||
QSK_EXPORT QskGradientStops qskInterpolatedGradientStops(
|
QSK_EXPORT QskGradientStops qskInterpolatedGradientStops(
|
||||||
const QColor&, const QskGradientStops&, qreal ratio );
|
const QColor&, const QskGradientStops&, qreal ratio );
|
||||||
|
|
||||||
// interpolating the opacity of the colors
|
|
||||||
QSK_EXPORT QskGradientStops qskTransparentGradientStops(
|
QSK_EXPORT QskGradientStops qskTransparentGradientStops(
|
||||||
const QskGradientStops&, qreal ratio );
|
const QskGradientStops&, qreal ratio );
|
||||||
|
|
||||||
// extracting the colors of [from, to ] and stretching them to [0.0, 1.0]
|
|
||||||
QSK_EXPORT QskGradientStops qskExtractedGradientStops(
|
QSK_EXPORT QskGradientStops qskExtractedGradientStops(
|
||||||
const QskGradientStops&, qreal from, qreal to );
|
const QskGradientStops&, qreal from, qreal to );
|
||||||
|
|
||||||
// reverting the color stops
|
|
||||||
QSK_EXPORT QskGradientStops qskRevertedGradientStops( const QskGradientStops& );
|
|
||||||
|
|
||||||
QSK_EXPORT QskGradientStops qskReplacedGradientStops(
|
|
||||||
const QskGradientStops&, const QskGradientStop&, const QskGradientStop& );
|
|
||||||
|
|
||||||
QSK_EXPORT QskGradientStops qskClippedGradientStops(
|
|
||||||
const QskGradientStops&, qreal from, qreal to );
|
|
||||||
|
|
||||||
/*
|
|
||||||
creating equidistant color stops from a list of colors.
|
|
||||||
when discrete is true the result will contain 2 stops at each position
|
|
||||||
one with the previous and one with the following color so that the
|
|
||||||
interval [pos1-pos2] will be monochrome.
|
|
||||||
*/
|
|
||||||
QSK_EXPORT QskGradientStops qskBuildGradientStops(
|
QSK_EXPORT QskGradientStops qskBuildGradientStops(
|
||||||
const QVector< QRgb >&, bool discrete = false );
|
const QVector< QRgb >&, bool discrete = false );
|
||||||
|
|
||||||
QSK_EXPORT QskGradientStops qskBuildGradientStops(
|
QSK_EXPORT QskGradientStops qskBuildGradientStops(
|
||||||
const QVector< QColor >&, bool discrete = false );
|
const QVector< QColor >&, bool discrete = false );
|
||||||
|
|
||||||
/*
|
QSK_EXPORT QskGradientStops qskRevertedGradientStops( const QskGradientStops& );
|
||||||
convert color stops from/to a vector of QGradientStop, that can be
|
|
||||||
used for QGradients.
|
QSK_EXPORT QskGradientStops qskBuildGradientStops( const QVector< QGradientStop >& );
|
||||||
*/
|
|
||||||
QSK_EXPORT QskGradientStops qskFromQGradientStops( const QVector< QGradientStop >& );
|
|
||||||
QSK_EXPORT QVector< QGradientStop > qskToQGradientStops( const QVector< QskGradientStop >& );
|
QSK_EXPORT QVector< QGradientStop > qskToQGradientStops( const QVector< QskGradientStop >& );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ class QSK_EXPORT QskTextColors
|
||||||
void setLinkColor( QRgb );
|
void setLinkColor( QRgb );
|
||||||
void setLinkColor( Qt::GlobalColor );
|
void setLinkColor( Qt::GlobalColor );
|
||||||
|
|
||||||
QskTextColors interpolated( const QskTextColors&, qreal ratio ) const;
|
QskTextColors interpolated( const QskTextColors&, qreal value ) const;
|
||||||
|
|
||||||
static QVariant interpolate( const QskTextColors&,
|
static QVariant interpolate( const QskTextColors&,
|
||||||
const QskTextColors&, qreal ratio );
|
const QskTextColors&, qreal ratio );
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@
|
||||||
#include "QskGraphic.h"
|
#include "QskGraphic.h"
|
||||||
#include "QskColorFilter.h"
|
#include "QskColorFilter.h"
|
||||||
#include "QskTextOptions.h"
|
#include "QskTextOptions.h"
|
||||||
#include "QskBoxHints.h"
|
|
||||||
#include "QskFunctions.h"
|
#include "QskFunctions.h"
|
||||||
#include "QskMargins.h"
|
#include "QskMargins.h"
|
||||||
#include "QskFunctions.h"
|
#include "QskFunctions.h"
|
||||||
|
|
@ -573,13 +572,11 @@ QSGNode* QskMenuSkinlet::updateSampleNode( const QskSkinnable* skinnable,
|
||||||
|
|
||||||
if ( subControl == Q::Separator )
|
if ( subControl == Q::Separator )
|
||||||
{
|
{
|
||||||
auto hints = skinnable->boxHints( subControl );
|
auto gradient = menu->gradientHint( subControl );
|
||||||
|
|
||||||
auto& gradient = hints.gradient;
|
|
||||||
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
|
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
|
||||||
gradient.setLinearDirection( Qt::Vertical );
|
gradient.setLinearDirection( Qt::Vertical );
|
||||||
|
|
||||||
return updateBoxNode( menu, node, rect, hints );
|
return updateBoxNode( menu, node, rect, gradient, subControl );
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
#include "QskPopupSkinlet.h"
|
#include "QskPopupSkinlet.h"
|
||||||
#include "QskPopup.h"
|
#include "QskPopup.h"
|
||||||
#include "QskRgbValue.h"
|
#include "QskRgbValue.h"
|
||||||
#include "QskBoxHints.h"
|
|
||||||
|
|
||||||
static inline QRgb qskInterpolatedRgb( QRgb rgb, qreal factor )
|
static inline QRgb qskInterpolatedRgb( QRgb rgb, qreal factor )
|
||||||
{
|
{
|
||||||
|
|
@ -59,9 +58,7 @@ QSGNode* QskPopupSkinlet::updateOverlayNode(
|
||||||
if ( rect.isEmpty() )
|
if ( rect.isEmpty() )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto hints = popup->boxHints( Q::Overlay );
|
auto gradient = popup->gradientHint( Q::Overlay );
|
||||||
|
|
||||||
auto& gradient = hints.gradient;
|
|
||||||
|
|
||||||
if ( gradient.isVisible() && factor != 1.0 )
|
if ( gradient.isVisible() && factor != 1.0 )
|
||||||
{
|
{
|
||||||
|
|
@ -73,7 +70,7 @@ QSGNode* QskPopupSkinlet::updateOverlayNode(
|
||||||
gradient.setStops( stops );
|
gradient.setStops( stops );
|
||||||
}
|
}
|
||||||
|
|
||||||
return updateBoxNode( popup, node, rect, hints );
|
return updateBoxNode( popup, node, rect, gradient, QskPopup::Overlay );
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "moc_QskPopupSkinlet.cpp"
|
#include "moc_QskPopupSkinlet.cpp"
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
#include "QskProgressBarSkinlet.h"
|
#include "QskProgressBarSkinlet.h"
|
||||||
#include "QskProgressBar.h"
|
#include "QskProgressBar.h"
|
||||||
#include "QskIntervalF.h"
|
#include "QskIntervalF.h"
|
||||||
#include "QskBoxHints.h"
|
#include "QskBoxBorderMetrics.h"
|
||||||
|
|
||||||
#include <qeasingcurve.h>
|
#include <qeasingcurve.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
@ -50,6 +50,41 @@ static QskIntervalF qskFillInterval( const QskProgressIndicator* indicator )
|
||||||
return QskIntervalF( pos1, pos2 );
|
return QskIntervalF( pos1, pos2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QskGradient qskFillGradient( const QskProgressBar* progressBar )
|
||||||
|
{
|
||||||
|
auto gradient = progressBar->gradientHint( Q::Fill );
|
||||||
|
|
||||||
|
if ( gradient.isVisible() && !gradient.isMonochrome()
|
||||||
|
&& ( gradient.type() == QskGradient::Stops ) )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
When having stops only we use a linear gradient,
|
||||||
|
where the colors are increasing in direction of the
|
||||||
|
progress value. We interprete the gradient as a
|
||||||
|
definition for the 100% situation and have to adjust
|
||||||
|
the stops for smaller bars.
|
||||||
|
|
||||||
|
For this situation it would be more convenient to
|
||||||
|
adjust the start/stop positions, but the box renderer is
|
||||||
|
not supporting this yet. TODO ...
|
||||||
|
*/
|
||||||
|
|
||||||
|
const auto intv = qskFillInterval( progressBar );
|
||||||
|
|
||||||
|
const auto stops = qskExtractedGradientStops(
|
||||||
|
gradient.stops(), intv.lowerBound(), intv.upperBound() );
|
||||||
|
|
||||||
|
gradient.setStops( stops );
|
||||||
|
|
||||||
|
gradient.setLinearDirection( progressBar->orientation() );
|
||||||
|
|
||||||
|
if ( progressBar->orientation() == Qt::Vertical || progressBar->layoutMirroring() )
|
||||||
|
gradient.reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
return gradient;
|
||||||
|
}
|
||||||
|
|
||||||
QskProgressBarSkinlet::QskProgressBarSkinlet( QskSkin* skin )
|
QskProgressBarSkinlet::QskProgressBarSkinlet( QskSkin* skin )
|
||||||
: Inherited( skin )
|
: Inherited( skin )
|
||||||
{
|
{
|
||||||
|
|
@ -87,40 +122,9 @@ QSGNode* QskProgressBarSkinlet::updateFillNode(
|
||||||
if ( rect.isEmpty() )
|
if ( rect.isEmpty() )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto hints = indicator->boxHints( Q::Fill );
|
const auto progressBar = static_cast< const Q* >( indicator );
|
||||||
|
return updateBoxNode( indicator, node, rect,
|
||||||
auto& gradient = hints.gradient;
|
qskFillGradient( progressBar ), Q::Fill );
|
||||||
|
|
||||||
if ( gradient.isVisible() && !gradient.isMonochrome()
|
|
||||||
&& ( gradient.type() == QskGradient::Stops ) )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
When having stops only we use a linear gradient,
|
|
||||||
where the colors are increasing in direction of the
|
|
||||||
progress value. We interprete the gradient as a
|
|
||||||
definition for the 100% situation and have to adjust
|
|
||||||
the stops for smaller bars.
|
|
||||||
|
|
||||||
For this situation it would be more convenient to
|
|
||||||
adjust the start/stop positions, but the box renderer is
|
|
||||||
not supporting this yet. TODO ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
const auto intv = qskFillInterval( indicator );
|
|
||||||
|
|
||||||
const auto stops = qskExtractedGradientStops(
|
|
||||||
gradient.stops(), intv.lowerBound(), intv.upperBound() );
|
|
||||||
|
|
||||||
gradient.setStops( stops );
|
|
||||||
|
|
||||||
const auto orientation = static_cast< const Q* >( indicator )->orientation();
|
|
||||||
gradient.setLinearDirection( orientation );
|
|
||||||
|
|
||||||
if ( orientation == Qt::Vertical || indicator->layoutMirroring() )
|
|
||||||
gradient.reverse();
|
|
||||||
}
|
|
||||||
|
|
||||||
return updateBoxNode( indicator, node, rect, hints );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF QskProgressBarSkinlet::grooveRect(
|
QRectF QskProgressBarSkinlet::grooveRect(
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "QskProgressRingSkinlet.h"
|
#include "QskProgressRingSkinlet.h"
|
||||||
#include "QskArcHints.h"
|
#include "QskArcMetrics.h"
|
||||||
#include "QskProgressRing.h"
|
#include "QskProgressRing.h"
|
||||||
#include "QskIntervalF.h"
|
#include "QskIntervalF.h"
|
||||||
|
|
||||||
|
|
@ -85,12 +85,8 @@ QSGNode* QskProgressRingSkinlet::updateGrooveNode(
|
||||||
endAngle = fillAngles.first - 360.0 + spacing;
|
endAngle = fillAngles.first - 360.0 + spacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto hints = indicator->arcHints( Q::Groove );
|
return updateArcNode( ring, node,
|
||||||
hints.metrics.setStartAngle( startAngle );
|
startAngle, endAngle - startAngle, Q::Groove );
|
||||||
hints.metrics.setSpanAngle( endAngle - startAngle );
|
|
||||||
|
|
||||||
const auto rect = indicator->subControlRect( Q::Groove );
|
|
||||||
return updateArcNode( ring, node, rect, hints );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -108,14 +104,16 @@ QSGNode* QskProgressRingSkinlet::updateFillNode(
|
||||||
if ( rect.isEmpty() )
|
if ( rect.isEmpty() )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto hints = ring->arcHints( subControl );
|
const auto metrics = ring->arcMetricsHint( subControl );
|
||||||
if ( !hints.isVisible() )
|
if ( metrics.isNull() )
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
auto gradient = ring->gradientHint( subControl );
|
||||||
|
if ( !gradient.isVisible() )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
const auto intv = qskFillInterval( ring );
|
const auto intv = qskFillInterval( ring );
|
||||||
|
|
||||||
auto& gradient = hints.gradient;
|
|
||||||
|
|
||||||
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
|
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
|
||||||
{
|
{
|
||||||
const auto stops = qskExtractedGradientStops( gradient.stops(),
|
const auto stops = qskExtractedGradientStops( gradient.stops(),
|
||||||
|
|
@ -123,15 +121,14 @@ QSGNode* QskProgressRingSkinlet::updateFillNode(
|
||||||
|
|
||||||
gradient.setStops( stops );
|
gradient.setStops( stops );
|
||||||
|
|
||||||
if ( hints.metrics.spanAngle() < 0.0 )
|
if ( metrics.spanAngle() < 0.0 )
|
||||||
gradient.reverse();
|
gradient.reverse();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto angles = qskFillAngles( hints.metrics, intv );
|
const auto angles = qskFillAngles( metrics, intv );
|
||||||
hints.metrics.setStartAngle( angles.first );
|
|
||||||
hints.metrics.setSpanAngle( angles.second - angles.first );
|
|
||||||
|
|
||||||
return updateArcNode( ring, node, rect, hints );
|
return updateArcNode( ring, node, rect, gradient,
|
||||||
|
angles.first, angles.second - angles.first, subControl );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSizeF QskProgressRingSkinlet::sizeHint( const QskSkinnable* skinnable,
|
QSizeF QskProgressRingSkinlet::sizeHint( const QskSkinnable* skinnable,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
#include "QskSeparatorSkinlet.h"
|
#include "QskSeparatorSkinlet.h"
|
||||||
#include "QskSeparator.h"
|
#include "QskSeparator.h"
|
||||||
|
|
||||||
#include "QskBoxHints.h"
|
|
||||||
#include "QskGradientDirection.h"
|
#include "QskGradientDirection.h"
|
||||||
#include "QskAspect.h"
|
#include "QskAspect.h"
|
||||||
|
|
||||||
|
|
@ -43,12 +42,8 @@ QSGNode* QskSeparatorSkinlet::updateSubNode(
|
||||||
using Q = QskSeparator;
|
using Q = QskSeparator;
|
||||||
|
|
||||||
const auto rect = separator->subControlRect( Q::Panel );
|
const auto rect = separator->subControlRect( Q::Panel );
|
||||||
if ( rect.isEmpty() )
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
auto hints = separator->boxHints( Q::Panel );
|
auto gradient = separator->gradientHint( Q::Panel );
|
||||||
|
|
||||||
auto& gradient = hints.gradient;
|
|
||||||
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
|
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
|
||||||
{
|
{
|
||||||
// gradient in opposite orientation
|
// gradient in opposite orientation
|
||||||
|
|
@ -58,7 +53,7 @@ QSGNode* QskSeparatorSkinlet::updateSubNode(
|
||||||
gradient.setLinearDirection( orientation );
|
gradient.setLinearDirection( orientation );
|
||||||
}
|
}
|
||||||
|
|
||||||
return updateBoxNode( separator, node, rect, hints );
|
return updateBoxNode( separator, node, rect, gradient, Q::Panel );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,9 @@
|
||||||
|
|
||||||
#include "QskArcNode.h"
|
#include "QskArcNode.h"
|
||||||
#include "QskAspect.h"
|
#include "QskAspect.h"
|
||||||
#include "QskArcHints.h"
|
#include "QskArcMetrics.h"
|
||||||
|
#include "QskBoxBorderColors.h"
|
||||||
|
#include "QskBoxBorderMetrics.h"
|
||||||
#include "QskBoxNode.h"
|
#include "QskBoxNode.h"
|
||||||
#include "QskBoxRectangleNode.h"
|
#include "QskBoxRectangleNode.h"
|
||||||
#include "QskBoxShapeMetrics.h"
|
#include "QskBoxShapeMetrics.h"
|
||||||
|
|
@ -154,6 +156,18 @@ static inline bool qskIsBoxVisible( const QskBoxBorderMetrics& borderMetrics,
|
||||||
return !borderMetrics.isNull() && borderColors.isVisible();
|
return !borderMetrics.isNull() && borderColors.isVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool qskIsArcVisible( const QskArcMetrics& arcMetrics,
|
||||||
|
qreal borderWidth, const QColor borderColor, const QskGradient& gradient )
|
||||||
|
{
|
||||||
|
if ( arcMetrics.isNull() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( borderWidth > 0.0 && borderColor.isValid() && borderColor.alpha() > 0 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return gradient.isVisible();
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool qskIsLineVisible( const QColor& lineColor, qreal lineWidth )
|
static inline bool qskIsLineVisible( const QColor& lineColor, qreal lineWidth )
|
||||||
{
|
{
|
||||||
return ( lineWidth > 0.0 ) && lineColor.isValid() && ( lineColor.alpha() > 0 );
|
return ( lineWidth > 0.0 ) && lineColor.isValid() && ( lineColor.alpha() > 0 );
|
||||||
|
|
@ -188,18 +202,22 @@ static inline QQuickWindow* qskWindowOfSkinnable( const QskSkinnable* skinnable
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline QSGNode* qskUpdateBoxNode( const QskSkinnable* skinnable,
|
static inline QSGNode* qskUpdateBoxNode(
|
||||||
QSGNode* node, const QRectF& rect, const QskBoxHints& hints )
|
const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect,
|
||||||
|
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics,
|
||||||
|
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
|
||||||
|
const QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
|
||||||
{
|
{
|
||||||
if ( !rect.isEmpty() )
|
if ( !rect.isEmpty() )
|
||||||
{
|
{
|
||||||
if ( qskIsBoxVisible( hints.borderMetrics, hints.borderColors, hints.gradient )
|
if ( qskIsBoxVisible( borderMetrics, borderColors, gradient )
|
||||||
|| qskIsShadowVisible( hints.shadowMetrics, hints.shadowColor ) )
|
|| qskIsShadowVisible( shadowMetrics, shadowColor ) )
|
||||||
{
|
{
|
||||||
if ( auto window = qskWindowOfSkinnable( skinnable ) )
|
if ( auto window = qskWindowOfSkinnable( skinnable ) )
|
||||||
{
|
{
|
||||||
auto boxNode = QskSGNode::ensureNode< QskBoxNode >( node );
|
auto boxNode = QskSGNode::ensureNode< QskBoxNode >( node );
|
||||||
boxNode->updateNode( window, rect, hints );
|
boxNode->updateNode( window, rect, shape, borderMetrics,
|
||||||
|
borderColors, gradient, shadowMetrics, shadowColor );
|
||||||
|
|
||||||
return boxNode;
|
return boxNode;
|
||||||
}
|
}
|
||||||
|
|
@ -209,20 +227,21 @@ static inline QSGNode* qskUpdateBoxNode( const QskSkinnable* skinnable,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline QSGNode* qskUpdateArcNode( const QskSkinnable* skinnable,
|
static inline QSGNode* qskUpdateArcNode(
|
||||||
QSGNode* node, const QRectF& rect, const QskArcHints& hints )
|
const QskSkinnable*, QSGNode* node, const QRectF& rect,
|
||||||
|
qreal borderWidth, const QColor borderColor,
|
||||||
|
const QskGradient& gradient, const QskArcMetrics& metrics )
|
||||||
{
|
{
|
||||||
Q_UNUSED( skinnable );
|
if ( rect.isEmpty() )
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
if ( !rect.isEmpty() && hints.isVisible() )
|
if ( !qskIsArcVisible( metrics, borderWidth, borderColor, gradient ) )
|
||||||
{
|
return nullptr;
|
||||||
auto arcNode = QskSGNode::ensureNode< QskArcNode >( node );
|
|
||||||
arcNode->setArcData( rect, hints );
|
|
||||||
|
|
||||||
return arcNode;
|
auto arcNode = QskSGNode::ensureNode< QskArcNode >( node );
|
||||||
}
|
arcNode->setArcData( rect, metrics, borderWidth, borderColor, gradient );
|
||||||
|
|
||||||
return nullptr;
|
return arcNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline QSGNode* qskUpdateLineNode(
|
static inline QSGNode* qskUpdateLineNode(
|
||||||
|
|
@ -415,30 +434,54 @@ void QskSkinlet::replaceChildNode( quint8 role,
|
||||||
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
||||||
QSGNode* node, QskAspect::Subcontrol subControl ) const
|
QSGNode* node, QskAspect::Subcontrol subControl ) const
|
||||||
{
|
{
|
||||||
auto r = qskSubControlRect( this, skinnable, subControl );
|
const auto rect = qskSubControlRect( this, skinnable, subControl );
|
||||||
if ( r.isEmpty() )
|
return updateBoxNode( skinnable, node, rect, subControl );
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
r = r.marginsRemoved( skinnable->marginHint( subControl ) );
|
|
||||||
|
|
||||||
return qskUpdateBoxNode( skinnable, node,
|
|
||||||
r, skinnable->boxHints( subControl ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
||||||
QSGNode* node, const QRectF& rect, QskAspect::Subcontrol subControl )
|
QSGNode* node, const QRectF& rect, QskAspect::Subcontrol subControl )
|
||||||
{
|
{
|
||||||
if ( rect.isEmpty() )
|
const auto fillGradient = skinnable->gradientHint( subControl );
|
||||||
|
return updateBoxNode( skinnable, node, rect, fillGradient, subControl );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
||||||
|
QSGNode* node, const QRectF& rect, const QskGradient& fillGradient,
|
||||||
|
QskAspect::Subcontrol subControl )
|
||||||
|
{
|
||||||
|
const auto margins = skinnable->marginHint( subControl );
|
||||||
|
|
||||||
|
const auto boxRect = rect.marginsRemoved( margins );
|
||||||
|
if ( boxRect.isEmpty() )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
const auto r = rect.marginsRemoved( skinnable->marginHint( subControl ) );
|
const auto borderMetrics = skinnable->boxBorderMetricsHint( subControl );
|
||||||
return qskUpdateBoxNode( skinnable, node, r, skinnable->boxHints( subControl ) );
|
const auto borderColors = skinnable->boxBorderColorsHint( subControl );
|
||||||
|
const auto shape = skinnable->boxShapeHint( subControl );
|
||||||
|
const auto shadowMetrics = skinnable->shadowMetricsHint( subControl );
|
||||||
|
const auto shadowColor = skinnable->shadowColorHint( subControl );
|
||||||
|
|
||||||
|
return qskUpdateBoxNode( skinnable, node,
|
||||||
|
boxRect, shape, borderMetrics, borderColors, fillGradient,
|
||||||
|
shadowMetrics, shadowColor );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateBoxNode(
|
||||||
|
const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect,
|
||||||
|
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics,
|
||||||
|
const QskBoxBorderColors& borderColors, const QskGradient& fillGradient )
|
||||||
|
{
|
||||||
|
return qskUpdateBoxNode( skinnable, node,
|
||||||
|
rect, shape, borderMetrics, borderColors, fillGradient,
|
||||||
|
QskShadowMetrics(), QColor() );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable,
|
||||||
QSGNode* node, const QRectF& rect, const QskBoxHints& hints )
|
QSGNode* node, const QRectF& rect, const QskBoxHints& hints )
|
||||||
{
|
{
|
||||||
return qskUpdateBoxNode( skinnable, node, rect, hints );
|
return qskUpdateBoxNode( skinnable, node, rect,
|
||||||
|
hints.shape, hints.borderMetrics, hints.borderColors, hints.gradient,
|
||||||
|
hints.shadowMetrics, hints.shadowColor );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* QskSkinlet::updateInterpolatedBoxNode(
|
QSGNode* QskSkinlet::updateInterpolatedBoxNode(
|
||||||
|
|
@ -483,24 +526,79 @@ QSGNode* QskSkinlet::updateInterpolatedBoxNode(
|
||||||
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
||||||
QSGNode* node, QskAspect::Subcontrol subControl ) const
|
QSGNode* node, QskAspect::Subcontrol subControl ) const
|
||||||
{
|
{
|
||||||
auto rect = qskSubControlRect( this, skinnable, subControl );
|
const auto rect = qskSubControlRect( this, skinnable, subControl );
|
||||||
rect = rect.marginsRemoved( skinnable->marginHint( subControl ) );
|
return updateArcNode( skinnable, node, rect, subControl );
|
||||||
|
|
||||||
return qskUpdateArcNode( skinnable,
|
|
||||||
node, rect, skinnable->arcHints( subControl ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
|
||||||
QSGNode* node, const QRectF& rect, const QskArcHints& hints )
|
|
||||||
{
|
|
||||||
return qskUpdateArcNode( skinnable, node, rect, hints );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
||||||
QSGNode* node, const QRectF& rect, QskAspect::Subcontrol subControl )
|
QSGNode* node, const QRectF& rect, QskAspect::Subcontrol subControl )
|
||||||
{
|
{
|
||||||
|
const auto fillGradient = skinnable->gradientHint( subControl );
|
||||||
|
return updateArcNode( skinnable, node, rect, fillGradient, subControl );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
||||||
|
QSGNode* node, const QRectF& rect, const QskGradient& fillGradient,
|
||||||
|
QskAspect::Subcontrol subControl )
|
||||||
|
{
|
||||||
|
const auto metrics = skinnable->arcMetricsHint( subControl );
|
||||||
|
const auto r = rect.marginsRemoved( skinnable->marginHint( subControl ) );
|
||||||
|
|
||||||
|
const qreal borderWidth = skinnable->metric( subControl | QskAspect::Border );
|
||||||
|
|
||||||
|
QColor borderColor;
|
||||||
|
if ( borderWidth > 0.0 )
|
||||||
|
borderColor = skinnable->color( subControl | QskAspect::Border );
|
||||||
|
|
||||||
return qskUpdateArcNode( skinnable, node,
|
return qskUpdateArcNode( skinnable, node,
|
||||||
rect, skinnable->arcHints( subControl ) );
|
r, borderWidth, borderColor, fillGradient, metrics );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateArcNode(
|
||||||
|
const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect,
|
||||||
|
qreal borderWidth, const QColor& borderColor,
|
||||||
|
const QskGradient& fillGradient, const QskArcMetrics& metrics )
|
||||||
|
{
|
||||||
|
return qskUpdateArcNode( skinnable, node, rect,
|
||||||
|
borderWidth, borderColor, fillGradient, metrics );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
||||||
|
QSGNode* node, qreal startAngle, qreal spanAngle,
|
||||||
|
QskAspect::Subcontrol subControl ) const
|
||||||
|
{
|
||||||
|
const auto rect = qskSubControlRect( this, skinnable, subControl );
|
||||||
|
|
||||||
|
return updateArcNode( skinnable, node,
|
||||||
|
rect, startAngle, spanAngle, subControl );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
||||||
|
QSGNode* node, const QRectF& rect, qreal startAngle, qreal spanAngle,
|
||||||
|
QskAspect::Subcontrol subControl )
|
||||||
|
{
|
||||||
|
const auto fillGradient = skinnable->gradientHint( subControl );
|
||||||
|
return updateArcNode( skinnable, node, rect,
|
||||||
|
fillGradient, startAngle, spanAngle, subControl );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
|
||||||
|
QSGNode* node, const QRectF& rect, const QskGradient& fillGradient,
|
||||||
|
qreal startAngle, qreal spanAngle, QskAspect::Subcontrol subControl )
|
||||||
|
{
|
||||||
|
auto arcMetrics = skinnable->arcMetricsHint( subControl );
|
||||||
|
arcMetrics.setStartAngle( startAngle );
|
||||||
|
arcMetrics.setSpanAngle( spanAngle );
|
||||||
|
|
||||||
|
const qreal borderWidth = skinnable->metric( subControl | QskAspect::Border );
|
||||||
|
|
||||||
|
QColor borderColor;
|
||||||
|
if ( borderWidth > 0.0 )
|
||||||
|
borderColor = skinnable->color( subControl | QskAspect::Border );
|
||||||
|
|
||||||
|
const auto r = rect.marginsRemoved( skinnable->marginHint( subControl ) );
|
||||||
|
return updateArcNode( skinnable, node, r,
|
||||||
|
borderWidth, borderColor, fillGradient, arcMetrics );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* QskSkinlet::updateLineNode( const QskSkinnable* skinnable,
|
QSGNode* QskSkinlet::updateLineNode( const QskSkinnable* skinnable,
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,10 @@ class QskColorFilter;
|
||||||
class QskGraphic;
|
class QskGraphic;
|
||||||
class QskTextOptions;
|
class QskTextOptions;
|
||||||
class QskTextColors;
|
class QskTextColors;
|
||||||
|
class QskBoxShapeMetrics;
|
||||||
|
class QskBoxBorderMetrics;
|
||||||
|
class QskBoxBorderColors;
|
||||||
class QskBoxHints;
|
class QskBoxHints;
|
||||||
class QskArcHints;
|
|
||||||
|
|
||||||
class QSGNode;
|
class QSGNode;
|
||||||
|
|
||||||
|
|
@ -74,6 +76,13 @@ class QSK_EXPORT QskSkinlet
|
||||||
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
||||||
const QRectF&, QskAspect::Subcontrol );
|
const QRectF&, QskAspect::Subcontrol );
|
||||||
|
|
||||||
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
||||||
|
const QRectF&, const QskGradient&, QskAspect::Subcontrol );
|
||||||
|
|
||||||
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
||||||
|
const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
|
||||||
|
const QskBoxBorderColors&, const QskGradient& );
|
||||||
|
|
||||||
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
||||||
const QRectF&, const QskBoxHints& );
|
const QRectF&, const QskBoxHints& );
|
||||||
|
|
||||||
|
|
@ -85,7 +94,18 @@ class QSK_EXPORT QskSkinlet
|
||||||
const QRectF&, QskAspect::Subcontrol );
|
const QRectF&, QskAspect::Subcontrol );
|
||||||
|
|
||||||
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
||||||
const QRectF&, const QskArcHints& );
|
const QRectF&, const QskGradient&, QskAspect::Subcontrol );
|
||||||
|
|
||||||
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
||||||
|
const QRectF&, qreal borderWidth, const QColor& borderColor,
|
||||||
|
const QskGradient&, const QskArcMetrics& );
|
||||||
|
|
||||||
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
||||||
|
const QRectF&, qreal startAngle, qreal spanAngle, QskAspect::Subcontrol );
|
||||||
|
|
||||||
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
||||||
|
const QRectF&, const QskGradient&, qreal startAngle, qreal spanAngle,
|
||||||
|
QskAspect::Subcontrol );
|
||||||
|
|
||||||
static QSGNode* updateLineNode( const QskSkinnable*, QSGNode*,
|
static QSGNode* updateLineNode( const QskSkinnable*, QSGNode*,
|
||||||
const QLineF&, QskAspect::Subcontrol );
|
const QLineF&, QskAspect::Subcontrol );
|
||||||
|
|
@ -136,6 +156,10 @@ class QSK_EXPORT QskSkinlet
|
||||||
QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
||||||
QskAspect::Subcontrol ) const;
|
QskAspect::Subcontrol ) const;
|
||||||
|
|
||||||
|
QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
||||||
|
qreal startAngle, qreal spanAngle,
|
||||||
|
QskAspect::Subcontrol ) const;
|
||||||
|
|
||||||
QSGNode* updateBoxClipNode( const QskSkinnable*, QSGNode*,
|
QSGNode* updateBoxClipNode( const QskSkinnable*, QSGNode*,
|
||||||
QskAspect::Subcontrol ) const;
|
QskAspect::Subcontrol ) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
#include "QskSkinnable.h"
|
#include "QskSkinnable.h"
|
||||||
|
|
||||||
#include "QskAnimationHint.h"
|
#include "QskAnimationHint.h"
|
||||||
#include "QskArcHints.h"
|
#include "QskArcMetrics.h"
|
||||||
#include "QskAspect.h"
|
#include "QskAspect.h"
|
||||||
#include "QskColorFilter.h"
|
#include "QskColorFilter.h"
|
||||||
#include "QskControl.h"
|
#include "QskControl.h"
|
||||||
|
|
@ -637,23 +637,9 @@ QColor QskSkinnable::shadowColorHint( QskAspect aspect, QskSkinHintStatus* statu
|
||||||
QskBoxHints QskSkinnable::boxHints( QskAspect aspect ) const
|
QskBoxHints QskSkinnable::boxHints( QskAspect aspect ) const
|
||||||
{
|
{
|
||||||
return QskBoxHints(
|
return QskBoxHints(
|
||||||
boxShapeHint( aspect ),
|
boxShapeHint( aspect ), boxBorderMetricsHint( aspect ),
|
||||||
boxBorderMetricsHint( aspect ),
|
boxBorderColorsHint( aspect ), gradientHint( aspect ),
|
||||||
boxBorderColorsHint( aspect ),
|
shadowMetricsHint( aspect ), shadowColorHint( aspect ) );
|
||||||
gradientHint( aspect ),
|
|
||||||
shadowMetricsHint( aspect ),
|
|
||||||
shadowColorHint( aspect )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
QskArcHints QskSkinnable::arcHints( QskAspect aspect ) const
|
|
||||||
{
|
|
||||||
return QskArcHints(
|
|
||||||
arcMetricsHint( aspect ),
|
|
||||||
metric( aspect | QskAspect::Border ),
|
|
||||||
color( aspect | QskAspect::Border ),
|
|
||||||
gradientHint( aspect )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QskSkinnable::setArcMetricsHint(
|
bool QskSkinnable::setArcMetricsHint(
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ class QDebug;
|
||||||
class QSGNode;
|
class QSGNode;
|
||||||
class QQuickItem;
|
class QQuickItem;
|
||||||
|
|
||||||
class QskArcHints;
|
|
||||||
class QskArcMetrics;
|
class QskArcMetrics;
|
||||||
class QskControl;
|
class QskControl;
|
||||||
class QskAnimationHint;
|
class QskAnimationHint;
|
||||||
|
|
@ -227,7 +226,6 @@ class QSK_EXPORT QskSkinnable
|
||||||
QColor shadowColorHint( QskAspect, QskSkinHintStatus* = nullptr ) const;
|
QColor shadowColorHint( QskAspect, QskSkinHintStatus* = nullptr ) const;
|
||||||
|
|
||||||
QskBoxHints boxHints( QskAspect ) const;
|
QskBoxHints boxHints( QskAspect ) const;
|
||||||
QskArcHints arcHints( QskAspect ) const;
|
|
||||||
|
|
||||||
bool setArcMetricsHint( QskAspect, const QskArcMetrics& );
|
bool setArcMetricsHint( QskAspect, const QskArcMetrics& );
|
||||||
bool resetArcMetricsHint( QskAspect );
|
bool resetArcMetricsHint( QskAspect );
|
||||||
|
|
|
||||||
|
|
@ -197,23 +197,6 @@ bool QskSlider::hasOrigin() const
|
||||||
return m_data->hasOrigin;
|
return m_data->hasOrigin;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskSlider::setTickPolicy( Qsk::Policy policy )
|
|
||||||
{
|
|
||||||
if ( setFlagHint( Tick | QskAspect::Option, policy ) )
|
|
||||||
Q_EMIT tickPolicyChanged( policy );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QskSlider::resetTickPolicy()
|
|
||||||
{
|
|
||||||
if ( resetSkinHint( Tick | QskAspect::Option ) )
|
|
||||||
Q_EMIT tickPolicyChanged( tickPolicy() );
|
|
||||||
}
|
|
||||||
|
|
||||||
Qsk::Policy QskSlider::tickPolicy() const
|
|
||||||
{
|
|
||||||
return flagHint< Qsk::Policy >( Tick | QskAspect::Option, Qsk::Maybe );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Variation QskSlider::effectiveVariation() const
|
QskAspect::Variation QskSlider::effectiveVariation() const
|
||||||
{
|
{
|
||||||
return static_cast< QskAspect::Variation >( m_data->orientation );
|
return static_cast< QskAspect::Variation >( m_data->orientation );
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,6 @@ class QSK_EXPORT QskSlider : public QskBoundedValueInput
|
||||||
Q_PROPERTY( bool tracking READ isTracking
|
Q_PROPERTY( bool tracking READ isTracking
|
||||||
WRITE setTracking NOTIFY trackingChanged )
|
WRITE setTracking NOTIFY trackingChanged )
|
||||||
|
|
||||||
Q_PROPERTY( Qsk::Policy tickPolicy READ tickPolicy
|
|
||||||
WRITE setTickPolicy RESET resetTickPolicy NOTIFY tickPolicyChanged )
|
|
||||||
|
|
||||||
Q_PROPERTY( qreal origin READ origin
|
Q_PROPERTY( qreal origin READ origin
|
||||||
WRITE setOrigin RESET resetOrigin NOTIFY originChanged )
|
WRITE setOrigin RESET resetOrigin NOTIFY originChanged )
|
||||||
|
|
||||||
|
|
@ -42,10 +39,6 @@ class QSK_EXPORT QskSlider : public QskBoundedValueInput
|
||||||
void setOrientation( Qt::Orientation );
|
void setOrientation( Qt::Orientation );
|
||||||
Qt::Orientation orientation() const;
|
Qt::Orientation orientation() const;
|
||||||
|
|
||||||
void setTickPolicy( Qsk::Policy );
|
|
||||||
void resetTickPolicy();
|
|
||||||
Qsk::Policy tickPolicy() const;
|
|
||||||
|
|
||||||
void setInverted( bool );
|
void setInverted( bool );
|
||||||
bool isInverted() const;
|
bool isInverted() const;
|
||||||
|
|
||||||
|
|
@ -68,7 +61,6 @@ class QSK_EXPORT QskSlider : public QskBoundedValueInput
|
||||||
void invertedChanged( bool );
|
void invertedChanged( bool );
|
||||||
void trackingChanged( bool );
|
void trackingChanged( bool );
|
||||||
void originChanged( qreal );
|
void originChanged( qreal );
|
||||||
void tickPolicyChanged( Qsk::Policy );
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent( QMouseEvent* ) override;
|
void mousePressEvent( QMouseEvent* ) override;
|
||||||
|
|
|
||||||
|
|
@ -388,7 +388,10 @@ bool QskSliderSkinlet::hasGraduation( const QskSlider* slider ) const
|
||||||
{
|
{
|
||||||
if ( slider->stepSize() )
|
if ( slider->stepSize() )
|
||||||
{
|
{
|
||||||
switch( slider->tickPolicy() )
|
const auto policy = slider->flagHint< Qsk::Policy >(
|
||||||
|
Q::Tick | QskAspect::Option, Qsk::Never );
|
||||||
|
|
||||||
|
switch( policy )
|
||||||
{
|
{
|
||||||
case Qsk::Always:
|
case Qsk::Always:
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ namespace
|
||||||
{
|
{
|
||||||
if ( qskIsAncestorOf( this, item ) )
|
if ( qskIsAncestorOf( this, item ) )
|
||||||
{
|
{
|
||||||
const auto pos = mapFromItem( item, QPointF() ) + scrollPos();
|
const auto pos = mapFromItem( item, QPointF() );
|
||||||
ensureVisible( QRectF( pos.x(), pos.y(), item->width(), item->height() ) );
|
ensureVisible( QRectF( pos.x(), pos.y(), item->width(), item->height() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@
|
||||||
#include "QskGraduationMetrics.h"
|
#include "QskGraduationMetrics.h"
|
||||||
#include "QskColorFilter.h"
|
#include "QskColorFilter.h"
|
||||||
#include "QskGradient.h"
|
#include "QskGradient.h"
|
||||||
#include "QskGradientStop.h"
|
|
||||||
#include "QskMargins.h"
|
#include "QskMargins.h"
|
||||||
#include "QskIntervalF.h"
|
#include "QskIntervalF.h"
|
||||||
#include "QskTextColors.h"
|
#include "QskTextColors.h"
|
||||||
|
|
@ -44,7 +43,6 @@ static void qskRegisterInterpolator()
|
||||||
qRegisterAnimationInterpolator< QskColorFilter >( QskColorFilter::interpolate );
|
qRegisterAnimationInterpolator< QskColorFilter >( QskColorFilter::interpolate );
|
||||||
qRegisterAnimationInterpolator< QskIntervalF >( QskIntervalF::interpolate );
|
qRegisterAnimationInterpolator< QskIntervalF >( QskIntervalF::interpolate );
|
||||||
qRegisterAnimationInterpolator< QskMargins >( QskMargins::interpolate );
|
qRegisterAnimationInterpolator< QskMargins >( QskMargins::interpolate );
|
||||||
qRegisterAnimationInterpolator< QskGradientStop >( QskGradientStop::interpolate );
|
|
||||||
qRegisterAnimationInterpolator< QskGradient >( QskGradient::interpolate );
|
qRegisterAnimationInterpolator< QskGradient >( QskGradient::interpolate );
|
||||||
qRegisterAnimationInterpolator< QskBoxShapeMetrics >( QskBoxShapeMetrics::interpolate );
|
qRegisterAnimationInterpolator< QskBoxShapeMetrics >( QskBoxShapeMetrics::interpolate );
|
||||||
qRegisterAnimationInterpolator< QskBoxBorderMetrics >( QskBoxBorderMetrics::interpolate );
|
qRegisterAnimationInterpolator< QskBoxBorderMetrics >( QskBoxBorderMetrics::interpolate );
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,11 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "QskArcNode.h"
|
#include "QskArcNode.h"
|
||||||
#include "QskArcHints.h"
|
#include "QskArcMetrics.h"
|
||||||
#include "QskArcRenderNode.h"
|
#include "QskArcRenderNode.h"
|
||||||
#include "QskArcRenderer.h"
|
#include "QskArcRenderer.h"
|
||||||
#include "QskMargins.h"
|
#include "QskMargins.h"
|
||||||
|
#include "QskGradient.h"
|
||||||
#include "QskSGNode.h"
|
#include "QskSGNode.h"
|
||||||
#include "QskRgbValue.h"
|
#include "QskRgbValue.h"
|
||||||
|
|
||||||
|
|
@ -57,21 +58,24 @@ QskArcNode::~QskArcNode()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskArcNode::setArcData( const QRectF& rect, const QskArcHints& hints )
|
void QskArcNode::setArcData( const QRectF& rect,
|
||||||
|
const QskArcMetrics& arcMetrics, const QskGradient& gradient )
|
||||||
|
{
|
||||||
|
setArcData( rect, arcMetrics, 0.0, QColor(), gradient );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics,
|
||||||
|
const qreal borderWidth, const QColor& borderColor, const QskGradient& gradient )
|
||||||
{
|
{
|
||||||
using namespace QskSGNode;
|
using namespace QskSGNode;
|
||||||
|
|
||||||
QskArcRenderNode* arcNode = nullptr;
|
QskArcRenderNode* arcNode = nullptr;
|
||||||
QskArcRenderNode* fillNode = nullptr;
|
QskArcRenderNode* fillNode = nullptr;
|
||||||
|
|
||||||
if ( !rect.isEmpty() && hints.isVisible() )
|
if ( !( rect.isEmpty() || arcMetrics.isNull() ) )
|
||||||
{
|
{
|
||||||
const auto& gradient = hints.gradient;
|
|
||||||
const auto borderWidth = hints.borderWidth;
|
|
||||||
const auto borderColor = hints.borderColor;
|
|
||||||
|
|
||||||
const bool radial = false;
|
const bool radial = false;
|
||||||
const auto metricsArc = hints.metrics.toAbsolute( rect.size() );
|
const auto metricsArc = arcMetrics.toAbsolute( rect.size() );
|
||||||
|
|
||||||
const auto hasFilling = gradient.isVisible();
|
const auto hasFilling = gradient.isVisible();
|
||||||
const auto hasBorder = ( borderWidth > 0.0 ) && QskRgb::isVisible( borderColor );
|
const auto hasBorder = ( borderWidth > 0.0 ) && QskRgb::isVisible( borderColor );
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@
|
||||||
#include "QskGlobal.h"
|
#include "QskGlobal.h"
|
||||||
#include <qsgnode.h>
|
#include <qsgnode.h>
|
||||||
|
|
||||||
class QskArcHints;
|
class QskArcMetrics;
|
||||||
|
class QskGradient;
|
||||||
|
|
||||||
class QSK_EXPORT QskArcNode : public QSGNode
|
class QSK_EXPORT QskArcNode : public QSGNode
|
||||||
{
|
{
|
||||||
|
|
@ -17,7 +18,10 @@ class QSK_EXPORT QskArcNode : public QSGNode
|
||||||
QskArcNode();
|
QskArcNode();
|
||||||
~QskArcNode() override;
|
~QskArcNode() override;
|
||||||
|
|
||||||
void setArcData( const QRectF&, const QskArcHints& );
|
void setArcData( const QRectF&, const QskArcMetrics&, const QskGradient& );
|
||||||
|
|
||||||
|
void setArcData( const QRectF&, const QskArcMetrics&,
|
||||||
|
qreal borderWidth, const QColor& borderColor, const QskGradient& );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,12 @@
|
||||||
#include "QskBoxRectangleNode.h"
|
#include "QskBoxRectangleNode.h"
|
||||||
#include "QskSGNode.h"
|
#include "QskSGNode.h"
|
||||||
|
|
||||||
#include "QskBoxHints.h"
|
#include "QskGradient.h"
|
||||||
#include "QskGradientDirection.h"
|
#include "QskGradientDirection.h"
|
||||||
|
#include "QskShadowMetrics.h"
|
||||||
|
#include "QskBoxBorderMetrics.h"
|
||||||
|
#include "QskBoxBorderColors.h"
|
||||||
|
#include "QskBoxShapeMetrics.h"
|
||||||
#include "QskRgbValue.h"
|
#include "QskRgbValue.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
|
@ -56,8 +60,10 @@ QskBoxNode::~QskBoxNode()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskBoxNode::updateNode( const QQuickWindow* window,
|
void QskBoxNode::updateNode( const QQuickWindow* window, const QRectF& rect,
|
||||||
const QRectF& rect, const QskBoxHints& hints )
|
const QskBoxShapeMetrics& shapeMetrics, const QskBoxBorderMetrics& borderMetrics,
|
||||||
|
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
|
||||||
|
const QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
|
||||||
{
|
{
|
||||||
using namespace QskSGNode;
|
using namespace QskSGNode;
|
||||||
|
|
||||||
|
|
@ -68,13 +74,6 @@ void QskBoxNode::updateNode( const QQuickWindow* window,
|
||||||
|
|
||||||
if ( !rect.isEmpty() )
|
if ( !rect.isEmpty() )
|
||||||
{
|
{
|
||||||
const auto& shapeMetrics = hints.shape;
|
|
||||||
const auto& borderMetrics = hints.borderMetrics;
|
|
||||||
const auto& borderColors = hints.borderColors;
|
|
||||||
const auto& gradient = hints.gradient;
|
|
||||||
const auto& shadowMetrics = hints.shadowMetrics;
|
|
||||||
const auto& shadowColor = hints.shadowColor;
|
|
||||||
|
|
||||||
const auto hasFilling = gradient.isVisible();
|
const auto hasFilling = gradient.isVisible();
|
||||||
const auto hasBorder = !borderMetrics.isNull() && borderColors.isVisible();
|
const auto hasBorder = !borderMetrics.isNull() && borderColors.isVisible();
|
||||||
const auto hasShadow = !shadowMetrics.isNull() && QskRgb::isVisible( shadowColor );
|
const auto hasShadow = !shadowMetrics.isNull() && QskRgb::isVisible( shadowColor );
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,14 @@
|
||||||
#include "QskGlobal.h"
|
#include "QskGlobal.h"
|
||||||
#include <qsgnode.h>
|
#include <qsgnode.h>
|
||||||
|
|
||||||
class QskBoxHints;
|
class QskShadowMetrics;
|
||||||
|
class QskBoxShapeMetrics;
|
||||||
|
class QskBoxBorderMetrics;
|
||||||
|
class QskBoxBorderColors;
|
||||||
|
class QskGradient;
|
||||||
|
class QskShadowMetrics;
|
||||||
class QQuickWindow;
|
class QQuickWindow;
|
||||||
|
class QColor;
|
||||||
|
|
||||||
class QSK_EXPORT QskBoxNode : public QSGNode
|
class QSK_EXPORT QskBoxNode : public QSGNode
|
||||||
{
|
{
|
||||||
|
|
@ -18,7 +24,10 @@ class QSK_EXPORT QskBoxNode : public QSGNode
|
||||||
QskBoxNode();
|
QskBoxNode();
|
||||||
~QskBoxNode() override;
|
~QskBoxNode() override;
|
||||||
|
|
||||||
void updateNode( const QQuickWindow*, const QRectF&, const QskBoxHints& );
|
void updateNode( const QQuickWindow*, const QRectF&,
|
||||||
|
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
|
||||||
|
const QskBoxBorderColors&, const QskGradient&,
|
||||||
|
const QskShadowMetrics&, const QColor& shadowColor );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -54,16 +54,16 @@ namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
|
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
// make Qt 5/6 APIs matching
|
||||||
|
|
||||||
QSGMaterialShader* createShader(
|
QSGMaterialShader* createShader(
|
||||||
QSGRendererInterface::RenderMode ) const override final
|
QSGRendererInterface::RenderMode ) const override final
|
||||||
#else
|
|
||||||
QSGMaterialShader* createShader() const override final
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
return createMaterialShader();
|
return createShader();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual QSGMaterialShader* createMaterialShader() const = 0;
|
virtual QSGMaterialShader* createShader() const = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual bool setGradient( const QskGradient& ) = 0;
|
virtual bool setGradient( const QskGradient& ) = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -217,7 +217,7 @@ namespace
|
||||||
return GradientMaterial::compare( other );
|
return GradientMaterial::compare( other );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGMaterialShader* createMaterialShader() const override;
|
QSGMaterialShader* createShader() const override;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
xy: position
|
xy: position
|
||||||
|
|
@ -299,7 +299,7 @@ namespace
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QSGMaterialShader* LinearMaterial::createMaterialShader() const
|
QSGMaterialShader* LinearMaterial::createShader() const
|
||||||
{
|
{
|
||||||
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
if ( !( flags() & QSGMaterial::RhiShaderWanted ) )
|
if ( !( flags() & QSGMaterial::RhiShaderWanted ) )
|
||||||
|
|
@ -371,7 +371,7 @@ namespace
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGMaterialShader* createMaterialShader() const override;
|
QSGMaterialShader* createShader() const override;
|
||||||
|
|
||||||
QVector2D m_center;
|
QVector2D m_center;
|
||||||
QVector2D m_radius;
|
QVector2D m_radius;
|
||||||
|
|
@ -465,7 +465,7 @@ namespace
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QSGMaterialShader* RadialMaterial::createMaterialShader() const
|
QSGMaterialShader* RadialMaterial::createShader() const
|
||||||
{
|
{
|
||||||
#ifdef SHADER_GL
|
#ifdef SHADER_GL
|
||||||
if ( !( flags() & QSGMaterial::RhiShaderWanted ) )
|
if ( !( flags() & QSGMaterial::RhiShaderWanted ) )
|
||||||
|
|
@ -575,7 +575,7 @@ namespace
|
||||||
return GradientMaterial::compare( other );
|
return GradientMaterial::compare( other );
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGMaterialShader* createMaterialShader() const override;
|
QSGMaterialShader* createShader() const override;
|
||||||
|
|
||||||
QVector2D m_center;
|
QVector2D m_center;
|
||||||
float m_aspectRatio = 1.0;
|
float m_aspectRatio = 1.0;
|
||||||
|
|
@ -685,7 +685,7 @@ namespace
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QSGMaterialShader* ConicMaterial::createMaterialShader() const
|
QSGMaterialShader* ConicMaterial::createShader() const
|
||||||
{
|
{
|
||||||
#ifdef SHADER_GL
|
#ifdef SHADER_GL
|
||||||
if ( !( flags() & QSGMaterial::RhiShaderWanted ) )
|
if ( !( flags() & QSGMaterial::RhiShaderWanted ) )
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue