changes from master

This commit is contained in:
Uwe Rathmann 2022-03-25 13:23:44 +01:00
parent 2bfb68c7de
commit 1430210424
150 changed files with 2426 additions and 1329 deletions

File diff suppressed because it is too large Load Diff

View File

@ -28,6 +28,7 @@ But so far only Linux is actively tested.
It might support all versions Qt >= 5.6, but you can rely on: It might support all versions Qt >= 5.6, but you can rely on:
- Qt 5.6 - Qt 5.6
- Qt 5.15
- current long term supported ( LTS ) version of Qt - current long term supported ( LTS ) version of Qt
- current version of Qt - current version of Qt

View File

@ -165,7 +165,8 @@ bool LightDisplay::arcContainsPoint( const QRectF& rect, const QPointF& point )
const int tolerance = 20; const int tolerance = 20;
// 1. check angle // 1. check angle
QPointF circlePos( point.x() - rect.center().x(), QPointF circlePos(
point.x() - rect.center().x(),
rect.center().y() - point.y() ); rect.center().y() - point.y() );
const qreal angle = angleFromPoint( rect, point ); const qreal angle = angleFromPoint( rect, point );

View File

@ -11,6 +11,7 @@
#include <QskArcMetrics.h> #include <QskArcMetrics.h>
#include <QskTextOptions.h> #include <QskTextOptions.h>
#include <QskScaleTickmarks.h>
#include <QFontMetrics> #include <QFontMetrics>
#include <QtMath> #include <QtMath>
@ -33,15 +34,15 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable,
QRectF rect = contentsRect; QRectF rect = contentsRect;
const qreal ticksSpacing = 4; // space between the ticks and the arc const qreal ticksSpacing = 4; // space between the ticks and the arc
if( subControl == LightDisplay::Groove if( subControl == LightDisplay::Groove || subControl == LightDisplay::Panel )
|| subControl == LightDisplay::Panel )
{ {
QSizeF textSize = textLabelsSize( display ); QSizeF textSize = textLabelsSize( display );
QskArcMetrics arcMetrics = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ); QskArcMetrics arcMetrics = display->arcMetricsHint( LightDisplay::ColdAndWarmArc );
const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing; const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing;
const qreal x = textSize.width() + arcMetrics.width() + ticksWidth; const qreal x = textSize.width() + arcMetrics.width() + ticksWidth;
const qreal w = contentsRect.width() - ( 2 * ( textSize.width() + arcMetrics.width() + ticksWidth ) ); const qreal w = contentsRect.width() -
( 2 * ( textSize.width() + arcMetrics.width() + ticksWidth ) );
const qreal y = arcMetrics.width() + ticksWidth; const qreal y = arcMetrics.width() + ticksWidth;
const qreal h = contentsRect.height() - 2 * ( arcMetrics.width() + ticksWidth ); const qreal h = contentsRect.height() - 2 * ( arcMetrics.width() + ticksWidth );
@ -52,24 +53,24 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable,
} }
else if( subControl == LightDisplay::ColdAndWarmArc ) else if( subControl == LightDisplay::ColdAndWarmArc )
{ {
const QRectF panelRect = subControlRect( skinnable, contentsRect, const QRectF panelRect = subControlRect( skinnable, contentsRect, LightDisplay::Panel );
LightDisplay::Panel );
auto barWidth = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ).width(); auto barWidth = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ).width();
auto rect = panelRect.marginsAdded( { barWidth, barWidth, barWidth, barWidth } ); auto rect = panelRect.marginsAdded( { barWidth, barWidth, barWidth, barWidth } );
return rect; return rect;
} }
else if( subControl == LightDisplay::Tickmarks ) else if( subControl == LightDisplay::Tickmarks )
{ {
const QRectF arcRect = subControlRect( skinnable, contentsRect, const QRectF arcRect = subControlRect(
LightDisplay::ColdAndWarmArc ); skinnable, contentsRect, LightDisplay::ColdAndWarmArc );
const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing; const qreal ticksWidth = display->arcMetricsHint(
const QRectF rect = arcRect.marginsAdded( { ticksWidth, ticksWidth, ticksWidth, ticksWidth } ); LightDisplay::Tickmarks ).width() + ticksSpacing;
const QRectF rect =
arcRect.marginsAdded( { ticksWidth, ticksWidth, ticksWidth, ticksWidth } );
return rect; return rect;
} }
else if( subControl == LightDisplay::ValueText ) else if( subControl == LightDisplay::ValueText )
{ {
QRectF valueTextRect = subControlRect( skinnable, contentsRect, QRectF valueTextRect = subControlRect( skinnable, contentsRect, LightDisplay::Panel );
LightDisplay::Panel );
const QFontMetricsF fm( skinnable->effectiveFont( subControl ) ); const QFontMetricsF fm( skinnable->effectiveFont( subControl ) );
const qreal fontWidth = fm.width( QStringLiteral( "100 %" ) ); const qreal fontWidth = fm.width( QStringLiteral( "100 %" ) );
const QPointF center = valueTextRect.center(); const QPointF center = valueTextRect.center();
@ -125,8 +126,7 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable,
QSGNode* LightDisplaySkinlet::updateSubNode( QSGNode* LightDisplaySkinlet::updateSubNode(
const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const
{ {
auto* display = static_cast< const LightDisplay* >( skinnable ); const auto* display = static_cast< const LightDisplay* >( skinnable );
switch( nodeRole ) switch( nodeRole )
{ {
@ -166,16 +166,16 @@ QSGNode* LightDisplaySkinlet::updateSubNode(
if ( ticksNode == nullptr ) if ( ticksNode == nullptr )
ticksNode = new RadialTickmarksNode(); ticksNode = new RadialTickmarksNode();
QColor color = display->color( LightDisplay::Tickmarks ); const auto color = display->color( LightDisplay::Tickmarks );
QRectF ticksRect = display->subControlRect( LightDisplay::Tickmarks ); const auto ticksRect = display->subControlRect( LightDisplay::Tickmarks );
QskArcMetrics arcMetrics = display->arcMetricsHint( LightDisplay::Tickmarks ); const auto arcMetrics = display->arcMetricsHint( LightDisplay::Tickmarks );
QskIntervalF boundaries = display->boundaries();
QskScaleTickmarks tickmarks;
tickmarks.setMajorTicks( {0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180 } );
int tickLineWidth = display->metric( LightDisplay::Tickmarks );
ticksNode->update( color, ticksRect, arcMetrics, boundaries, QskScaleTickmarks tickmarks;
tickmarks, tickLineWidth, Qt::Horizontal ); tickmarks.setMajorTicks( { 0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180 } );
const auto tickLineWidth = display->metric( LightDisplay::Tickmarks );
ticksNode->update( color, ticksRect, arcMetrics, tickmarks, tickLineWidth );
return ticksNode; return ticksNode;
} }
@ -207,11 +207,11 @@ QSGNode* LightDisplaySkinlet::updateSubNode(
QSizeF LightDisplaySkinlet::textLabelsSize( const LightDisplay* display ) const QSizeF LightDisplaySkinlet::textLabelsSize( const LightDisplay* display ) const
{ {
QFont font = display->effectiveFont( LightDisplay::LeftLabel ); const QFontMetricsF fm( display->effectiveFont( LightDisplay::LeftLabel ) );
QFontMetricsF fm( font );
qreal w = fm.width( QStringLiteral( " 100" ) ); qreal w = fm.width( QStringLiteral( " 100" ) );
qreal h = fm.height(); qreal h = fm.height();
return { w, h }; return { w, h };
} }

View File

@ -46,7 +46,7 @@ MenuBar::MenuBar( QQuickItem* parent )
m_entryStrings = { "Dashboard", "Rooms", "Devices", "Statistics", "Storage", "Members" }; m_entryStrings = { "Dashboard", "Rooms", "Devices", "Statistics", "Storage", "Members" };
for( const auto& entryString : qskAsConst( m_entryStrings ) ) for( const auto& entryString : qAsConst( m_entryStrings ) )
{ {
auto* entry = new MenuItem( entryString, this ); auto* entry = new MenuItem( entryString, this );
m_entries.append( entry ); m_entries.append( entry );

View File

@ -125,7 +125,7 @@ QColor ShadowedBox::shadowColor() const
return m_shadowColor; return m_shadowColor;
} }
QRectF ShadowedBox::layoutRectForSize( const QSizeF &size ) const QRectF ShadowedBox::layoutRectForSize( const QSizeF& size ) const
{ {
auto padding = paddingHint( Panel ); auto padding = paddingHint( Panel );
return { padding.left() / 2, padding.top() / 2, return { padding.left() / 2, padding.top() / 2,

View File

@ -1,6 +1,7 @@
CONFIG += qskexample CONFIG += qskexample
QT += svg QT += svg
QT += quick_private # TODO: examples should not use private headers
SOURCES += \ SOURCES += \
Box.cpp \ Box.cpp \

View File

@ -46,9 +46,9 @@ namespace
int compare( const QSGMaterial* other ) const override; int compare( const QSGMaterial* other ) const override;
QVector2D aspect = QVector2D{1.0, 1.0}; QVector2D aspect = QVector2D{ 1.0, 1.0 };
float blurExtent = 0.0; float blurExtent = 0.0;
QVector4D radius = QVector4D{0.0, 0.0, 0.0, 0.0}; QVector4D radius = QVector4D{ 0.0, 0.0, 0.0, 0.0 };
QColor color = Qt::black; QColor color = Qt::black;
}; };

View File

@ -5,82 +5,48 @@
#include "RadialTickmarksNode.h" #include "RadialTickmarksNode.h"
#include <QSGFlatColorMaterial> #include <QskScaleTickmarks.h>
#include <QskArcMetrics.h>
#include <QtMath> #include <QtMath>
QSK_QT_PRIVATE_BEGIN
#include <private/qsgnode_p.h>
QSK_QT_PRIVATE_END
static constexpr inline qreal qskTickFactor( QskScaleTickmarks::TickType type )
{
using TM = QskScaleTickmarks;
return type == TM::MinorTick ? 0.7 : ( type == TM::MinorTick ? 0.85 : 1.0 );
}
class RadialTickmarksNodePrivate final : public QSGGeometryNodePrivate
{
public:
RadialTickmarksNodePrivate()
: geometry( QSGGeometry::defaultAttributes_Point2D(), 0 )
{
#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 )
geometry.setDrawingMode( QSGGeometry::DrawLines );
#else
geometry.setDrawingMode( GL_LINES );
#endif
geometry.setVertexDataPattern( QSGGeometry::StaticPattern );
}
QSGGeometry geometry;
QSGFlatColorMaterial material;
QskIntervalF boundaries;
QskScaleTickmarks tickmarks;
QRectF rect;
int lineWidth = 0;
uint hash = 0;
};
RadialTickmarksNode::RadialTickmarksNode() RadialTickmarksNode::RadialTickmarksNode()
: QSGGeometryNode( *new RadialTickmarksNodePrivate ) : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 )
{ {
Q_D( RadialTickmarksNode ); #if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 )
m_geometry.setDrawingMode( QSGGeometry::DrawLines );
#else
m_geometry.setDrawingMode( GL_LINES );
#endif
m_geometry.setVertexDataPattern( QSGGeometry::StaticPattern );
setGeometry( &d->geometry ); setGeometry( &m_geometry );
setMaterial( &d->material ); setMaterial( &m_material );
} }
RadialTickmarksNode::~RadialTickmarksNode() RadialTickmarksNode::~RadialTickmarksNode()
{ {
} }
void RadialTickmarksNode::update(const QColor& color, const QRectF& rect, void RadialTickmarksNode::update( const QColor& color, const QRectF& rect,
const QskArcMetrics& arcMetrics, const QskIntervalF& /*boundaries*/, const QskArcMetrics& arcMetrics, const QskScaleTickmarks& tickmarks, int lineWidth )
const QskScaleTickmarks& tickmarks, int lineWidth,
Qt::Orientation /*orientation*/ )
{ {
Q_D( RadialTickmarksNode ); if( lineWidth != m_lineWidth )
if( lineWidth != d->lineWidth )
{ {
d->lineWidth = lineWidth; m_lineWidth = lineWidth;
d->geometry.setLineWidth( lineWidth ); m_geometry.setLineWidth( lineWidth );
markDirty( QSGNode::DirtyGeometry ); markDirty( QSGNode::DirtyGeometry );
} }
const uint hash = tickmarks.hash( 17435 ); const auto hash = tickmarks.hash( 17435 );
if( ( hash != d->hash ) || ( rect != d->rect ) ) if( ( hash != m_hash ) || ( rect != m_rect ) )
{ {
d->hash = hash; m_hash = hash;
d->rect = rect; m_rect = rect;
d->geometry.allocate( tickmarks.tickCount() * 2 ); m_geometry.allocate( tickmarks.tickCount() * 2 );
auto vertexData = d->geometry.vertexDataAsPoint2D(); auto vertexData = m_geometry.vertexDataAsPoint2D();
const auto center = rect.center(); const auto center = rect.center();
const auto radius = 0.5 * rect.width(); const auto radius = 0.5 * rect.width();
@ -117,13 +83,13 @@ void RadialTickmarksNode::update(const QColor& color, const QRectF& rect,
} }
} }
d->geometry.markVertexDataDirty(); m_geometry.markVertexDataDirty();
markDirty( QSGNode::DirtyGeometry ); markDirty( QSGNode::DirtyGeometry );
} }
if ( color != d->material.color() ) if ( color != m_material.color() )
{ {
d->material.setColor( color ); m_material.setColor( color );
markDirty( QSGNode::DirtyMaterial ); markDirty( QSGNode::DirtyMaterial );
} }
} }

View File

@ -5,13 +5,13 @@
#pragma once #pragma once
#include <QskArcMetrics.h>
#include <QskIntervalF.h> #include <QskIntervalF.h>
#include <QskScaleTickmarks.h>
#include <QSGGeometryNode> #include <QSGGeometryNode>
#include <QSGFlatColorMaterial>
class RadialTickmarksNodePrivate; class QskArcMetrics;
class QskScaleTickmarks;
class RadialTickmarksNode : public QSGGeometryNode class RadialTickmarksNode : public QSGGeometryNode
{ {
@ -19,9 +19,15 @@ class RadialTickmarksNode : public QSGGeometryNode
RadialTickmarksNode(); RadialTickmarksNode();
~RadialTickmarksNode() override; ~RadialTickmarksNode() override;
void update( const QColor&, const QRectF&, const QskArcMetrics&, void update( const QColor&, const QRectF&,
const QskIntervalF&, const QskScaleTickmarks&, int, Qt::Orientation ); const QskArcMetrics&, const QskScaleTickmarks&, int lineWidth );
private: private:
Q_DECLARE_PRIVATE( RadialTickmarksNode ) QSGGeometry m_geometry;
QSGFlatColorMaterial m_material;
QRectF m_rect;
int m_lineWidth = 0;
QskHashValue m_hash = 0;
}; };

View File

@ -34,9 +34,14 @@ class ListBox : public QskSimpleListBox
private: private:
void populate() void populate()
{ {
const int count = 10000;
const QString format( "Row %1: The quick brown fox jumps over the lazy dog" ); const QString format( "Row %1: The quick brown fox jumps over the lazy dog" );
QStringList entries; QStringList entries;
for ( int i = 0; i < 10000; i++ ) entries.reserve( count );
for ( int i = 0; i < count; i++ )
{ {
entries += format.arg( i + 1 ); entries += format.arg( i + 1 );
} }

View File

@ -16,6 +16,7 @@
#include <QskBox.h> #include <QskBox.h>
#include <QskLinearBox.h> #include <QskLinearBox.h>
#include <QskSkinManager.h> #include <QskSkinManager.h>
#include <QskAnimationHint.h>
#include <QskSkinTransition.h> #include <QskSkinTransition.h>
#include <QskSetup.h> #include <QskSetup.h>
#include <QskSkin.h> #include <QskSkin.h>

View File

@ -37,7 +37,7 @@ CONFIG += no_private_qt_headers_warning
CONFIG += warn_on CONFIG += warn_on
CONFIG += no_keywords CONFIG += no_keywords
CONFIG += silent CONFIG += silent
CONFIG -= depend_includepath #CONFIG -= depend_includepath
CONFIG += strict_c++ CONFIG += strict_c++
CONFIG += c++11 CONFIG += c++11
@ -64,16 +64,6 @@ RCC_DIR = rcc
QSK_CONFIG += QskDll QSK_CONFIG += QskDll
*-g++* {
GCC_VERSION = $$system("$$QMAKE_CXX -dumpversion")
equals(GCC_VERSION,4) || contains(GCC_VERSION, 4.* ) {
# gcc4 is too old for certain checks
CONFIG -= pedantic sanitize
}
}
linux { linux {
pedantic { pedantic {
@ -83,16 +73,20 @@ linux {
# Qt headers do not stand pedantic checks, so it's better # Qt headers do not stand pedantic checks, so it's better
# to exclude them by declaring them as system includes # to exclude them by declaring them as system includes
CONFIG += qtassysteminclude
}
qtassysteminclude {
# As most distros set QT_INSTALL_HEADERS to /usr/include we # As most distros set QT_INSTALL_HEADERS to /usr/include we
# would run into gcc compiler errors and better drop it # would run into gcc compiler errors and better drop it
# from the list below. Should be no problem as we don't # from the list below. Should be no problem as we don't
# add the Qt module to our includes and therefore don't # add the Qt module to our includes and therefore don't
# need this path. # need this path.
# QMAKE_CXXFLAGS += -isystem $$[QT_INSTALL_HEADERS]
QMAKE_CXXFLAGS += \ QMAKE_CXXFLAGS += \
-isystem $$[QT_INSTALL_HEADERS]/QtCore \ -isystem $$[QT_INSTALL_HEADERS]/QtCore \
-isystem $$[QT_INSTALL_HEADERS]/QtCore/$$[QT_VERSION]/QtCore \
-isystem $$[QT_INSTALL_HEADERS]/QtGui \ -isystem $$[QT_INSTALL_HEADERS]/QtGui \
-isystem $$[QT_INSTALL_HEADERS]/QtGui/$$[QT_VERSION]/QtGui \ -isystem $$[QT_INSTALL_HEADERS]/QtGui/$$[QT_VERSION]/QtGui \
-isystem $$[QT_INSTALL_HEADERS]/QtQuick \ -isystem $$[QT_INSTALL_HEADERS]/QtQuick \
@ -114,13 +108,6 @@ linux-g++ | linux-g++-64 {
# QMAKE_CXXFLAGS_RELEASE *= -Ofast # QMAKE_CXXFLAGS_RELEASE *= -Ofast
# QMAKE_CXXFLAGS_RELEASE *= -Os # QMAKE_CXXFLAGS_RELEASE *= -Os
# Some versions ( here 2.31.1 ) of the BFD linker may generate shared
# libraries with corrupt symbol version info which leads to
# "invalid version 21" errors when the corrupt shared library is used.
# One possible workaround is to use the gold linker instead.
# QMAKE_LFLAGS *= -Wl,-fuse-ld=gold
} }
pedantic { pedantic {
@ -130,7 +117,7 @@ pedantic {
QMAKE_CXXFLAGS *= -pedantic-errors QMAKE_CXXFLAGS *= -pedantic-errors
QMAKE_CXXFLAGS *= -Wextra QMAKE_CXXFLAGS *= -Wextra
QMAKE_CXXFLAGS *= -Werror=format-security QMAKE_CXXFLAGS *= -Werror=format-security
QMAKE_CXXFLAGS *= -Wlogical-op #QMAKE_CXXFLAGS *= -Wlogical-op
# QMAKE_CXXFLAGS *= -Wconversion # QMAKE_CXXFLAGS *= -Wconversion
# QMAKE_CXXFLAGS *= -Wfloat-equal # QMAKE_CXXFLAGS *= -Wfloat-equal
@ -172,8 +159,7 @@ sanitize {
CONFIG += sanitizer CONFIG += sanitizer
CONFIG += sanitize_address CONFIG += sanitize_address
#CONFIG *= sanitize_memory # CONFIG *= sanitize_undefined
CONFIG *= sanitize_undefined
linux-g++ | linux-g++-64 { linux-g++ | linux-g++-64 {
#QMAKE_CXXFLAGS *= -fsanitize-address-use-after-scope #QMAKE_CXXFLAGS *= -fsanitize-address-use-after-scope
@ -185,7 +171,16 @@ debug {
DEFINES += ITEM_STATISTICS=1 DEFINES += ITEM_STATISTICS=1
} }
# Help out Qt Creator
ide: DEFINES += QT_IDE
# DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x000000 # DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x000000
DEFINES += QSK_BUILD
LOCAL_PRI=$$(QSK_LOCAL_PRI)
if ( exists( $${LOCAL_PRI} ) ) {
# When not working with the Qt/Creator it is often more convenient
# to include the specific options of your local build, than passing
# them all on the command line
include( $${LOCAL_PRI} )
}

View File

@ -1,12 +1,3 @@
/******************************************************************************
* This code is a stripped down version of the Cassowary constraint solving
* algorithm. The implementation has been taken from the Kiwi project:
*
* Copyright (c) 2013-2017, Nucleic Development Team.
* Distributed under the terms of the Modified BSD License.
* https://github.com/nucleic/kiwi/blob/master/LICENSE
*****************************************************************************/
#include "Solver.h" #include "Solver.h"
#include "Constraint.h" #include "Constraint.h"
#include "Variable.h" #include "Variable.h"

View File

@ -59,7 +59,7 @@ GridQuick::GridQuick( QWidget* parent )
createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.1\nItem { GridLayout {} }" ); createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.1\nItem { GridLayout {} }" );
setContent( QUrl(), nullptr, contentItem ); setContent( QUrl(), nullptr, contentItem );
m_grid = contentItem->childItems().first(); m_grid = contentItem->childItems().constFirst();
m_grid->setProperty( "rowSpacing", 5 ); m_grid->setProperty( "rowSpacing", 5 );
m_grid->setProperty( "columnSpacing", 5 ); m_grid->setProperty( "columnSpacing", 5 );
} }
@ -78,7 +78,7 @@ void GridQuick::insert( const QByteArray& colorName,
*/ */
auto layout = createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.15\nGridLayout { Rectangle {} }" ); auto layout = createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.15\nGridLayout { Rectangle {} }" );
auto rectangle = layout->childItems().first(); auto rectangle = layout->childItems().constFirst();
rectangle->setParent( nullptr ); rectangle->setParent( nullptr );
delete layout; delete layout;

View File

@ -7,17 +7,18 @@
#include "QskGlobal.h" #include "QskGlobal.h"
#ifdef QT_NO_KEYWORDS QSK_QT_PRIVATE_BEGIN
// qquickimage_p.h uses emit
#define emit Q_EMIT
#include <private/qquickimage_p.h>
#undef emit
#ifndef emit
#define emit
#include <private/qquickimage_p.h>
#undef emit
#else #else
#include <private/qquickimage_p.h> #include <private/qquickimage_p.h>
#endif #endif
QSK_QT_PRIVATE_END
#include <memory> #include <memory>
class Image : public QQuickImage class Image : public QQuickImage

View File

@ -46,9 +46,9 @@ namespace
int compare( const QSGMaterial* other ) const override; int compare( const QSGMaterial* other ) const override;
QVector2D aspect = QVector2D{1.0, 1.0}; QVector2D aspect = QVector2D{ 1.0, 1.0 };
float blurExtent = 0.0; float blurExtent = 0.0;
QVector4D radius = QVector4D{0.0, 0.0, 0.0, 0.0}; QVector4D radius = QVector4D{ 0.0, 0.0, 0.0, 0.0 };
QColor color = Qt::black; QColor color = Qt::black;
}; };

View File

@ -36,7 +36,6 @@
#include <QskSkin.h> #include <QskSkin.h>
#include <QskSkinManager.h> #include <QskSkinManager.h>
#include <QskSlider.h> #include <QskSlider.h>
#include <QskStandardSymbol.h>
#include <QskStatusIndicator.h> #include <QskStatusIndicator.h>
#include <QskSubWindow.h> #include <QskSubWindow.h>
#include <QskSubWindowArea.h> #include <QskSubWindowArea.h>
@ -115,8 +114,8 @@ namespace
static inline QskGradientStop qskToGradientStop( const QJSValue& value ) static inline QskGradientStop qskToGradientStop( const QJSValue& value )
{ {
return QskGradientStop( return QskGradientStop(
value.property( QLatin1String( "position" ) ).toNumber(), value.property( QStringLiteral( "position" ) ).toNumber(),
value.property( QLatin1String( "color" ) ).toVariant().value< QColor >() value.property( QStringLiteral( "color" ) ).toVariant().value< QColor >()
); );
} }
@ -194,7 +193,6 @@ void QskQml::registerTypes()
#endif #endif
QSK_REGISTER_GADGET( QskRgbValueQml, "RgbValue" ); QSK_REGISTER_GADGET( QskRgbValueQml, "RgbValue" );
QSK_REGISTER_GADGET( QskStandardSymbol, "StandardSymbol" );
QSK_REGISTER_GADGET( QskBoxBorderMetrics, "BorderMetrics" ); QSK_REGISTER_GADGET( QskBoxBorderMetrics, "BorderMetrics" );
QSK_REGISTER_GADGET( QskBoxShapeMetrics, "Shape" ); QSK_REGISTER_GADGET( QskBoxShapeMetrics, "Shape" );
QSK_REGISTER_GADGET( QskShadowMetrics, "ShadowMetrics" ); QSK_REGISTER_GADGET( QskShadowMetrics, "ShadowMetrics" );

View File

@ -79,7 +79,7 @@ class QskShortcutQml : public QObject, public QQmlParserStatus
void activated(); void activated();
void activatedAmbiguously(); void activatedAmbiguously();
int shortcutIdChanged( int ); void shortcutIdChanged( int );
protected: protected:
bool event( QEvent* ) override; bool event( QEvent* ) override;

View File

@ -21,6 +21,7 @@ OTHER_FILES = \
qmlexport.depends = src qmlexport.depends = src
inputcontext.depends = src inputcontext.depends = src
skins.depends = src skins.depends = src
tools.depends = src
support.depends = src skins support.depends = src skins
examples.depends = tools support skins qmlexport examples.depends = tools support skins qmlexport
playground.depends = tools support skins qmlexport playground.depends = tools support skins qmlexport

View File

@ -785,7 +785,7 @@ QskMaterialSkin::QskMaterialSkin( QObject* parent )
QskRgb::Blue500, QskRgb::White ); QskRgb::Blue500, QskRgb::White );
// Default theme colors // Default theme colors
setupFonts( "Roboto" ); setupFonts( QStringLiteral( "Roboto" ) );
auto buttonFont = font( QskSkin::DefaultFont ); auto buttonFont = font( QskSkin::DefaultFont );
buttonFont.setCapitalization( QFont::AllUppercase ); buttonFont.setCapitalization( QFont::AllUppercase );

View File

@ -941,7 +941,7 @@ QskSquiekSkin::QskSquiekSkin( QObject* parent )
: Inherited( parent ) : Inherited( parent )
, m_data( new PrivateData() ) , m_data( new PrivateData() )
{ {
setupFonts( "DejaVuSans" ); setupFonts( QStringLiteral( "DejaVuSans" ) );
Editor editor( &hintTable(), m_data->palette ); Editor editor( &hintTable(), m_data->palette );
editor.setup(); editor.setup();

View File

@ -86,9 +86,9 @@ QskArcMetrics QskArcMetrics::toAbsolute( const QSizeF& size ) const noexcept
return absoluted; return absoluted;
} }
uint QskArcMetrics::hash( uint seed ) const noexcept QskHashValue QskArcMetrics::hash( QskHashValue seed ) const noexcept
{ {
uint hash = qHash( m_width, seed ); auto hash = qHash( m_width, seed );
hash = qHash( m_startAngle, hash ); hash = qHash( m_startAngle, hash );
hash = qHash( m_spanAngle, hash ); hash = qHash( m_spanAngle, hash );

View File

@ -50,7 +50,7 @@ class QSK_EXPORT QskArcMetrics
QskArcMetrics toAbsolute( const QSizeF& ) const noexcept; QskArcMetrics toAbsolute( const QSizeF& ) const noexcept;
uint hash( uint seed = 0 ) const noexcept; QskHashValue hash( QskHashValue seed = 0 ) const noexcept;
static QVariant interpolate( const QskArcMetrics&, static QVariant interpolate( const QskArcMetrics&,
const QskArcMetrics&, qreal progress ); const QskArcMetrics&, qreal progress );

View File

@ -185,9 +185,9 @@ QVariant QskBoxBorderColors::interpolate(
return QVariant::fromValue( from.interpolated( to, ratio ) ); return QVariant::fromValue( from.interpolated( to, ratio ) );
} }
uint QskBoxBorderColors::hash( uint seed ) const QskHashValue QskBoxBorderColors::hash( QskHashValue seed ) const
{ {
uint h = m_gradients[ 0 ].hash( seed ); auto h = m_gradients[ 0 ].hash( seed );
h = m_gradients[ 1 ].hash( h ); h = m_gradients[ 1 ].hash( h );
h = m_gradients[ 2 ].hash( h ); h = m_gradients[ 2 ].hash( h );
h = m_gradients[ 3 ].hash( h ); h = m_gradients[ 3 ].hash( h );

View File

@ -49,7 +49,7 @@ class QSK_EXPORT QskBoxBorderColors
static QVariant interpolate( const QskBoxBorderColors&, static QVariant interpolate( const QskBoxBorderColors&,
const QskBoxBorderColors&, qreal ratio ); const QskBoxBorderColors&, qreal ratio );
uint hash( uint seed = 0 ) const; QskHashValue hash( QskHashValue seed = 0 ) const;
bool isMonochrome() const; bool isMonochrome() const;
bool isVisible() const; bool isVisible() const;

View File

@ -92,9 +92,9 @@ QVariant QskBoxBorderMetrics::interpolate(
return QVariant::fromValue( from.interpolated( to, progress ) ); return QVariant::fromValue( from.interpolated( to, progress ) );
} }
uint QskBoxBorderMetrics::hash( uint seed ) const noexcept QskHashValue QskBoxBorderMetrics::hash( QskHashValue seed ) const noexcept
{ {
uint hash = qHashBits( &m_widths, sizeof( m_widths ), seed ); auto hash = qHashBits( &m_widths, sizeof( m_widths ), seed );
const int mode = m_sizeMode; const int mode = m_sizeMode;
return qHashBits( &mode, sizeof( mode ), hash ); return qHashBits( &mode, sizeof( mode ), hash );

View File

@ -55,7 +55,7 @@ class QSK_EXPORT QskBoxBorderMetrics
QskBoxBorderMetrics toAbsolute( const QSizeF& ) const noexcept; QskBoxBorderMetrics toAbsolute( const QSizeF& ) const noexcept;
uint hash( uint seed = 0 ) const noexcept; QskHashValue hash( QskHashValue seed = 0 ) const noexcept;
static QVariant interpolate( const QskBoxBorderMetrics&, static QVariant interpolate( const QskBoxBorderMetrics&,
const QskBoxBorderMetrics&, qreal progress ); const QskBoxBorderMetrics&, qreal progress );

View File

@ -151,9 +151,9 @@ QVariant QskBoxShapeMetrics::interpolate(
return QVariant::fromValue( from.interpolated( to, progress ) ); return QVariant::fromValue( from.interpolated( to, progress ) );
} }
uint QskBoxShapeMetrics::hash( uint seed ) const noexcept QskHashValue QskBoxShapeMetrics::hash( QskHashValue seed ) const noexcept
{ {
uint hash = qHash( static_cast< int >( m_sizeMode ), seed ); auto hash = qHash( static_cast< int >( m_sizeMode ), seed );
return qHashBits( m_radii, sizeof( m_radii ), hash ); return qHashBits( m_radii, sizeof( m_radii ), hash );
} }

View File

@ -93,7 +93,7 @@ class QSK_EXPORT QskBoxShapeMetrics
constexpr QskBoxShapeMetrics transposed() const noexcept; constexpr QskBoxShapeMetrics transposed() const noexcept;
uint hash( uint seed = 0 ) const noexcept; QskHashValue hash( QskHashValue seed = 0 ) const noexcept;
static QVariant interpolate( const QskBoxShapeMetrics&, static QVariant interpolate( const QskBoxShapeMetrics&,
const QskBoxShapeMetrics&, qreal progress ) noexcept; const QskBoxShapeMetrics&, qreal progress ) noexcept;

View File

@ -122,7 +122,7 @@ QRectF qskValidOrEmptyInnerRect( const QRectF& rect, const QMarginsF& margins )
return QRectF( x, y, w, h ); return QRectF( x, y, w, h );
} }
QRectF qskInterpolatedRect( const QRectF &from, const QRectF &to, qreal progress ) QRectF qskInterpolatedRect( const QRectF& from, const QRectF& to, qreal progress )
{ {
if ( progress <= 0.0 ) if ( progress <= 0.0 )
return from; return from;
@ -138,7 +138,7 @@ QRectF qskInterpolatedRect( const QRectF &from, const QRectF &to, qreal progress
return QRectF( x, y, w, h ); return QRectF( x, y, w, h );
} }
QSizeF qskInterpolatedSize( const QSizeF &from, const QSizeF &to, qreal progress ) QSizeF qskInterpolatedSize( const QSizeF& from, const QSizeF& to, qreal progress )
{ {
if ( progress <= 0.0 ) if ( progress <= 0.0 )
return from; return from;

View File

@ -17,15 +17,15 @@
#ifdef QSK_DLL #ifdef QSK_DLL
#if defined( QSK_MAKEDLL ) // create a DLL library #if defined( QSK_MAKEDLL ) // create a DLL library
#define QSK_EXPORT Q_DECL_EXPORT #define QSK_EXPORT Q_DECL_EXPORT
#else // use a DLL library #else // use a DLL library
#define QSK_EXPORT Q_DECL_IMPORT #define QSK_EXPORT Q_DECL_IMPORT
#endif #endif
#endif // QSK_DLL #endif // QSK_DLL
#ifndef QSK_EXPORT #ifndef QSK_EXPORT
#define QSK_EXPORT #define QSK_EXPORT
#endif #endif
#define QSK_QT_PRIVATE_BEGIN \ #define QSK_QT_PRIVATE_BEGIN \
@ -39,27 +39,26 @@
#define QSK_QT_PRIVATE_END \ #define QSK_QT_PRIVATE_END \
QT_WARNING_POP QT_WARNING_POP
#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) #if defined( QSK_BUILD )
#define qskAsConst qAsConst #if QT_VERSION < QT_VERSION_CHECK( 5, 7, 0 )
template< typename T >
struct QskAddConst { typedef const T Type; };
template< typename T >
constexpr typename QskAddConst< T >::Type& qAsConst( T& t ) noexcept { return t; }
template< typename T >
void qAsConst( const T&& ) = delete;
#endif
#endif
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
using QskHashValue = uint;
#else #else
using QskHashValue = size_t;
template< typename T >
struct QskAddConst { typedef const T Type; };
template< typename T >
constexpr typename QskAddConst< T >::Type& qskAsConst( T& t ) noexcept { return t; }
template< typename T >
void qskAsConst( const T&& ) = delete;
#endif
#ifdef Q_FALLTHROUGH
#define QSK_FALLTHROUGH Q_FALLTHROUGH
#else
#define QSK_FALLTHROUGH
#endif #endif
#endif #endif

View File

@ -179,6 +179,17 @@ static inline QskGradientStops qskExtractedStops(
return extracted; return extracted;
} }
static inline QskGradientStops qskGradientStops( const QGradientStops& qtStops )
{
QskGradientStops stops;
stops.reserve( qtStops.count() );
for ( const auto& s : qtStops )
stops += QskGradientStop( s.first, s.second );
return stops;
}
QskGradient::QskGradient( Orientation orientation ) QskGradient::QskGradient( Orientation orientation )
: m_orientation( orientation ) : m_orientation( orientation )
, m_isDirty( false ) , m_isDirty( false )
@ -218,6 +229,16 @@ QskGradient::QskGradient( Orientation orientation, const QskGradientStops& stops
setStops( stops ); setStops( stops );
} }
#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 )
QskGradient::QskGradient( Orientation orientation, QGradient::Preset preset )
: QskGradient( orientation )
{
setStops( qskGradientStops( QGradient( preset ).stops() ) );
}
#endif
QskGradient::~QskGradient() QskGradient::~QskGradient()
{ {
} }
@ -301,8 +322,17 @@ void QskGradient::setStops( const QskGradientStops& stops )
m_isDirty = true; m_isDirty = true;
} }
QskGradientStops QskGradient::stops() const const QskGradientStops& QskGradient::stops() const
{ {
#if 1
/*
Returning a const& so that it is possible to write:
for ( const auto& stop : qAsConst( gradient.stops() ) )
Once we have changed QskGradientStop from QColor to QRgb
we should check if there is a better solution possible
*/
#endif
return m_stops; return m_stops;
} }
@ -387,14 +417,14 @@ bool QskGradient::hasStopAt( qreal value ) const
return false; return false;
} }
uint QskGradient::hash( uint seed ) const QskHashValue QskGradient::hash( QskHashValue seed ) const
{ {
if ( m_stops.isEmpty() ) if ( m_stops.isEmpty() )
return seed; return seed;
const auto o = orientation(); const auto o = orientation();
uint hash = qHashBits( &o, sizeof( o ), seed ); auto hash = qHashBits( &o, sizeof( o ), seed );
for ( const auto& stop : m_stops ) for ( const auto& stop : m_stops )
hash = stop.hash( hash ); hash = stop.hash( hash );

View File

@ -9,7 +9,7 @@
#include "QskGlobal.h" #include "QskGlobal.h"
#include "QskGradientStop.h" #include "QskGradientStop.h"
#include <qcolor.h> #include <qbrush.h>
#include <qmetatype.h> #include <qmetatype.h>
#include <qvector.h> #include <qvector.h>
@ -49,12 +49,18 @@ class QSK_EXPORT QskGradient
QskGradient( QRgb ); QskGradient( QRgb );
QskGradient( const QColor& ); QskGradient( const QColor& );
QskGradient( Qt::Orientation, const QVector< QskGradientStop >& ); QskGradient( Qt::Orientation, const QVector< QskGradientStop >& );
QskGradient( Qt::Orientation, const QColor&, const QColor& ); QskGradient( Qt::Orientation, const QColor&, const QColor& );
QskGradient( Orientation, const QVector< QskGradientStop >& ); QskGradient( Orientation, const QVector< QskGradientStop >& );
QskGradient( Orientation, const QColor&, const QColor& ); QskGradient( Orientation, const QColor&, const QColor& );
#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 )
QskGradient( QGradient::Preset );
QskGradient( Orientation, QGradient::Preset );
#endif
~QskGradient(); ~QskGradient();
void setOrientation( Qt::Orientation ); void setOrientation( Qt::Orientation );
@ -74,7 +80,7 @@ class QSK_EXPORT QskGradient
Q_INVOKABLE QColor endColor() const; Q_INVOKABLE QColor endColor() const;
Q_INVOKABLE void setStops( const QVector< QskGradientStop >& ); Q_INVOKABLE void setStops( const QVector< QskGradientStop >& );
Q_INVOKABLE QVector< QskGradientStop > stops() const; Q_INVOKABLE const QVector< QskGradientStop >& stops() const;
Q_INVOKABLE bool hasStopAt( qreal value ) const; Q_INVOKABLE bool hasStopAt( qreal value ) const;
@ -94,7 +100,7 @@ class QSK_EXPORT QskGradient
static QVariant interpolate( const QskGradient&, static QVariant interpolate( const QskGradient&,
const QskGradient&, qreal progress ); const QskGradient&, qreal progress );
uint hash( uint seed ) const; QskHashValue hash( QskHashValue seed ) const;
Q_INVOKABLE qreal stopAt( int index ) const; Q_INVOKABLE qreal stopAt( int index ) const;
Q_INVOKABLE QColor colorAt( int index ) const; Q_INVOKABLE QColor colorAt( int index ) const;
@ -133,6 +139,15 @@ inline QskGradient::QskGradient( QRgb rgb )
{ {
} }
#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 )
inline QskGradient::QskGradient( QGradient::Preset preset )
: QskGradient( Vertical, preset )
{
}
#endif
inline QskGradient::Orientation QskGradient::orientation() const inline QskGradient::Orientation QskGradient::orientation() const
{ {
return static_cast< Orientation >( m_orientation ); return static_cast< Orientation >( m_orientation );

View File

@ -44,9 +44,9 @@ void QskGradientStop::setStop( qreal position, const QColor& color ) noexcept
m_color = color; m_color = color;
} }
uint QskGradientStop::hash( uint seed ) const noexcept QskHashValue QskGradientStop::hash( QskHashValue seed ) const noexcept
{ {
uint hash = qHashBits( &m_position, sizeof( m_position ), seed ); auto hash = qHashBits( &m_position, sizeof( m_position ), seed );
return qHashBits( &m_color, sizeof( m_color ), hash ); return qHashBits( &m_color, sizeof( m_color ), hash );
} }

View File

@ -11,13 +11,6 @@
#include <qcolor.h> #include <qcolor.h>
#include <qmetatype.h> #include <qmetatype.h>
#if QT_VERSION < QT_VERSION_CHECK( 5, 14, 0 )
/*
since Qt >= 5.14 QColor has constexpr declarations and we could declare
several methods of QskGradientStop being constexpr as well. TODO ...
*/
#endif
class QSK_EXPORT QskGradientStop class QSK_EXPORT QskGradientStop
{ {
Q_GADGET Q_GADGET
@ -47,7 +40,7 @@ class QSK_EXPORT QskGradientStop
static QColor interpolated( static QColor interpolated(
const QskGradientStop&, const QskGradientStop&, qreal position ) noexcept; const QskGradientStop&, const QskGradientStop&, qreal position ) noexcept;
uint hash( uint seed ) const noexcept; QskHashValue hash( QskHashValue seed ) const noexcept;
private: private:
qreal m_position; qreal m_position;

View File

@ -70,7 +70,7 @@ namespace
int maximum; int maximum;
}; };
class CounterData final : public QObject class CounterData
{ {
public: public:
Counter counter[ 2 ]; Counter counter[ 2 ];
@ -162,7 +162,7 @@ void CounterHook::addObject( QObject* object )
{ {
const bool isItem = qskIsItem( object ); const bool isItem = qskIsItem( object );
for ( auto counterData : qskAsConst( m_counterDataSet ) ) for ( auto counterData : qAsConst( m_counterDataSet ) )
{ {
counterData->counter[ QskObjectCounter::Objects ].increment(); counterData->counter[ QskObjectCounter::Objects ].increment();
@ -182,7 +182,7 @@ void CounterHook::removeObject( QObject* object )
{ {
const bool isItem = qskIsItem( object ); const bool isItem = qskIsItem( object );
for ( auto counterData : qskAsConst( m_counterDataSet ) ) for ( auto counterData : qAsConst( m_counterDataSet ) )
{ {
counterData->counter[ QskObjectCounter::Objects ].decrement(); counterData->counter[ QskObjectCounter::Objects ].decrement();

View File

@ -37,6 +37,8 @@ class QSK_EXPORT QskObjectCounter
void dump() const; void dump() const;
private: private:
Q_DISABLE_COPY( QskObjectCounter )
class PrivateData; class PrivateData;
std::unique_ptr< PrivateData > m_data; std::unique_ptr< PrivateData > m_data;

View File

@ -63,7 +63,7 @@ void QskScaleTickmarks::invert()
std::reverse( m_ticks[ 2 ].begin(), m_ticks[ 2 ].end() ); std::reverse( m_ticks[ 2 ].begin(), m_ticks[ 2 ].end() );
} }
uint QskScaleTickmarks::hash( uint seed ) const QskHashValue QskScaleTickmarks::hash( QskHashValue seed ) const noexcept
{ {
seed = qHash( m_ticks[0], seed ); seed = qHash( m_ticks[0], seed );
seed = qHash( m_ticks[1], seed ); seed = qHash( m_ticks[1], seed );

View File

@ -53,7 +53,7 @@ class QSK_EXPORT QskScaleTickmarks
void invert(); void invert();
void reset(); void reset();
uint hash( uint seed = 0 ) const; QskHashValue hash( QskHashValue seed = 0 ) const noexcept;
private: private:
QVector< qreal > m_ticks[ 3 ]; QVector< qreal > m_ticks[ 3 ];

View File

@ -83,9 +83,9 @@ QRectF QskShadowMetrics::shadowRect( const QRectF& sourceRect ) const
sourceRect.height() + 2 * extent ); sourceRect.height() + 2 * extent );
} }
uint QskShadowMetrics::hash( uint seed ) const noexcept QskHashValue QskShadowMetrics::hash( QskHashValue seed ) const noexcept
{ {
uint hash; QskHashValue hash;
hash = qHash( m_offset.x(), seed ); hash = qHash( m_offset.x(), seed );
hash = qHash( m_offset.y(), seed ); hash = qHash( m_offset.y(), seed );

View File

@ -56,7 +56,7 @@ class QSK_EXPORT QskShadowMetrics
QRectF shadowRect( const QRectF& sourceRect ) const; QRectF shadowRect( const QRectF& sourceRect ) const;
uint hash( uint seed = 0 ) const noexcept; QskHashValue hash( QskHashValue seed = 0 ) const noexcept;
static QVariant interpolate( const QskShadowMetrics&, static QVariant interpolate( const QskShadowMetrics&,
const QskShadowMetrics&, qreal progress ); const QskShadowMetrics&, qreal progress );

View File

@ -9,7 +9,7 @@
#include <qhashfunctions.h> #include <qhashfunctions.h>
#include <qvariant.h> #include <qvariant.h>
uint QskTextColors::hash( uint seed ) const QskHashValue QskTextColors::hash( QskHashValue seed ) const noexcept
{ {
const QRgb rgb[] = { textColor.rgba(), styleColor.rgba(), linkColor.rgba() }; const QRgb rgb[] = { textColor.rgba(), styleColor.rgba(), linkColor.rgba() };
return qHashBits( rgb, sizeof( rgb ), seed ); return qHashBits( rgb, sizeof( rgb ), seed );

View File

@ -25,7 +25,7 @@ class QSK_EXPORT QskTextColors
static QVariant interpolate( const QskTextColors&, static QVariant interpolate( const QskTextColors&,
const QskTextColors&, qreal ratio ); const QskTextColors&, qreal ratio );
uint hash( uint seed = 0 ) const; QskHashValue hash( QskHashValue seed = 0 ) const noexcept;
QColor textColor; QColor textColor;
QColor styleColor; QColor styleColor;

View File

@ -50,15 +50,13 @@ QskTextOptions::TextFormat QskTextOptions::effectiveFormat( const QString& text
return m_format; return m_format;
} }
uint qHash( const QskTextOptions& options, uint seed ) noexcept QskHashValue QskTextOptions::hash( QskHashValue seed ) const noexcept
{ {
uint hash; auto hash = qHash( m_maximumLineCount, seed );
hash = qHash( m_fontSizeMode, hash );
hash = qHash( options.maximumLineCount(), seed ); hash = qHash( m_wrapMode, hash );
hash = qHash( options.fontSizeMode(), hash ); hash = qHash( m_format, hash );
hash = qHash( options.wrapMode(), hash ); hash = qHash( m_elideMode, hash );
hash = qHash( options.format(), hash );
hash = qHash( options.elideMode(), hash );
return hash; return hash;
} }

View File

@ -74,6 +74,8 @@ class QSK_EXPORT QskTextOptions
constexpr bool operator==( const QskTextOptions& other ) const noexcept; constexpr bool operator==( const QskTextOptions& other ) const noexcept;
constexpr bool operator!=( const QskTextOptions& other ) const noexcept; constexpr bool operator!=( const QskTextOptions& other ) const noexcept;
QskHashValue hash( QskHashValue seed ) const noexcept;
int textFlags() const noexcept; int textFlags() const noexcept;
private: private:
@ -164,8 +166,6 @@ inline constexpr bool QskTextOptions::operator!=(
return !( *this == other ); return !( *this == other );
} }
QSK_EXPORT uint qHash( const QskTextOptions&, uint seed = 0 ) noexcept;
#ifndef QT_NO_DEBUG_STREAM #ifndef QT_NO_DEBUG_STREAM
class QDebug; class QDebug;

View File

@ -1,2 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = ../

View File

@ -181,13 +181,15 @@ void QskBoundedInput::keyPressEvent( QKeyEvent* event )
{ {
if ( !isReadOnly() ) if ( !isReadOnly() )
{ {
if ( event->key() == Qt::Key_Up || event->matches( QKeySequence::MoveToNextChar ) ) if ( event->key() == Qt::Key_Up ||
qskIsStandardKeyInput( event, QKeySequence::MoveToNextChar ) )
{ {
increment( m_stepSize ); increment( m_stepSize );
return; return;
} }
if ( event->key() == Qt::Key_Down || event->matches( QKeySequence::MoveToPreviousChar ) ) if ( event->key() == Qt::Key_Down ||
qskIsStandardKeyInput( event, QKeySequence::MoveToPreviousChar ) )
{ {
increment( -m_stepSize ); increment( -m_stepSize );
return; return;

View File

@ -116,6 +116,21 @@ qreal qskWheelIncrement( const QWheelEvent* event )
#endif #endif
bool qskIsStandardKeyInput( const QKeyEvent* event, QKeySequence::StandardKey key )
{
#if 1
return event->matches( key );
#else
constexpr auto mask = ~( Qt::KeypadModifier | Qt::GroupSwitchModifier );
// We should route this call through the skin. TODO
const auto theme = QGuiApplicationPrivate::platformTheme();
const auto bindings = theme->keyBindings( ( event->modifiers() | event->key() ) & mask );
return bindings.contains( QKeySequence(searchkey) );
#endif
}
QskEvent::QskEvent( QskEvent::Type type ) QskEvent::QskEvent( QskEvent::Type type )
: QEvent( static_cast< QEvent::Type >( type ) ) : QEvent( static_cast< QEvent::Type >( type ) )
{ {

View File

@ -10,6 +10,7 @@
#include <qcoreevent.h> #include <qcoreevent.h>
#include <qrect.h> #include <qrect.h>
#include <qkeysequence.h>
#include <memory> #include <memory>
class QskGesture; class QskGesture;
@ -20,6 +21,7 @@ class QQuickItem;
class QMouseEvent; class QMouseEvent;
class QWheelEvent; class QWheelEvent;
class QHoverEvent; class QHoverEvent;
class QKeyEvent;
class QSK_EXPORT QskEvent : public QEvent class QSK_EXPORT QskEvent : public QEvent
{ {
@ -148,4 +150,6 @@ QSK_EXPORT qreal qskWheelIncrement( const QWheelEvent* );
#endif #endif
QSK_EXPORT bool qskIsStandardKeyInput( const QKeyEvent*, QKeySequence::StandardKey );
#endif #endif

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_FLICK_ANIMATOR_H #ifndef QSK_FLICK_ANIMATOR_H
#define QSK_FLICK_ANIMATOR_H 1 #define QSK_FLICK_ANIMATOR_H
#include "QskAnimator.h" #include "QskAnimator.h"

View File

@ -49,7 +49,7 @@ class QskFocusIndicator::PrivateData
public: public:
void resetConnections() void resetConnections()
{ {
for ( const auto& connection : qskAsConst( connections ) ) for ( const auto& connection : qAsConst( connections ) )
QObject::disconnect( connection ); QObject::disconnect( connection );
connections.clear(); connections.clear();

View File

@ -52,6 +52,8 @@ class QSK_EXPORT QskGesture
inline State state() const { return m_state; } inline State state() const { return m_state; }
protected: protected:
Q_DISABLE_COPY( QskGesture )
QskGesture( Type type ); QskGesture( Type type );
const Type m_type; const Type m_type;

View File

@ -11,13 +11,15 @@
#include <qvector.h> #include <qvector.h>
QSK_QT_PRIVATE_BEGIN QSK_QT_PRIVATE_BEGIN
#include <private/qquickwindow_p.h> #include <private/qquickwindow_p.h>
QSK_QT_PRIVATE_END
#if QT_VERSION >= QT_VERSION_CHECK( 6, 3, 0 ) #if QT_VERSION >= QT_VERSION_CHECK( 6, 3, 0 )
#include <private/qeventpoint_p.h> #include <private/qeventpoint_p.h>
#endif #endif
QSK_QT_PRIVATE_END
static QMouseEvent* qskClonedMouseEventAt( static QMouseEvent* qskClonedMouseEventAt(
const QMouseEvent* event, QPointF* localPos ) const QMouseEvent* event, QPointF* localPos )
{ {
@ -130,7 +132,7 @@ namespace
{ {
Timer* timer = nullptr; Timer* timer = nullptr;
for ( auto t : qskAsConst( m_table ) ) for ( auto t : qAsConst( m_table ) )
{ {
if ( t->recognizer() == nullptr || if ( t->recognizer() == nullptr ||
t->recognizer() == recognizer ) t->recognizer() == recognizer )
@ -151,7 +153,7 @@ namespace
void stopTimer( const QskGestureRecognizer* recognizer ) void stopTimer( const QskGestureRecognizer* recognizer )
{ {
for ( auto timer : qskAsConst( m_table ) ) for ( auto timer : qAsConst( m_table ) )
{ {
if ( timer->recognizer() == recognizer ) if ( timer->recognizer() == recognizer )
{ {

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_INPUT_GRABBER_H #ifndef QSK_INPUT_GRABBER_H
#define QSK_INPUT_GRABBER_H 1 #define QSK_INPUT_GRABBER_H
#include "QskControl.h" #include "QskControl.h"

View File

@ -8,10 +8,8 @@
#include "QskColorFilter.h" #include "QskColorFilter.h"
#include "QskEvent.h" #include "QskEvent.h"
#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 )
#include <qguiapplication.h> #include <qguiapplication.h>
#include <qstylehints.h> #include <qstylehints.h>
#endif
#include <qmath.h> #include <qmath.h>
@ -198,11 +196,13 @@ void QskListView::keyPressEvent( QKeyEvent* event )
case Qt::Key_PageDown: case Qt::Key_PageDown:
{ {
// TODO ... // TODO ...
return Inherited::keyPressEvent( event ); Inherited::keyPressEvent( event );
return;
} }
default: default:
{ {
return Inherited::keyPressEvent( event ); Inherited::keyPressEvent( event );
return;
} }
} }

View File

@ -108,13 +108,19 @@ QPointF QskMenu::origin() const
void QskMenu::addOption( const QUrl& graphicSource, const QString& text ) void QskMenu::addOption( const QUrl& graphicSource, const QString& text )
{ {
#if 0
// does not work with Qt 5.6 version of QVector. TODO ...
m_data->options += Option( graphicSource, text ); m_data->options += Option( graphicSource, text );
#else
Q_UNUSED( graphicSource )
Q_UNUSED( text )
#endif
resetImplicitSize(); resetImplicitSize();
update(); update();
if ( isComponentComplete() ) if ( isComponentComplete() )
countChanged( count() ); Q_EMIT countChanged( count() );
} }
void QskMenu::addOption( const QString& graphicSource, const QString& text ) void QskMenu::addOption( const QString& graphicSource, const QString& text )
@ -308,7 +314,7 @@ void QskMenu::mousePressEvent( QMouseEvent* event )
return; return;
} }
return Inherited::mousePressEvent( event ); Inherited::mousePressEvent( event );
} }
void QskMenu::mouseReleaseEvent( QMouseEvent* event ) void QskMenu::mouseReleaseEvent( QMouseEvent* event )
@ -327,7 +333,7 @@ void QskMenu::mouseReleaseEvent( QMouseEvent* event )
return; return;
} }
return Inherited::mouseReleaseEvent( event ); Inherited::mouseReleaseEvent( event );
} }
void QskMenu::aboutToShow() void QskMenu::aboutToShow()

View File

@ -52,6 +52,7 @@ class QskMenuSkinlet::PrivateData
{ {
m_data->enableCache( false ); m_data->enableCache( false );
} }
private: private:
PrivateData* m_data; PrivateData* m_data;
}; };
@ -168,7 +169,7 @@ class QskMenuSkinlet::PrivateData
const auto sample = skinlet->sampleAt( menu, QskMenu::Text, i ); const auto sample = skinlet->sampleAt( menu, QskMenu::Text, i );
if ( sample.canConvert< QString >() ) if ( sample.canConvert< QString >() )
{ {
const auto text = sample.value< QString >(); const auto text = sample.toString();
if( !text.isEmpty() ) if( !text.isEmpty() )
{ {
const auto w = qskHorizontalAdvance( fm, text ); const auto w = qskHorizontalAdvance( fm, text );

View File

@ -21,6 +21,8 @@ QObjectList QskObjectTree::childNodes( const QObject* object )
if ( object == nullptr ) if ( object == nullptr )
{ {
const auto windows = QGuiApplication::topLevelWindows(); const auto windows = QGuiApplication::topLevelWindows();
children.reserve( windows.count() );
for ( auto window : windows ) for ( auto window : windows )
children += window; children += window;
} }
@ -43,6 +45,7 @@ QObjectList QskObjectTree::childNodes( const QObject* object )
else if ( auto item = qobject_cast< const QQuickItem* >( object ) ) else if ( auto item = qobject_cast< const QQuickItem* >( object ) )
{ {
const auto childItems = item->childItems(); const auto childItems = item->childItems();
children.reserve( childItems.count() );
for ( auto child : childItems ) for ( auto child : childItems )
children += child; children += child;

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_OBJECT_TREE_H #ifndef QSK_OBJECT_TREE_H
#define QSK_OBJECT_TREE_H 1 #define QSK_OBJECT_TREE_H
#include "QskControl.h" #include "QskControl.h"
#include "QskWindow.h" #include "QskWindow.h"
@ -16,10 +16,14 @@ namespace QskObjectTree
class Visitor class Visitor
{ {
public: public:
Visitor() = default;
virtual ~Visitor() = default; virtual ~Visitor() = default;
virtual bool visitDown( QObject* object ) = 0; virtual bool visitDown( QObject* object ) = 0;
virtual bool visitUp( const QObject* object ) = 0; virtual bool visitUp( const QObject* object ) = 0;
private:
Q_DISABLE_COPY( Visitor )
}; };
QSK_EXPORT QObjectList childNodes( const QObject* ); QSK_EXPORT QObjectList childNodes( const QObject* );

View File

@ -15,10 +15,10 @@ QSK_SYSTEM_STATE( QskPageIndicator, Selected, QskAspect::FirstSystemState << 1 )
static int qskKeyIncrement( static int qskKeyIncrement(
const QskPageIndicator* indicator, const QKeyEvent* event ) const QskPageIndicator* indicator, const QKeyEvent* event )
{ {
if ( event->matches( QKeySequence::MoveToNextChar ) ) if ( qskIsStandardKeyInput( event, QKeySequence::MoveToNextChar ) )
return 1; return 1;
if ( event->matches( QKeySequence::MoveToPreviousChar ) ) if ( qskIsStandardKeyInput( event, QKeySequence::MoveToPreviousChar ) )
return -1; return -1;
const auto key = event->key(); const auto key = event->key();
@ -184,7 +184,7 @@ void QskPageIndicator::mousePressEvent( QMouseEvent* event )
return; return;
} }
return Inherited::mousePressEvent( event ); Inherited::mousePressEvent( event );
} }
void QskPageIndicator::mouseUngrabEvent() void QskPageIndicator::mouseUngrabEvent()
@ -209,7 +209,7 @@ void QskPageIndicator::mouseReleaseEvent( QMouseEvent* event )
return; return;
} }
return Inherited::mouseReleaseEvent( event ); Inherited::mouseReleaseEvent( event );
} }
void QskPageIndicator::keyPressEvent( QKeyEvent* event ) void QskPageIndicator::keyPressEvent( QKeyEvent* event )

View File

@ -10,15 +10,6 @@
#include "QskSGNode.h" #include "QskSGNode.h"
#include "QskFunctions.h" #include "QskFunctions.h"
static inline int qskCurrentIndex( const QskPageIndicator* indicator )
{
int index = qRound( indicator->currentIndex() );
if ( index >= indicator->count() )
index = 0;
return index;
}
static QRectF qskBulletRect( const QskPageIndicator* indicator, static QRectF qskBulletRect( const QskPageIndicator* indicator,
const QRectF& rect, int index ) const QRectF& rect, int index )
{ {

View File

@ -382,7 +382,7 @@ bool QskPopup::hasFaderEffect() const
void QskPopup::setPopupFlags( PopupFlags flags ) void QskPopup::setPopupFlags( PopupFlags flags )
{ {
if ( static_cast<int>(flags) != m_data->flags ) if ( static_cast< int >( flags ) != m_data->flags )
{ {
m_data->flags = flags; m_data->flags = flags;
updateInputGrabber(); updateInputGrabber();

View File

@ -649,7 +649,7 @@ void qskItemUpdateRecursive( QQuickItem* item )
static const QQuickPointerTouchEvent* qskPointerPressEvent( const QQuickWindowPrivate* wd ) static const QQuickPointerTouchEvent* qskPointerPressEvent( const QQuickWindowPrivate* wd )
{ {
for ( const auto event : wd->pointerEventInstances ) for ( const auto event : qAsConst( wd->pointerEventInstances ) )
{ {
if ( auto touchEvent = event->asPointerTouchEvent() ) if ( auto touchEvent = event->asPointerTouchEvent() )
{ {

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_QUICK_H #ifndef QSK_QUICK_H
#define QSK_QUICK_H 1 #define QSK_QUICK_H
#include "QskGlobal.h" #include "QskGlobal.h"
#include <qnamespace.h> #include <qnamespace.h>

View File

@ -15,16 +15,21 @@
#include <qquickwindow.h> #include <qquickwindow.h>
#if defined( QT_DEBUG ) #if defined( QT_DEBUG )
QSK_QT_PRIVATE_BEGIN QSK_QT_PRIVATE_BEGIN
#if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) #if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 )
#ifndef emit #ifndef emit
// qvariantanimation_p.h needs it
#define emit #define emit
#include <private/qabstractanimation_p.h>
#undef emit
#endif #endif
#endif #endif
#include <private/qquickpositioners_p.h> #include <private/qquickpositioners_p.h>
QSK_QT_PRIVATE_END QSK_QT_PRIVATE_END
#endif #endif
#include <unordered_set> #include <unordered_set>
@ -65,6 +70,10 @@ namespace
QObject::connect( qskSetup, &QskSetup::itemUpdateFlagsChanged, QObject::connect( qskSetup, &QskSetup::itemUpdateFlagsChanged,
qskSetup, [ this ] { updateControlFlags(); } ); qskSetup, [ this ] { updateControlFlags(); } );
/*
We would also need to send QEvent::StyleChange, when
a window has a new skin. TODO ...
*/
QObject::connect( qskSetup, &QskSetup::skinChanged, QObject::connect( qskSetup, &QskSetup::skinChanged,
qskSetup, [ this ] { updateSkin(); } ); qskSetup, [ this ] { updateSkin(); } );
} }
@ -200,9 +209,9 @@ void QskQuickItem::classBegin()
void QskQuickItem::componentComplete() void QskQuickItem::componentComplete()
{ {
#if defined( QT_DEBUG ) #if defined( QT_DEBUG )
if ( qobject_cast< const QQuickBasePositioner* >( parent() ) )
{
if ( d_func()->updateFlags & QskQuickItem::DeferredLayout ) if ( d_func()->updateFlags & QskQuickItem::DeferredLayout )
{
if ( qobject_cast< const QQuickBasePositioner* >( parent() ) )
{ {
qWarning( "QskQuickItem in DeferredLayout mode under control of a positioner" ); qWarning( "QskQuickItem in DeferredLayout mode under control of a positioner" );
} }

View File

@ -173,7 +173,7 @@ void QskShortcutHandler::remove( int id )
Finally let's check if we can disconnect Finally let's check if we can disconnect
from the destroyed signals from the destroyed signals
*/ */
for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) for ( const auto& entry : qAsConst( m_invokeDataMap ) )
{ {
if ( item == nullptr && receiver == nullptr ) if ( item == nullptr && receiver == nullptr )
break; break;
@ -276,7 +276,7 @@ bool QskShortcutHandler::invoke( QQuickItem* item, const QKeySequence& sequence
{ {
bool found = false; bool found = false;
for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) for ( const auto& entry : qAsConst( m_invokeDataMap ) )
{ {
auto& data = entry.second; auto& data = entry.second;

View File

@ -321,6 +321,20 @@ bool QskSkin::hasGraphicProvider() const
return m_data->graphicProviders.size() > 0; return m_data->graphicProviders.size() > 0;
} }
QString QskSkin::dialogButtonText( int action ) const
{
const auto theme = QGuiApplicationPrivate::platformTheme();
auto text = theme->standardButtonText( action );
#if QT_VERSION < QT_VERSION_CHECK( 5, 7, 0 )
text.remove( '&' );
#else
text = QPlatformTheme::removeMnemonics( text );
#endif
return text;
}
const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const
{ {
// auto policy = QPlatformDialogHelper::UnknownLayout; // auto policy = QPlatformDialogHelper::UnknownLayout;

View File

@ -75,6 +75,7 @@ class QSK_EXPORT QskSkin : public QObject
bool hasGraphicProvider() const; bool hasGraphicProvider() const;
virtual const int* dialogButtonLayout( Qt::Orientation ) const; virtual const int* dialogButtonLayout( Qt::Orientation ) const;
virtual QString dialogButtonText( int button ) const;
void setStateMask( QskAspect::States ); void setStateMask( QskAspect::States );
QskAspect::States stateMask() const; QskAspect::States stateMask() const;

View File

@ -244,10 +244,10 @@ void QskSkinHintTableEditor::setPosition(
setMetricHint( aspectPosition( aspect ), position, combination ); setMetricHint( aspectPosition( aspect ), position, combination );
} }
void QskSkinHintTableEditor::removePosition( bool QskSkinHintTableEditor::removePosition(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeMetricHint( aspectPosition( aspect ), combination ); return removeMetricHint( aspectPosition( aspect ), combination );
} }
qreal QskSkinHintTableEditor::position( QskAspect aspect ) const qreal QskSkinHintTableEditor::position( QskAspect aspect ) const
@ -268,10 +268,10 @@ void QskSkinHintTableEditor::setStrutSize(
QSizeF( width, height ), combination ); QSizeF( width, height ), combination );
} }
void QskSkinHintTableEditor::removeStrutSize( bool QskSkinHintTableEditor::removeStrutSize(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeMetricHint( aspectStrutSize( aspect ), combination ); return removeMetricHint( aspectStrutSize( aspect ), combination );
} }
QSizeF QskSkinHintTableEditor::strutSize( QskAspect aspect ) const QSizeF QskSkinHintTableEditor::strutSize( QskAspect aspect ) const
@ -293,10 +293,10 @@ void QskSkinHintTableEditor::setMargin( QskAspect aspect,
setMetricHint( aspectMargin( aspect ), margins, combination ); setMetricHint( aspectMargin( aspect ), margins, combination );
} }
void QskSkinHintTableEditor::removeMargin( bool QskSkinHintTableEditor::removeMargin(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeMetricHint( aspectMargin( aspect ), combination ); return removeMetricHint( aspectMargin( aspect ), combination );
} }
QskMargins QskSkinHintTableEditor::margin( QskAspect aspect ) const QskMargins QskSkinHintTableEditor::margin( QskAspect aspect ) const
@ -319,10 +319,10 @@ void QskSkinHintTableEditor::setPadding( QskAspect aspect,
setMetricHint( aspectPadding( aspect ), padding, combination ); setMetricHint( aspectPadding( aspect ), padding, combination );
} }
void QskSkinHintTableEditor::removePadding( bool QskSkinHintTableEditor::removePadding(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeMetricHint( aspectPadding( aspect ), combination ); return removeMetricHint( aspectPadding( aspect ), combination );
} }
QskMargins QskSkinHintTableEditor::padding( QskAspect aspect ) const QskMargins QskSkinHintTableEditor::padding( QskAspect aspect ) const
@ -336,10 +336,10 @@ void QskSkinHintTableEditor::setSpacing(
setMetricHint( aspectSpacing( aspect ), spacing, combination ); setMetricHint( aspectSpacing( aspect ), spacing, combination );
} }
void QskSkinHintTableEditor::removeSpacing( bool QskSkinHintTableEditor::removeSpacing(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeMetricHint( aspectSpacing( aspect ), combination ); return removeMetricHint( aspectSpacing( aspect ), combination );
} }
qreal QskSkinHintTableEditor::spacing( QskAspect aspect ) const qreal QskSkinHintTableEditor::spacing( QskAspect aspect ) const
@ -354,7 +354,7 @@ void QskSkinHintTableEditor::setAlignment(
static_cast< int >( alignment ), combination ); static_cast< int >( alignment ), combination );
} }
void QskSkinHintTableEditor::removeAlignment( bool QskSkinHintTableEditor::removeAlignment(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
return removeFlagHint( aspectAlignment( aspect ), combination ); return removeFlagHint( aspectAlignment( aspect ), combination );
@ -371,7 +371,7 @@ void QskSkinHintTableEditor::setFontRole(
setFlagHint( aspectFontRole( aspect ), fontRole, combination ); setFlagHint( aspectFontRole( aspect ), fontRole, combination );
} }
void QskSkinHintTableEditor::removeFontRole( bool QskSkinHintTableEditor::removeFontRole(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
return removeFlagHint( aspectFontRole( aspect ), combination ); return removeFlagHint( aspectFontRole( aspect ), combination );
@ -388,7 +388,7 @@ void QskSkinHintTableEditor::setGraphicRole(
setFlagHint( aspectGraphicRole( aspect ), graphicRole, combination ); setFlagHint( aspectGraphicRole( aspect ), graphicRole, combination );
} }
void QskSkinHintTableEditor::removeGraphicRole( bool QskSkinHintTableEditor::removeGraphicRole(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
return removeFlagHint( aspectGraphicRole( aspect ), combination ); return removeFlagHint( aspectGraphicRole( aspect ), combination );
@ -421,7 +421,7 @@ void QskSkinHintTableEditor::setBoxShape(
setMetricHint( aspectShape( aspect ), shape, combination ); setMetricHint( aspectShape( aspect ), shape, combination );
} }
void QskSkinHintTableEditor::removeBoxShape( bool QskSkinHintTableEditor::removeBoxShape(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
return removeMetricHint( aspectShape( aspect ), combination ); return removeMetricHint( aspectShape( aspect ), combination );
@ -453,7 +453,7 @@ void QskSkinHintTableEditor::setBoxBorderMetrics(
setMetricHint( aspectBorder( aspect ), borderMetrics, combination ); setMetricHint( aspectBorder( aspect ), borderMetrics, combination );
} }
void QskSkinHintTableEditor::removeBoxBorderMetric( bool QskSkinHintTableEditor::removeBoxBorderMetric(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
return removeMetricHint( aspectBorder( aspect ), combination ); return removeMetricHint( aspectBorder( aspect ), combination );
@ -480,7 +480,7 @@ void QskSkinHintTableEditor::setBoxBorderColors(QskAspect aspect,
combination ); combination );
} }
void QskSkinHintTableEditor::removeBoxBorderColors( bool QskSkinHintTableEditor::removeBoxBorderColors(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
return removeColorHint( aspectBorder( aspect ), combination ); return removeColorHint( aspectBorder( aspect ), combination );
@ -504,7 +504,7 @@ void QskSkinHintTableEditor::setArcMetrics( QskAspect aspect,
setMetricHint( aspectShape( aspect ), arcMetrics, combination ); setMetricHint( aspectShape( aspect ), arcMetrics, combination );
} }
void QskSkinHintTableEditor::removeArcMetrics( QskAspect aspect, bool QskSkinHintTableEditor::removeArcMetrics( QskAspect aspect,
QskStateCombination combination ) QskStateCombination combination )
{ {
return removeMetricHint( aspectShape( aspect ), combination ); return removeMetricHint( aspectShape( aspect ), combination );

View File

@ -63,7 +63,7 @@ class QSK_EXPORT QskSkinHintTableEditor
template< typename T > void setFlagHint( QskAspect, const T&, template< typename T > void setFlagHint( QskAspect, const T&,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removeFlagHint( QskAspect, QskStateCombination = QskStateCombination() ); bool removeFlagHint( QskAspect, QskStateCombination = QskStateCombination() );
QVariant flagHint( QskAspect ) const; QVariant flagHint( QskAspect ) const;
template< typename T > T flagHint( QskAspect ) const; template< typename T > T flagHint( QskAspect ) const;
@ -76,7 +76,7 @@ class QSK_EXPORT QskSkinHintTableEditor
template< typename T > void setMetricHint( template< typename T > void setMetricHint(
QskAspect, const T&, QskStateCombination = QskStateCombination() ); QskAspect, const T&, QskStateCombination = QskStateCombination() );
void removeMetricHint( QskAspect, QskStateCombination = QskStateCombination() ); bool removeMetricHint( QskAspect, QskStateCombination = QskStateCombination() );
QVariant metricHint( QskAspect ) const; QVariant metricHint( QskAspect ) const;
template< typename T > T metricHint( QskAspect ) const; template< typename T > T metricHint( QskAspect ) const;
@ -89,7 +89,7 @@ class QSK_EXPORT QskSkinHintTableEditor
template< typename T > void setColorHint( template< typename T > void setColorHint(
QskAspect, const T&, QskStateCombination = QskStateCombination() ); QskAspect, const T&, QskStateCombination = QskStateCombination() );
void removeColorHint( QskAspect, QskStateCombination = QskStateCombination() ); bool removeColorHint( QskAspect, QskStateCombination = QskStateCombination() );
QVariant colorHint( QskAspect ) const; QVariant colorHint( QskAspect ) const;
template< typename T > T colorHint( QskAspect ) const; template< typename T > T colorHint( QskAspect ) const;
@ -126,7 +126,7 @@ class QSK_EXPORT QskSkinHintTableEditor
void setPosition( QskAspect, qreal, void setPosition( QskAspect, qreal,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removePosition( QskAspect, QskStateCombination = QskStateCombination() ); bool removePosition( QskAspect, QskStateCombination = QskStateCombination() );
qreal position( QskAspect ) const; qreal position( QskAspect ) const;
@ -138,7 +138,7 @@ class QSK_EXPORT QskSkinHintTableEditor
void setStrutSize( QskAspect, qreal width, qreal height, void setStrutSize( QskAspect, qreal width, qreal height,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removeStrutSize( QskAspect, QskStateCombination = QskStateCombination() ); bool removeStrutSize( QskAspect, QskStateCombination = QskStateCombination() );
QSizeF strutSize( QskAspect ) const; QSizeF strutSize( QskAspect ) const;
@ -151,7 +151,7 @@ class QSK_EXPORT QskSkinHintTableEditor
qreal left, qreal top, qreal right, qreal bottom, qreal left, qreal top, qreal right, qreal bottom,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removeMargin( QskAspect, QskStateCombination = QskStateCombination() ); bool removeMargin( QskAspect, QskStateCombination = QskStateCombination() );
QskMargins margin( QskAspect ) const; QskMargins margin( QskAspect ) const;
@ -164,32 +164,32 @@ class QSK_EXPORT QskSkinHintTableEditor
qreal left, qreal top, qreal right, qreal bottom, qreal left, qreal top, qreal right, qreal bottom,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removePadding( QskAspect, QskStateCombination = QskStateCombination() ); bool removePadding( QskAspect, QskStateCombination = QskStateCombination() );
QskMargins padding( QskAspect ) const; QskMargins padding( QskAspect ) const;
// spacing // spacing
void setSpacing( QskAspect, qreal, QskStateCombination = QskStateCombination() ); void setSpacing( QskAspect, qreal, QskStateCombination = QskStateCombination() );
void removeSpacing( QskAspect, QskStateCombination = QskStateCombination() ); bool removeSpacing( QskAspect, QskStateCombination = QskStateCombination() );
qreal spacing( QskAspect ) const; qreal spacing( QskAspect ) const;
// alignment // alignment
void setAlignment( QskAspect, Qt::Alignment, QskStateCombination = QskStateCombination() ); void setAlignment( QskAspect, Qt::Alignment, QskStateCombination = QskStateCombination() );
void removeAlignment( QskAspect, QskStateCombination = QskStateCombination() ); bool removeAlignment( QskAspect, QskStateCombination = QskStateCombination() );
Qt::Alignment alignment( QskAspect ) const; Qt::Alignment alignment( QskAspect ) const;
// fontRole // fontRole
void setFontRole( QskAspect, int, QskStateCombination = QskStateCombination() ); void setFontRole( QskAspect, int, QskStateCombination = QskStateCombination() );
void removeFontRole( QskAspect, QskStateCombination = QskStateCombination() ); bool removeFontRole( QskAspect, QskStateCombination = QskStateCombination() );
int fontRole( QskAspect ) const; int fontRole( QskAspect ) const;
// graphicRole // graphicRole
void setGraphicRole( QskAspect, int, QskStateCombination = QskStateCombination() ); void setGraphicRole( QskAspect, int, QskStateCombination = QskStateCombination() );
void removeGraphicRole( QskAspect, QskStateCombination = QskStateCombination() ); bool removeGraphicRole( QskAspect, QskStateCombination = QskStateCombination() );
int graphicRole( QskAspect ) const; int graphicRole( QskAspect ) const;
// boxShape // boxShape
@ -202,7 +202,7 @@ class QSK_EXPORT QskSkinHintTableEditor
void setBoxShape( QskAspect, const QskBoxShapeMetrics&, void setBoxShape( QskAspect, const QskBoxShapeMetrics&,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removeBoxShape( QskAspect, QskStateCombination = QskStateCombination() ); bool removeBoxShape( QskAspect, QskStateCombination = QskStateCombination() );
QskBoxShapeMetrics boxShape( QskAspect ) const; QskBoxShapeMetrics boxShape( QskAspect ) const;
@ -217,7 +217,7 @@ class QSK_EXPORT QskSkinHintTableEditor
void setBoxBorderMetrics( QskAspect, void setBoxBorderMetrics( QskAspect,
const QskBoxBorderMetrics&, QskStateCombination = QskStateCombination() ); const QskBoxBorderMetrics&, QskStateCombination = QskStateCombination() );
void removeBoxBorderMetric( QskAspect, QskStateCombination = QskStateCombination() ); bool removeBoxBorderMetric( QskAspect, QskStateCombination = QskStateCombination() );
QskBoxBorderMetrics boxBorderMetrics( QskAspect ) const; QskBoxBorderMetrics boxBorderMetrics( QskAspect ) const;
@ -231,7 +231,7 @@ class QSK_EXPORT QskSkinHintTableEditor
const QskGradient& right, const QskGradient& bottom, const QskGradient& right, const QskGradient& bottom,
QskStateCombination = QskStateCombination() ); QskStateCombination = QskStateCombination() );
void removeBoxBorderColors( QskAspect, QskStateCombination = QskStateCombination() ); bool removeBoxBorderColors( QskAspect, QskStateCombination = QskStateCombination() );
QskBoxBorderColors boxBorderColors( QskAspect ) const; QskBoxBorderColors boxBorderColors( QskAspect ) const;
// arcMetrics // arcMetrics
@ -241,7 +241,7 @@ class QSK_EXPORT QskSkinHintTableEditor
void setArcMetrics( QskAspect, void setArcMetrics( QskAspect,
const QskArcMetrics&, QskStateCombination = QskStateCombination() ); const QskArcMetrics&, QskStateCombination = QskStateCombination() );
void removeArcMetrics( QskAspect, QskStateCombination = QskStateCombination() ); bool removeArcMetrics( QskAspect, QskStateCombination = QskStateCombination() );
QskArcMetrics arcMetrics( QskAspect ) const; QskArcMetrics arcMetrics( QskAspect ) const;
@ -294,10 +294,10 @@ inline void QskSkinHintTableEditor::setFlagHint(
setHint( aspect | QskAspect::Flag, hint, combination ); setHint( aspect | QskAspect::Flag, hint, combination );
} }
inline void QskSkinHintTableEditor::removeFlagHint( inline bool QskSkinHintTableEditor::removeFlagHint(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeHint( aspect | QskAspect::Flag, combination ); return removeHint( aspect | QskAspect::Flag, combination );
} }
inline QVariant QskSkinHintTableEditor::flagHint( QskAspect aspect ) const inline QVariant QskSkinHintTableEditor::flagHint( QskAspect aspect ) const
@ -326,10 +326,10 @@ inline void QskSkinHintTableEditor::setMetricHint(
setHint( aspect | QskAspect::Metric, hint, combination ); setHint( aspect | QskAspect::Metric, hint, combination );
} }
inline void QskSkinHintTableEditor::removeMetricHint( inline bool QskSkinHintTableEditor::removeMetricHint(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeHint( aspect | QskAspect::Metric, combination ); return removeHint( aspect | QskAspect::Metric, combination );
} }
inline QVariant QskSkinHintTableEditor::metricHint( QskAspect aspect ) const inline QVariant QskSkinHintTableEditor::metricHint( QskAspect aspect ) const
@ -358,10 +358,10 @@ inline void QskSkinHintTableEditor::setColorHint(
setHint( aspect | QskAspect::Color, hint, combination ); setHint( aspect | QskAspect::Color, hint, combination );
} }
inline void QskSkinHintTableEditor::removeColorHint( inline bool QskSkinHintTableEditor::removeColorHint(
QskAspect aspect, QskStateCombination combination ) QskAspect aspect, QskStateCombination combination )
{ {
removeHint( aspect | QskAspect::Color, combination ); return removeHint( aspect | QskAspect::Color, combination );
} }
inline QVariant QskSkinHintTableEditor::colorHint( QskAspect aspect ) const inline QVariant QskSkinHintTableEditor::colorHint( QskAspect aspect ) const

View File

@ -292,7 +292,7 @@ namespace
m_skinMap.clear(); m_skinMap.clear();
// first we try all factories, that have been added manually // first we try all factories, that have been added manually
for ( auto it = m_factoryMap.begin(); it != m_factoryMap.end(); ++it ) for ( auto it = m_factoryMap.constBegin(); it != m_factoryMap.constEnd(); ++it )
{ {
const auto& data = it.value(); const auto& data = it.value();
@ -301,7 +301,7 @@ namespace
} }
// all factories from plugins are following // all factories from plugins are following
for ( auto it = m_factoryMap.begin(); it != m_factoryMap.end(); ++it ) for ( auto it = m_factoryMap.constBegin(); it != m_factoryMap.constEnd(); ++it )
{ {
const auto& data = it.value(); const auto& data = it.value();
if ( data.loader ) if ( data.loader )
@ -341,7 +341,7 @@ class QskSkinManager::PrivateData
{ {
if ( !pluginsRegistered ) if ( !pluginsRegistered )
{ {
for ( const auto& path : qskAsConst( pluginPaths ) ) for ( const auto& path : qAsConst( pluginPaths ) )
registerPlugins( path + QStringLiteral( "/skins" ) ); registerPlugins( path + QStringLiteral( "/skins" ) );
pluginsRegistered = true; pluginsRegistered = true;

View File

@ -1,7 +1,13 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskSkinTransition.h" #include "QskSkinTransition.h"
#include "QskColorFilter.h" #include "QskColorFilter.h"
#include "QskControl.h" #include "QskControl.h"
#include "QskWindow.h" #include "QskWindow.h"
#include "QskAnimationHint.h"
#include "QskHintAnimator.h" #include "QskHintAnimator.h"
#include "QskSkin.h" #include "QskSkin.h"
#include "QskSkinHintTable.h" #include "QskSkinHintTable.h"
@ -39,7 +45,8 @@ namespace
public: public:
AnimatorCandidate() = default; AnimatorCandidate() = default;
inline AnimatorCandidate( QskAspect aspect, QVariant from, QVariant to ) inline AnimatorCandidate( QskAspect aspect,
const QVariant& from, const QVariant& to )
: aspect( aspect ) : aspect( aspect )
, from( from ) , from( from )
, to( to ) , to( to )
@ -518,10 +525,17 @@ namespace
Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator ) Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator )
QskSkinTransition::QskSkinTransition() class QskSkinTransition::PrivateData
: m_mask( QskSkinTransition::AllTypes ) {
public:
QskSkin* skins[ 2 ] = {};
QskAnimationHint animationHint;
Type mask = QskSkinTransition::AllTypes;
};
QskSkinTransition::QskSkinTransition()
: m_data( new PrivateData() )
{ {
m_skins[ 0 ] = m_skins[ 1 ] = nullptr;
} }
QskSkinTransition::~QskSkinTransition() QskSkinTransition::~QskSkinTransition()
@ -530,42 +544,42 @@ QskSkinTransition::~QskSkinTransition()
void QskSkinTransition::setMask( Type type ) void QskSkinTransition::setMask( Type type )
{ {
m_mask = type; m_data->mask = type;
} }
QskSkinTransition::Type QskSkinTransition::mask() const QskSkinTransition::Type QskSkinTransition::mask() const
{ {
return m_mask; return m_data->mask;
} }
void QskSkinTransition::setSourceSkin( QskSkin* skin ) void QskSkinTransition::setSourceSkin( QskSkin* skin )
{ {
m_skins[ 0 ] = skin; m_data->skins[ 0 ] = skin;
} }
QskSkin* QskSkinTransition::sourceSkin() const QskSkin* QskSkinTransition::sourceSkin() const
{ {
return m_skins[ 0 ]; return m_data->skins[ 0 ];
} }
void QskSkinTransition::setTargetSkin( QskSkin* skin ) void QskSkinTransition::setTargetSkin( QskSkin* skin )
{ {
m_skins[ 1 ] = skin; m_data->skins[ 1 ] = skin;
} }
QskSkin* QskSkinTransition::targetSkin() const QskSkin* QskSkinTransition::targetSkin() const
{ {
return m_skins[ 1 ]; return m_data->skins[ 1 ];
} }
void QskSkinTransition::setAnimation( QskAnimationHint animationHint ) void QskSkinTransition::setAnimation( QskAnimationHint animationHint )
{ {
m_animationHint = animationHint; m_data->animationHint = animationHint;
} }
QskAnimationHint QskSkinTransition::animation() const QskAnimationHint QskSkinTransition::animation() const
{ {
return m_animationHint; return m_data->animationHint;
} }
void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) void QskSkinTransition::updateSkin( QskSkin*, QskSkin* )
@ -575,7 +589,10 @@ void QskSkinTransition::updateSkin( QskSkin*, QskSkin* )
void QskSkinTransition::process() void QskSkinTransition::process()
{ {
if ( ( m_skins[ 0 ] == nullptr ) || ( m_skins[ 1 ] == nullptr ) ) auto skinFrom = m_data->skins[ 0 ];
auto skinTo = m_data->skins[ 1 ];
if ( ( skinFrom == nullptr ) || ( skinTo == nullptr ) )
{ {
// do nothing // do nothing
return; return;
@ -583,32 +600,32 @@ void QskSkinTransition::process()
qskSkinAnimator->reset(); qskSkinAnimator->reset();
if ( ( m_animationHint.duration <= 0 ) || ( m_mask == 0 ) ) if ( ( m_data->animationHint.duration <= 0 ) || ( m_data->mask == 0 ) )
{ {
// no animations, we can apply the changes // no animations, we can apply the changes
updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); updateSkin( skinFrom, skinTo );
return; return;
} }
QVector< AnimatorCandidate > candidates; QVector< AnimatorCandidate > candidates;
const auto oldFilters = m_skins[ 0 ]->graphicFilters(); const auto oldFilters = skinFrom->graphicFilters();
{ {
// copy out all hints before updating the skin // copy out all hints before updating the skin
// - would be good to have Copy on Write here // - would be good to have Copy on Write here
const auto oldTable = m_skins[ 0 ]->hintTable(); const auto oldTable = skinFrom->hintTable();
// apply the changes // apply the changes
updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); updateSkin( skinFrom, skinTo );
candidates = qskAnimatorCandidates( m_mask, oldTable, oldFilters, candidates = qskAnimatorCandidates( m_data->mask, oldTable, oldFilters,
m_skins[ 1 ]->hintTable(), m_skins[ 1 ]->graphicFilters() ); skinTo->hintTable(), skinTo->graphicFilters() );
} }
if ( !candidates.isEmpty() ) if ( !candidates.isEmpty() )
{ {
bool doGraphicFilter = m_mask & QskSkinTransition::Color; bool doGraphicFilter = m_data->mask & QskSkinTransition::Color;
const auto windows = qGuiApp->topLevelWindows(); const auto windows = qGuiApp->topLevelWindows();
@ -617,7 +634,7 @@ void QskSkinTransition::process()
if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) ) if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) )
{ {
if ( !quickWindow->isVisible() || if ( !quickWindow->isVisible() ||
( qskEffectiveSkin( quickWindow ) != m_skins[ 1 ] ) ) ( qskEffectiveSkin( quickWindow ) != skinTo ) )
{ {
continue; continue;
} }
@ -627,8 +644,8 @@ void QskSkinTransition::process()
if ( doGraphicFilter ) if ( doGraphicFilter )
{ {
group->addGraphicFilterAnimators( group->addGraphicFilterAnimators(
m_animationHint, oldFilters, m_data->animationHint, oldFilters,
m_skins[ 1 ]->graphicFilters() ); skinTo->graphicFilters() );
doGraphicFilter = false; doGraphicFilter = false;
} }
@ -639,7 +656,7 @@ void QskSkinTransition::process()
*/ */
group->addAnimators( quickWindow->contentItem(), group->addAnimators( quickWindow->contentItem(),
m_animationHint, candidates, m_skins[ 1 ] ); m_data->animationHint, candidates, skinTo );
qskSkinAnimator->add( group ); qskSkinAnimator->add( group );
} }

View File

@ -1,10 +1,11 @@
#ifndef QSK_SKIN_TRANSITION_H #ifndef QSK_SKIN_TRANSITION_H
#define QSK_SKIN_TRANSITION_H #define QSK_SKIN_TRANSITION_H
#include "QskAnimationHint.h"
#include "QskAspect.h" #include "QskAspect.h"
#include <memory>
class QskSkin; class QskSkin;
class QskAnimationHint;
class QQuickWindow; class QQuickWindow;
class QVariant; class QVariant;
@ -44,9 +45,10 @@ class QSK_EXPORT QskSkinTransition
virtual void updateSkin( QskSkin*, QskSkin* ); virtual void updateSkin( QskSkin*, QskSkin* );
private: private:
QskSkin* m_skins[ 2 ]; Q_DISABLE_COPY( QskSkinTransition )
QskAnimationHint m_animationHint;
Type m_mask : 2; class PrivateData;
std::unique_ptr< PrivateData > m_data;
}; };
#endif #endif

View File

@ -263,7 +263,7 @@ void QskSkinlet::updateNode( QskSkinnable* skinnable, QSGNode* parentNode ) cons
replaceChildNode( DebugRole, parentNode, oldNode, newNode ); replaceChildNode( DebugRole, parentNode, oldNode, newNode );
} }
for ( const auto nodeRole : m_data->nodeRoles ) for ( const auto nodeRole : qAsConst( m_data->nodeRoles ) )
{ {
Q_ASSERT( nodeRole < FirstReservedRole ); Q_ASSERT( nodeRole < FirstReservedRole );

View File

@ -167,6 +167,8 @@ class QSK_EXPORT QskSkinlet
const QSizeF& hint, const QSizeF& constraint ) const; const QSizeF& hint, const QSizeF& constraint ) const;
private: private:
Q_DISABLE_COPY( QskSkinlet )
class PrivateData; class PrivateData;
std::unique_ptr< PrivateData > m_data; std::unique_ptr< PrivateData > m_data;
}; };

View File

@ -220,8 +220,7 @@ static inline QskAspect qskSubstitutedAspect(
if ( aspect.hasStates() ) if ( aspect.hasStates() )
{ {
qWarning() << "QskSkinnable::(re)setSkinHint: setting hints with states " qWarning() << "QskSkinnable::(re)setSkinHint: setting hints with states "
"is discouraged - use QskSkinTableEditor if you are " "is discouraged - use QskSkinTableEditor if you are sure, that you need this.";
"sure, that you need this.";
qWarning() << "QskAspect:" << aspect.stateless() qWarning() << "QskAspect:" << aspect.stateless()
<< skinnable->skinStatesAsPrintable( aspect.states() ); << skinnable->skinStatesAsPrintable( aspect.states() );
@ -1167,14 +1166,14 @@ bool QskSkinnable::isTransitionAccepted( QskAspect aspect ) const
} }
void QskSkinnable::startTransition( QskAspect aspect, void QskSkinnable::startTransition( QskAspect aspect,
QskAnimationHint animationHint, QVariant from, QVariant to ) QskAnimationHint animationHint, const QVariant& from, const QVariant& to )
{ {
aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) ); aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) );
startHintTransition( aspect, animationHint, from, to ); startHintTransition( aspect, animationHint, from, to );
} }
void QskSkinnable::startHintTransition( QskAspect aspect, void QskSkinnable::startHintTransition( QskAspect aspect,
QskAnimationHint animationHint, QVariant from, QVariant to ) QskAnimationHint animationHint, const QVariant& from, const QVariant& to )
{ {
if ( animationHint.duration <= 0 || ( from == to ) ) if ( animationHint.duration <= 0 || ( from == to ) )
return; return;
@ -1189,15 +1188,18 @@ void QskSkinnable::startHintTransition( QskAspect aspect,
to fallback to 0.0 ). In this case we create a default one. to fallback to 0.0 ). In this case we create a default one.
*/ */
if ( !from.isValid() ) auto v1 = from;
auto v2 = to;
if ( !v1.isValid() )
{ {
from = qskTypedNullValue( to ); v1 = qskTypedNullValue( v2 );
} }
else if ( !to.isValid() ) else if ( !v2.isValid() )
{ {
to = qskTypedNullValue( from ); v2 = qskTypedNullValue( v1 );
} }
else if ( from.userType() != to.userType() ) else if ( v1.userType() != v2.userType() )
{ {
return; return;
} }
@ -1206,8 +1208,8 @@ void QskSkinnable::startHintTransition( QskAspect aspect,
{ {
const auto skin = effectiveSkin(); const auto skin = effectiveSkin();
from.setValue( skin->graphicFilter( from.toInt() ) ); v1.setValue( skin->graphicFilter( v1.toInt() ) );
to.setValue( skin->graphicFilter( to.toInt() ) ); v2.setValue( skin->graphicFilter( v2.toInt() ) );
} }
aspect.clearStates(); aspect.clearStates();
@ -1220,9 +1222,9 @@ void QskSkinnable::startHintTransition( QskAspect aspect,
auto animator = m_data->animators.animator( aspect ); auto animator = m_data->animators.animator( aspect );
if ( animator && animator->isRunning() ) if ( animator && animator->isRunning() )
from = animator->currentValue(); v1 = animator->currentValue();
m_data->animators.start( control, aspect, animationHint, from, to ); m_data->animators.start( control, aspect, animationHint, v1, v2 );
} }
void QskSkinnable::setSkinStateFlag( QskAspect::State stateFlag, bool on ) void QskSkinnable::setSkinStateFlag( QskAspect::State stateFlag, bool on )

View File

@ -119,7 +119,7 @@ class QSK_EXPORT QskSkinnable
QskSkin* effectiveSkin() const; QskSkin* effectiveSkin() const;
void startTransition( QskAspect, void startTransition( QskAspect,
QskAnimationHint, QVariant from, QVariant to ); QskAnimationHint, const QVariant& from, const QVariant& to );
QskAspect::Subcontrol effectiveSubcontrol( QskAspect::Subcontrol ) const; QskAspect::Subcontrol effectiveSubcontrol( QskAspect::Subcontrol ) const;
@ -240,8 +240,10 @@ class QSK_EXPORT QskSkinnable
const QskSkinHintTable& hintTable() const; const QskSkinHintTable& hintTable() const;
private: private:
Q_DISABLE_COPY( QskSkinnable )
void startHintTransition( QskAspect, void startHintTransition( QskAspect,
QskAnimationHint, QVariant from, QVariant to ); QskAnimationHint, const QVariant& from, const QVariant& to );
QVariant animatedValue( QskAspect, QskSkinHintStatus* ) const; QVariant animatedValue( QskAspect, QskSkinHintStatus* ) const;
const QVariant& storedHint( QskAspect, QskSkinHintStatus* = nullptr ) const; const QVariant& storedHint( QskAspect, QskSkinHintStatus* = nullptr ) const;

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_SUB_WINDOW_H #ifndef QSK_SUB_WINDOW_H
#define QSK_SUB_WINDOW_H 1 #define QSK_SUB_WINDOW_H
#include "QskPopup.h" #include "QskPopup.h"

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_SUB_WINDOW_AREA_H #ifndef QSK_SUB_WINDOW_AREA_H
#define QSK_SUB_WINDOW_AREA_H 1 #define QSK_SUB_WINDOW_AREA_H
#include "QskControl.h" #include "QskControl.h"

View File

@ -219,7 +219,7 @@ namespace
inline QskLinearBox* buttonBox() const inline QskLinearBox* buttonBox() const
{ {
return qobject_cast< QskLinearBox* >( childItems().first() ); return qobject_cast< QskLinearBox* >( childItems().constFirst() );
} }
void enableAutoTranslation( bool on ) void enableAutoTranslation( bool on )

View File

@ -766,12 +766,12 @@ int QskTextInput::passwordMaskDelay() const
void QskTextInput::setPasswordMaskDelay( int ms ) void QskTextInput::setPasswordMaskDelay( int ms )
{ {
return m_data->textInput->setPasswordMaskDelay( ms ); m_data->textInput->setPasswordMaskDelay( ms );
} }
void QskTextInput::resetPasswordMaskDelay() void QskTextInput::resetPasswordMaskDelay()
{ {
return m_data->textInput->resetPasswordMaskDelay(); m_data->textInput->resetPasswordMaskDelay();
} }
QString QskTextInput::displayText() const QString QskTextInput::displayText() const
@ -781,7 +781,7 @@ QString QskTextInput::displayText() const
QString QskTextInput::preeditText() const QString QskTextInput::preeditText() const
{ {
auto d = QQuickTextInputPrivate::get( m_data->textInput ); const auto d = QQuickTextInputPrivate::get( m_data->textInput );
return d->m_textLayout.preeditAreaText(); return d->m_textLayout.preeditAreaText();
} }
@ -816,7 +816,7 @@ QVariant QskTextInput::inputMethodQuery(
} }
QVariant QskTextInput::inputMethodQuery( QVariant QskTextInput::inputMethodQuery(
Qt::InputMethodQuery query, QVariant argument ) const Qt::InputMethodQuery query, const QVariant& argument ) const
{ {
switch ( query ) switch ( query )
{ {

View File

@ -146,7 +146,7 @@ class QSK_EXPORT QskTextInput : public QskControl
bool fixup(); bool fixup();
QVariant inputMethodQuery( Qt::InputMethodQuery ) const override; QVariant inputMethodQuery( Qt::InputMethodQuery ) const override;
QVariant inputMethodQuery( Qt::InputMethodQuery, QVariant argument ) const; QVariant inputMethodQuery( Qt::InputMethodQuery, const QVariant& argument ) const;
bool canUndo() const; bool canUndo() const;
bool canRedo() const; bool canRedo() const;

View File

@ -21,14 +21,17 @@
#include <qvariantanimation.h> #include <qvariantanimation.h>
QSK_QT_PRIVATE_BEGIN QSK_QT_PRIVATE_BEGIN
#if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) #if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 )
#ifndef emit #ifndef emit
// qvariantanimation_p.h needs it
#define emit #define emit
#include <private/qabstractanimation_p.h>
#undef emit
#endif #endif
#endif #endif
#include <private/qvariantanimation_p.h> #include <private/qvariantanimation_p.h>
QSK_QT_PRIVATE_END QSK_QT_PRIVATE_END
#if 1 #if 1

View File

@ -119,7 +119,7 @@ static inline void qskSetVisualizationMode(
#endif #endif
} }
static inline QByteArray qskVisualizationMode( const QQuickWindow* window ) static inline const QByteArray& qskVisualizationMode( const QQuickWindow* window )
{ {
auto d = QQuickWindowPrivate::get( const_cast< QQuickWindow* >( window ) ); auto d = QQuickWindowPrivate::get( const_cast< QQuickWindow* >( window ) );
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) #if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
@ -128,6 +128,7 @@ static inline QByteArray qskVisualizationMode( const QQuickWindow* window )
return d->customRenderMode; return d->customRenderMode;
#endif #endif
} }
class QskWindowPrivate : public QQuickWindowPrivate class QskWindowPrivate : public QQuickWindowPrivate
{ {
Q_DECLARE_PUBLIC( QskWindow ) Q_DECLARE_PUBLIC( QskWindow )
@ -201,23 +202,6 @@ QskWindow::QskWindow( QQuickRenderControl* renderControl, QWindow* parent )
QskWindow::~QskWindow() QskWindow::~QskWindow()
{ {
#if QT_VERSION < QT_VERSION_CHECK( 5, 12, 0 )
// When being used from Qml the item destruction would run in the most
// unefficient way, leading to lots of QQuickItem::ItemChildRemovedChange
// depending operations.
QVector< QPointer< QQuickItem > > items;
const auto children = contentItem()->childItems();
for ( auto child : children )
{
if ( child->parent() == contentItem() )
items += child;
}
for ( auto& item : qskAsConst( items ) )
delete item;
#endif
} }
#if QT_VERSION < QT_VERSION_CHECK( 5, 9, 0 ) #if QT_VERSION < QT_VERSION_CHECK( 5, 9, 0 )
@ -236,7 +220,8 @@ void QskWindow::setScreen( const QString& name )
{ {
if ( !name.isEmpty() ) if ( !name.isEmpty() )
{ {
for ( auto screen : QGuiApplication::screens() ) const auto screens = QGuiApplication::screens();
for ( auto screen : screens )
{ {
if ( screen->name() == name ) if ( screen->name() == name )
{ {
@ -579,7 +564,7 @@ void QskWindow::setCustomRenderMode( const char* mode )
class RenderJob final : public QRunnable class RenderJob final : public QRunnable
{ {
public: public:
RenderJob( QQuickWindow* window, const QByteArray mode ) RenderJob( QQuickWindow* window, const QByteArray& mode )
: m_window( window ) : m_window( window )
, m_mode( mode ) , m_mode( mode )
{ {

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_WINDOW_H #ifndef QSK_WINDOW_H
#define QSK_WINDOW_H 1 #define QSK_WINDOW_H
#include "QskGlobal.h" #include "QskGlobal.h"
#include <qquickwindow.h> #include <qquickwindow.h>

View File

@ -1,2 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = ../

View File

@ -19,6 +19,8 @@
#include <qpointer.h> #include <qpointer.h>
#include <qquickwindow.h> #include <qquickwindow.h>
#include <qpa/qplatformdialoghelper.h>
static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox ) static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox )
{ {
// not the fastest code ever, but usually we always // not the fastest code ever, but usually we always
@ -45,7 +47,7 @@ static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox
static QskDialog::DialogCode qskExec( QskDialogWindow* dialogWindow ) static QskDialog::DialogCode qskExec( QskDialogWindow* dialogWindow )
{ {
#if 1 #if 1
QskFocusIndicator* focusIndicator = new QskFocusIndicator(); auto focusIndicator = new QskFocusIndicator();
focusIndicator->setObjectName( QStringLiteral( "DialogFocusIndicator" ) ); focusIndicator->setObjectName( QStringLiteral( "DialogFocusIndicator" ) );
dialogWindow->addItem( focusIndicator ); dialogWindow->addItem( focusIndicator );
#endif #endif
@ -58,7 +60,7 @@ static QQuickWindow* qskSomeQuickWindow()
// not the best code ever, but as it is a fallback only // not the best code ever, but as it is a fallback only
// maybe we should also add the stacking order // maybe we should also add the stacking order
QWindowList windows = QGuiApplication::topLevelWindows(); const auto windows = QGuiApplication::topLevelWindows();
for ( auto window : windows ) for ( auto window : windows )
{ {
if ( window->isVisible() ) if ( window->isVisible() )
@ -336,4 +338,12 @@ QString QskDialog::select(
} }
QskDialog::ActionRole QskDialog::actionRole( Action action )
{
using Q = QPlatformDialogHelper;
const auto role = Q::buttonRole( static_cast< Q::StandardButton >( action ) );
return static_cast< ActionRole >( role );
}
#include "moc_QskDialog.cpp" #include "moc_QskDialog.cpp"

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_DIALOG_H #ifndef QSK_DIALOG_H
#define QSK_DIALOG_H 1 #define QSK_DIALOG_H
#include "QskGlobal.h" #include "QskGlobal.h"
@ -139,6 +139,8 @@ class QSK_EXPORT QskDialog : public QObject
const QString& title, const QString& text, const QString& title, const QString& text,
const QStringList& entries, int selectedRow = 0 ) const; const QStringList& entries, int selectedRow = 0 ) const;
static ActionRole actionRole( Action action );
Q_SIGNALS: Q_SIGNALS:
void transientParentChanged(); void transientParentChanged();
void policyChanged(); void policyChanged();

View File

@ -5,6 +5,7 @@
#include "QskDialogButton.h" #include "QskDialogButton.h"
#include "QskDialogButtonBox.h" #include "QskDialogButtonBox.h"
#include "QskSkin.h"
QSK_SUBCONTROL( QskDialogButton, Panel ) QSK_SUBCONTROL( QskDialogButton, Panel )
QSK_SUBCONTROL( QskDialogButton, Text ) QSK_SUBCONTROL( QskDialogButton, Text )
@ -15,7 +16,7 @@ QskDialogButton::QskDialogButton(
: QskPushButton( parent ) : QskPushButton( parent )
, m_action( action ) , m_action( action )
{ {
setText( QskDialogButtonBox::buttonText( m_action ) ); resetButton();
} }
QskDialogButton::QskDialogButton( QQuickItem* parent ) QskDialogButton::QskDialogButton( QQuickItem* parent )
@ -47,7 +48,7 @@ void QskDialogButton::setAction( QskDialog::Action action )
if ( action != m_action ) if ( action != m_action )
{ {
m_action = action; m_action = action;
setText( QskDialogButtonBox::buttonText( m_action ) ); resetButton();
Q_EMIT actionChanged(); Q_EMIT actionChanged();
} }
@ -60,10 +61,21 @@ QskDialog::Action QskDialogButton::action() const
void QskDialogButton::changeEvent( QEvent* event ) void QskDialogButton::changeEvent( QEvent* event )
{ {
if ( event->type() == QEvent::LocaleChange ) switch( static_cast< int >( event->type() ) )
setText( QskDialogButtonBox::buttonText( m_action ) ); {
case QEvent::LocaleChange:
case QEvent::StyleChange:
resetButton();
break;
}
Inherited::changeEvent( event ); Inherited::changeEvent( event );
} }
void QskDialogButton::resetButton()
{
if ( const auto skin = effectiveSkin() )
setText( skin->dialogButtonText( m_action ) );
}
#include "moc_QskDialogButton.cpp" #include "moc_QskDialogButton.cpp"

View File

@ -39,6 +39,8 @@ class QSK_EXPORT QskDialogButton : public QskPushButton
QskAspect::Subcontrol ) const override; QskAspect::Subcontrol ) const override;
private: private:
void resetButton();
QskDialog::Action m_action; QskDialog::Action m_action;
}; };

View File

@ -15,11 +15,6 @@
#include <qvector.h> #include <qvector.h>
#include <qpa/qplatformdialoghelper.h> #include <qpa/qplatformdialoghelper.h>
#include <qpa/qplatformtheme.h>
QSK_QT_PRIVATE_BEGIN
#include <private/qguiapplication_p.h>
QSK_QT_PRIVATE_END
#include <limits> #include <limits>
@ -31,14 +26,6 @@ static void qskSendEventTo( QObject* object, QEvent::Type type )
QCoreApplication::sendEvent( object, &event ); QCoreApplication::sendEvent( object, &event );
} }
static inline QskDialog::ActionRole qskActionRole( QskDialog::Action action )
{
const auto role = QPlatformDialogHelper::buttonRole(
static_cast< QPlatformDialogHelper::StandardButton >( action ) );
return static_cast< QskDialog::ActionRole >( role );
}
namespace namespace
{ {
class LayoutEngine : public QskLinearLayoutEngine class LayoutEngine : public QskLinearLayoutEngine
@ -131,7 +118,7 @@ QskDialogButtonBox::~QskDialogButtonBox()
{ {
for ( int i = 0; i < QskDialog::NActionRoles; i++ ) for ( int i = 0; i < QskDialog::NActionRoles; i++ )
{ {
for ( auto button : qskAsConst( m_data->buttons[ i ] ) ) for ( auto button : qAsConst( m_data->buttons[ i ] ) )
{ {
/* /*
The destructor of QQuickItem sets the parentItem of The destructor of QQuickItem sets the parentItem of
@ -346,9 +333,8 @@ void QskDialogButtonBox::addButton(
void QskDialogButtonBox::addAction( QskDialog::Action action ) void QskDialogButtonBox::addAction( QskDialog::Action action )
{ {
QskPushButton* button = createButton( action ); if ( auto button = createButton( action ) )
if ( button ) addButton( button, QskDialog::actionRole( action ) );
addButton( button, qskActionRole( action ) );
} }
void QskDialogButtonBox::removeButton( QskPushButton* button ) void QskDialogButtonBox::removeButton( QskPushButton* button )
@ -579,32 +565,10 @@ void QskDialogButtonBox::itemChange(
bool QskDialogButtonBox::isDefaultButtonKeyEvent( const QKeyEvent* event ) bool QskDialogButtonBox::isDefaultButtonKeyEvent( const QKeyEvent* event )
{ {
if ( event->modifiers() & Qt::KeypadModifier && event->key() == Qt::Key_Enter ) if ( !event->modifiers() )
{ return ( event->key() == Qt::Key_Enter ) || ( event->key() == Qt::Key_Return );
return ( event->modifiers() & Qt::KeypadModifier )
&& ( event->key() == Qt::Key_Enter );
}
else
{
return ( event->key() == Qt::Key_Enter ) ||
( event->key() == Qt::Key_Return );
}
}
QString QskDialogButtonBox::buttonText( QskDialog::Action action ) return ( event->modifiers() & Qt::KeypadModifier ) && ( event->key() == Qt::Key_Enter );
{
// should be redirected through the skin !
const QPlatformTheme* theme = QGuiApplicationPrivate::platformTheme();
QString text = theme->standardButtonText( action );
#if QT_VERSION < QT_VERSION_CHECK( 5, 7, 0 )
text.remove( '&' );
#else
text = QPlatformTheme::removeMnemonics( text );
#endif
return text;
} }
#include "moc_QskDialogButtonBox.cpp" #include "moc_QskDialogButtonBox.cpp"

View File

@ -61,7 +61,6 @@ class QSK_EXPORT QskDialogButtonBox : public QskBox
QskPushButton* defaultButton() const; QskPushButton* defaultButton() const;
static bool isDefaultButtonKeyEvent( const QKeyEvent* ); static bool isDefaultButtonKeyEvent( const QKeyEvent* );
static QString buttonText( QskDialog::Action );
Q_SIGNALS: Q_SIGNALS:
void clicked( QskPushButton* button ); void clicked( QskPushButton* button );

View File

@ -7,6 +7,7 @@
#include "QskDialogButtonBox.h" #include "QskDialogButtonBox.h"
#include "QskPushButton.h" #include "QskPushButton.h"
#include "QskQuick.h" #include "QskQuick.h"
#include "QskEvent.h"
#include <qquickwindow.h> #include <qquickwindow.h>
#include <qpointer.h> #include <qpointer.h>
@ -280,7 +281,7 @@ void QskDialogSubWindow::keyPressEvent( QKeyEvent* event )
button->click(); button->click();
} }
if ( event->matches( QKeySequence::Cancel ) ) if ( qskIsStandardKeyInput( event, QKeySequence::Cancel ) )
{ {
// using shortcuts instead ??? // using shortcuts instead ???

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_DIALOG_SUB_WINDOW_H #ifndef QSK_DIALOG_SUB_WINDOW_H
#define QSK_DIALOG_SUB_WINDOW_H 1 #define QSK_DIALOG_SUB_WINDOW_H
#include "QskDialog.h" #include "QskDialog.h"
#include "QskSubWindow.h" #include "QskSubWindow.h"

View File

@ -8,6 +8,7 @@
#include "QskLinearBox.h" #include "QskLinearBox.h"
#include "QskPushButton.h" #include "QskPushButton.h"
#include "QskQuick.h" #include "QskQuick.h"
#include "QskEvent.h"
#include <qeventloop.h> #include <qeventloop.h>
#include <qpointer.h> #include <qpointer.h>
@ -248,7 +249,7 @@ void QskDialogWindow::keyPressEvent( QKeyEvent* event )
button->click(); button->click();
} }
if ( event->matches( QKeySequence::Cancel ) ) if ( qskIsStandardKeyInput( event, QKeySequence::Cancel ) )
{ {
// using shortcuts instead ??? // using shortcuts instead ???

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_DIALOG_WINDOW_H #ifndef QSK_DIALOG_WINDOW_H
#define QSK_DIALOG_WINDOW_H 1 #define QSK_DIALOG_WINDOW_H
#include "QskDialog.h" #include "QskDialog.h"
#include "QskWindow.h" #include "QskWindow.h"

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_MESSAGE_SUB_WINDOW_H #ifndef QSK_MESSAGE_SUB_WINDOW_H
#define QSK_MESSAGE_SUB_WINDOW_H 1 #define QSK_MESSAGE_SUB_WINDOW_H
#include "QskDialogSubWindow.h" #include "QskDialogSubWindow.h"

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_MESSAGE_WINDOW_H #ifndef QSK_MESSAGE_WINDOW_H
#define QSK_MESSAGE_WINDOW_H 1 #define QSK_MESSAGE_WINDOW_H
#include "QskDialogWindow.h" #include "QskDialogWindow.h"

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#ifndef QSK_SELECTION_SUB_WINDOW_H #ifndef QSK_SELECTION_SUB_WINDOW_H
#define QSK_SELECTION_SUB_WINDOW_H 1 #define QSK_SELECTION_SUB_WINDOW_H
#include "QskDialogSubWindow.h" #include "QskDialogSubWindow.h"

Some files were not shown because too many files have changed in this diff Show More