From ae2c6d87a8d09ecfe9b4cb9f621baeab6dbdf148 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 8 Mar 2022 11:53:46 +0100 Subject: [PATCH 001/107] upport for Qt < Qt 5.12 dropped --- README.md | 4 +- examples/automotive/SpeedometerSkinlet.cpp | 4 -- examples/iotdashboard/MenuBar.cpp | 2 +- features/qskqvg.prf | 36 +++------------- src/common/QskGlobal.h | 17 -------- src/common/QskNamespace.h | 41 +++--------------- src/common/QskObjectCounter.cpp | 4 +- src/common/QskPlatform.cpp | 8 ---- src/controls/QskControl.cpp | 49 ---------------------- src/controls/QskEvent.cpp | 2 - src/controls/QskFocusIndicator.cpp | 2 +- src/controls/QskGestureRecognizer.cpp | 4 +- src/controls/QskInputGrabber.cpp | 18 -------- src/controls/QskListView.cpp | 5 +-- src/controls/QskQuick.cpp | 16 +------ src/controls/QskQuickItem.cpp | 18 +------- src/controls/QskQuickItem.h | 13 ------ src/controls/QskScrollArea.cpp | 10 ----- src/controls/QskShortcutMap.cpp | 4 +- src/controls/QskSkinManager.cpp | 2 +- src/controls/QskSkinnable.cpp | 11 ----- src/controls/QskTextInput.cpp | 18 +------- src/controls/QskTextInput.h | 8 ---- src/controls/QskWindow.cpp | 29 ------------- src/controls/QskWindow.h | 4 -- src/dialogs/QskDialogButtonBox.cpp | 9 +--- src/graphic/QskGraphic.cpp | 4 +- src/layouts/QskStackBox.cpp | 2 +- src/nodes/QskTickmarksNode.cpp | 4 -- 29 files changed, 32 insertions(+), 316 deletions(-) diff --git a/README.md b/README.md index 9831aa97..25e19754 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ controls is limited to the needs of the driving projects. QSkinny is supposed to run on all platforms being supported by Qt/Quick. 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.12, but you can rely on: -- Qt 5.6 +- Qt 5.15 - current long term supported ( LTS ) version of Qt - current version of Qt diff --git a/examples/automotive/SpeedometerSkinlet.cpp b/examples/automotive/SpeedometerSkinlet.cpp index 05b1333b..5eff6632 100644 --- a/examples/automotive/SpeedometerSkinlet.cpp +++ b/examples/automotive/SpeedometerSkinlet.cpp @@ -28,11 +28,7 @@ namespace LinesNode( int lineCount = 0 ) : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 2 * lineCount ) { -#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( &m_geometry ); diff --git a/examples/iotdashboard/MenuBar.cpp b/examples/iotdashboard/MenuBar.cpp index 817d95bf..ccbcd5d3 100644 --- a/examples/iotdashboard/MenuBar.cpp +++ b/examples/iotdashboard/MenuBar.cpp @@ -46,7 +46,7 @@ MenuBar::MenuBar( QQuickItem* parent ) 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 ); m_entries.append( entry ); diff --git a/features/qskqvg.prf b/features/qskqvg.prf index 6664192b..39f25b4e 100644 --- a/features/qskqvg.prf +++ b/features/qskqvg.prf @@ -31,40 +31,16 @@ qvgrcc.CONFIG += add_inputs_as_makefile_deps QRC_SHADOW_CLONE = $$shell_path( $${OUT_PWD}/${QMAKE_FILE_BASE}_shadow.qrc ) qtPrepareTool(QMAKE_RCC, rcc, _DEP) -lessThan(QT_MAJOR_VERSION, 6): lessThan(QT_MINOR_VERSION, 12) { +equals( OUT_PWD, $${_PRO_FILE_PWD_} ) { - # Since Qt 5.12 "rcc --list" works for qvg files, that do not yet exist - # To get these rules working for earlier versions we derive the qvg - # files from the SVGSOURCES - - defineReplace(qvgfiles) { - - svgfiles = $$1 - - files = - for( svgfile, svgfiles) { - filename = $$basename( svgfile ) - files += $$shell_path( $${QVG_DIR}/$$replace( filename, svg, qvg ) ) - } - - return( $$files ) - } - - qvgrcc.depends += $$qvgfiles( $${SVGSOURCES} ) + qvgrcc.depend_command = $$QMAKE_RCC_DEP -list $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} } else { - equals( OUT_PWD, $${_PRO_FILE_PWD_} ) { - - qvgrcc.depend_command = $$QMAKE_RCC_DEP -list $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} - - } else { - - qvgrcc.depend_command = \ - $${QMAKE_COPY} ${QMAKE_FILE_IN} $${QRC_SHADOW_CLONE} && \ - $$QMAKE_RCC_DEP -list $$QMAKE_RESOURCE_FLAGS $${QRC_SHADOW_CLONE} && \ - $${QMAKE_DEL_FILE} $${QRC_SHADOW_CLONE} - } + qvgrcc.depend_command = \ + $${QMAKE_COPY} ${QMAKE_FILE_IN} $${QRC_SHADOW_CLONE} && \ + $$QMAKE_RCC_DEP -list $$QMAKE_RESOURCE_FLAGS $${QRC_SHADOW_CLONE} && \ + $${QMAKE_DEL_FILE} $${QRC_SHADOW_CLONE} } equals( OUT_PWD, $${_PRO_FILE_PWD_} ) { diff --git a/src/common/QskGlobal.h b/src/common/QskGlobal.h index a4451f77..56361c17 100644 --- a/src/common/QskGlobal.h +++ b/src/common/QskGlobal.h @@ -39,23 +39,6 @@ #define QSK_QT_PRIVATE_END \ QT_WARNING_POP -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) - -#define qskAsConst qAsConst - -#else - -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 diff --git a/src/common/QskNamespace.h b/src/common/QskNamespace.h index 73f33939..0e1872e3 100644 --- a/src/common/QskNamespace.h +++ b/src/common/QskNamespace.h @@ -9,36 +9,9 @@ #include "QskGlobal.h" #include -#if QT_VERSION < QT_VERSION_CHECK( 5, 8, 0 ) - // hack to run moc over a namespace - - #ifdef Q_MOC_RUN - - #define QSK_NAMESPACE( name ) struct name - #define QSK_ENUM( name ) Q_GADGET Q_ENUM( name ) - - #else - - #define QSK_NAMESPACE( name ) namespace name - #define QSK_ENUM( name ) \ - inline constexpr const QMetaObject* qt_getEnumMetaObject(name) noexcept { return &staticMetaObject; } \ - inline constexpr const char* qt_getEnumName(name) noexcept { return #name; } - - #endif - - #define QSK_Q_NAMESPACE extern const QMetaObject staticMetaObject; - -#else - - #define QSK_NAMESPACE( name ) namespace name - #define QSK_ENUM Q_ENUM_NS - - #define QSK_Q_NAMESPACE Q_NAMESPACE -#endif - -QSK_NAMESPACE( Qsk ) +namespace Qsk { - QSK_EXPORT QSK_Q_NAMESPACE + QSK_EXPORT Q_NAMESPACE enum Direction { @@ -47,7 +20,7 @@ QSK_NAMESPACE( Qsk ) TopToBottom, BottomToTop }; - QSK_ENUM( Direction ) + Q_ENUM_NS( Direction ) enum Position { @@ -56,7 +29,7 @@ QSK_NAMESPACE( Qsk ) Right, Bottom }; - QSK_ENUM( Position ) + Q_ENUM_NS( Position ) enum TextStyle { @@ -65,11 +38,7 @@ QSK_NAMESPACE( Qsk ) Raised, Sunken }; - QSK_ENUM( TextStyle ) + Q_ENUM_NS( TextStyle ) } -#undef QSK_NAMESPACE -#undef QSK_ENUM -#undef QSK_Q_NAMESPACE - #endif diff --git a/src/common/QskObjectCounter.cpp b/src/common/QskObjectCounter.cpp index 7cc95051..61d6b6ec 100644 --- a/src/common/QskObjectCounter.cpp +++ b/src/common/QskObjectCounter.cpp @@ -162,7 +162,7 @@ void CounterHook::addObject( QObject* object ) { const bool isItem = qskIsItem( object ); - for ( auto counterData : qskAsConst( m_counterDataSet ) ) + for ( auto counterData : qAsConst( m_counterDataSet ) ) { counterData->counter[ QskObjectCounter::Objects ].increment(); @@ -182,7 +182,7 @@ void CounterHook::removeObject( QObject* object ) { const bool isItem = qskIsItem( object ); - for ( auto counterData : qskAsConst( m_counterDataSet ) ) + for ( auto counterData : qAsConst( m_counterDataSet ) ) { counterData->counter[ QskObjectCounter::Objects ].decrement(); diff --git a/src/common/QskPlatform.cpp b/src/common/QskPlatform.cpp index 062c1064..67fbfdf1 100644 --- a/src/common/QskPlatform.cpp +++ b/src/common/QskPlatform.cpp @@ -5,14 +5,6 @@ QSK_QT_PRIVATE_BEGIN #include - -#if QT_VERSION < QT_VERSION_CHECK( 5, 8, 0 ) - #ifndef foreach - // qhighdpiscaling_p.h needs it - #define foreach Q_FOREACH - #endif -#endif - #include QSK_QT_PRIVATE_END diff --git a/src/controls/QskControl.cpp b/src/controls/QskControl.cpp index 5edd886e..a0aff322 100644 --- a/src/controls/QskControl.cpp +++ b/src/controls/QskControl.cpp @@ -758,55 +758,6 @@ bool QskControl::event( QEvent* event ) bool QskControl::childMouseEventFilter( QQuickItem* item, QEvent* event ) { -#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 ) - - if ( event->type() == QEvent::MouseButtonPress ) - { - auto me = static_cast< QMouseEvent* >( event ); - - if ( me->source() == Qt::MouseEventSynthesizedByQt ) - { - /* - Unhandled touch events result in creating synthetic - mouse events. For all versions < 5.10 those events are - passed through childMouseEventFilter without doing the - extra checks, that are done for real mouse events. - Furthermore the coordinates are relative - to this - not to item. - - To avoid having a different behavior between using - mouse and touch, we do those checks here. - */ - - auto itm = item; - auto pos = item->mapFromScene( me->windowPos() ); - - for ( itm = item; itm != this; itm = itm->parentItem() ) - { - if ( itm->acceptedMouseButtons() & me->button() ) - { - if ( itm->contains( pos ) ) - break; - } - - pos += QPointF( itm->x(), itm->y() ); - } - - if ( itm != item ) - { - if ( itm == this ) - return false; - - QScopedPointer< QMouseEvent > clonedEvent( - QQuickWindowPrivate::cloneMouseEvent( me, &pos ) ); - - return d_func()->maybeGesture( itm, clonedEvent.data() ); - } - } - } - -#endif - return d_func()->maybeGesture( item, event ); } diff --git a/src/controls/QskEvent.cpp b/src/controls/QskEvent.cpp index 6a77d9b8..84d16d8b 100644 --- a/src/controls/QskEvent.cpp +++ b/src/controls/QskEvent.cpp @@ -105,10 +105,8 @@ qreal qskWheelIncrement( const QWheelEvent* event ) auto angleDelta = event->angleDelta(); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) if ( event->inverted() ) angleDelta.setY( -angleDelta.y() ); -#endif const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); return delta / QWheelEvent::DefaultDeltasPerStep; diff --git a/src/controls/QskFocusIndicator.cpp b/src/controls/QskFocusIndicator.cpp index 42a12bb8..5e4f18aa 100644 --- a/src/controls/QskFocusIndicator.cpp +++ b/src/controls/QskFocusIndicator.cpp @@ -49,7 +49,7 @@ class QskFocusIndicator::PrivateData public: void resetConnections() { - for ( const auto& connection : qskAsConst( connections ) ) + for ( const auto& connection : qAsConst( connections ) ) QObject::disconnect( connection ); connections.clear(); diff --git a/src/controls/QskGestureRecognizer.cpp b/src/controls/QskGestureRecognizer.cpp index cd15a1f5..dc75d3c8 100644 --- a/src/controls/QskGestureRecognizer.cpp +++ b/src/controls/QskGestureRecognizer.cpp @@ -130,7 +130,7 @@ namespace { Timer* timer = nullptr; - for ( auto t : qskAsConst( m_table ) ) + for ( auto t : qAsConst( m_table ) ) { if ( t->recognizer() == nullptr || t->recognizer() == recognizer ) @@ -151,7 +151,7 @@ namespace void stopTimer( const QskGestureRecognizer* recognizer ) { - for ( auto timer : qskAsConst( m_table ) ) + for ( auto timer : qAsConst( m_table ) ) { if ( timer->recognizer() == recognizer ) { diff --git a/src/controls/QskInputGrabber.cpp b/src/controls/QskInputGrabber.cpp index f5d5d224..2bad7493 100644 --- a/src/controls/QskInputGrabber.cpp +++ b/src/controls/QskInputGrabber.cpp @@ -74,7 +74,6 @@ class QskInputGrabber::PrivateData final : public QQuickItemChangeListener } private: -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) void itemGeometryChanged( QQuickItem* item, QQuickGeometryChange change, const QRectF& ) override { @@ -88,21 +87,6 @@ class QskInputGrabber::PrivateData final : public QQuickItemChangeListener if ( doUpdate ) m_grabber->updateGeometry(); } -#else - void itemGeometryChanged( - QQuickItem* item, const QRectF& newRect, const QRectF& oldRect ) override - { - bool doUpdate = false; - - if ( item == itemAbove ) - doUpdate = newRect.topLeft() != oldRect.topLeft(); - else - doUpdate = newRect.size() != oldRect.size(); - - if ( doUpdate ) - m_grabber->updateGeometry(); - } -#endif void itemParentChanged( QQuickItem* item, QQuickItem* parentItem ) override { @@ -125,9 +109,7 @@ QskInputGrabber::QskInputGrabber( QQuickItem* parent ) , m_data( new PrivateData( this ) ) { setAcceptedMouseButtons( Qt::AllButtons ); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 ) setAcceptTouchEvents( true ); -#endif setAcceptHoverEvents( true ); setTransparentForPositioner( true ); diff --git a/src/controls/QskListView.cpp b/src/controls/QskListView.cpp index 550ed06c..f0a30301 100644 --- a/src/controls/QskListView.cpp +++ b/src/controls/QskListView.cpp @@ -323,10 +323,7 @@ QPointF QskListView::scrollOffset( const QWheelEvent* event ) const const auto viewHeight = viewContentsRect().height(); const qreal rowHeight = this->rowHeight(); - int numLines = 3; -#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) - numLines = QGuiApplication::styleHints()->wheelScrollLines(); -#endif + const int numLines = QGuiApplication::styleHints()->wheelScrollLines(); qreal dy = numLines * rowHeight; if ( event->modifiers() & ( Qt::ControlModifier | Qt::ShiftModifier ) ) diff --git a/src/controls/QskQuick.cpp b/src/controls/QskQuick.cpp index 8f6d4f22..b4dabdc4 100644 --- a/src/controls/QskQuick.cpp +++ b/src/controls/QskQuick.cpp @@ -58,19 +58,7 @@ bool qskIsAncestorOf( const QQuickItem* item, const QQuickItem* child ) if ( item == nullptr || child == nullptr ) return false; -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) return item->isAncestorOf( child ); -#else - while ( child ) - { - if ( child == item ) - return true; - - child = child->parentItem(); - } - - return false; -#endif } bool qskIsVisibleToParent( const QQuickItem* item ) @@ -645,7 +633,7 @@ void qskItemUpdateRecursive( QQuickItem* item ) qskItemUpdateRecursive( child ); } -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) && QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) static const QQuickPointerTouchEvent* qskPointerPressEvent( const QQuickWindowPrivate* wd ) { @@ -682,7 +670,7 @@ bool qskGrabMouse( QQuickItem* item ) item->setKeepMouseGrab( true ); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) && QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) auto wd = QQuickWindowPrivate::get( item->window() ); if ( wd->touchMouseDevice == nullptr ) diff --git a/src/controls/QskQuickItem.cpp b/src/controls/QskQuickItem.cpp index e8165233..8bb22370 100644 --- a/src/controls/QskQuickItem.cpp +++ b/src/controls/QskQuickItem.cpp @@ -157,12 +157,6 @@ QskQuickItem::QskQuickItem( QskQuickItemPrivate& dd, QQuickItem* parent ) { setFlag( QQuickItem::ItemHasContents, true ); -#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 ) - // since Qt 5.10 we have QQuickItem::ItemEnabledHasChanged - connect( this, &QQuickItem::enabledChanged, - this, &QskQuickItem::sendEnabledChangeEvent ); -#endif - if ( dd.updateFlags & QskQuickItem::DeferredUpdate ) qskFilterWindow( window() ); @@ -180,11 +174,6 @@ QskQuickItem::~QskQuickItem() if ( qskRegistry ) qskRegistry->remove( this ); - -#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 ) - disconnect( this, &QQuickItem::enabledChanged, - this, &QskQuickItem::sendEnabledChangeEvent ); -#endif } const char* QskQuickItem::className() const @@ -597,11 +586,6 @@ void QskQuickItem::resetImplicitSize() } } -void QskQuickItem::sendEnabledChangeEvent() -{ - qskSendEventTo( this, QEvent::EnabledChange ); -} - bool QskQuickItem::event( QEvent* event ) { const int eventType = event->type(); @@ -796,7 +780,7 @@ void QskQuickItem::itemChange( QQuickItem::ItemChange change, #if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 ) case QQuickItem::ItemEnabledHasChanged: { - sendEnabledChangeEvent(); + qskSendEventTo( this, QEvent::EnabledChange ); break; } #endif diff --git a/src/controls/QskQuickItem.h b/src/controls/QskQuickItem.h index 0256430d..c66f7826 100644 --- a/src/controls/QskQuickItem.h +++ b/src/controls/QskQuickItem.h @@ -63,9 +63,6 @@ class QSK_EXPORT QskQuickItem : public QQuickItem bool hasChildItems() const; QRectF rect() const; -#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 ) - QSizeF size() const; -#endif QSizeF implicitSize() const; void setGeometry( qreal x, qreal y, qreal width, qreal height ); @@ -168,7 +165,6 @@ class QSK_EXPORT QskQuickItem : public QQuickItem void childrenRect() = delete; void applyUpdateFlag( UpdateFlag, bool on ); - void sendEnabledChangeEvent(); QSGNode* updatePaintNode( QSGNode*, UpdatePaintNodeData* ) override final; virtual QSGNode* updateItemPaintNode( QSGNode* ); @@ -204,15 +200,6 @@ inline void QskQuickItem::setSize( qreal width, qreal height ) QQuickItem::setSize( QSizeF( width, height ) ); } -#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 ) - -inline QSizeF QskQuickItem::size() const -{ - return QSizeF( width(), height() ); -} - -#endif - inline QSizeF QskQuickItem::implicitSize() const { return QSizeF( implicitWidth(), implicitHeight() ); diff --git a/src/controls/QskScrollArea.cpp b/src/controls/QskScrollArea.cpp index 6a90730a..e2078c2b 100644 --- a/src/controls/QskScrollArea.cpp +++ b/src/controls/QskScrollArea.cpp @@ -241,7 +241,6 @@ namespace void itemChange( ItemChange, const ItemChangeData& ) override; -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) void itemGeometryChanged( QQuickItem*, QQuickGeometryChange change, const QRectF& ) override { @@ -249,15 +248,6 @@ namespace scrolledItemGeometryChange(); } -#else - void itemGeometryChanged( QQuickItem*, - const QRectF& newRect, const QRectF& oldRect ) override - { - if ( oldRect.size() != newRect.size() ) - scrolledItemGeometryChange(); - } -#endif - void updateNode( QSGNode* ) override; private: diff --git a/src/controls/QskShortcutMap.cpp b/src/controls/QskShortcutMap.cpp index 27f5a07e..0cd743df 100644 --- a/src/controls/QskShortcutMap.cpp +++ b/src/controls/QskShortcutMap.cpp @@ -173,7 +173,7 @@ void QskShortcutHandler::remove( int id ) Finally let's check if we can disconnect from the destroyed signals */ - for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) + for ( const auto& entry : qAsConst( m_invokeDataMap ) ) { if ( item == nullptr && receiver == nullptr ) break; @@ -276,7 +276,7 @@ bool QskShortcutHandler::invoke( QQuickItem* item, const QKeySequence& sequence { bool found = false; - for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) + for ( const auto& entry : qAsConst( m_invokeDataMap ) ) { auto& data = entry.second; diff --git a/src/controls/QskSkinManager.cpp b/src/controls/QskSkinManager.cpp index 287a363e..807753c1 100644 --- a/src/controls/QskSkinManager.cpp +++ b/src/controls/QskSkinManager.cpp @@ -341,7 +341,7 @@ class QskSkinManager::PrivateData { if ( !pluginsRegistered ) { - for ( const auto& path : qskAsConst( pluginPaths ) ) + for ( const auto& path : qAsConst( pluginPaths ) ) registerPlugins( path + QStringLiteral( "/skins" ) ); pluginsRegistered = true; diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 9801f35d..9c9d8726 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -35,18 +35,7 @@ static inline bool qskIsControl( const QskSkinnable* skinnable ) { -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) return skinnable->metaObject()->inherits( &QskControl::staticMetaObject ); -#else - for ( auto mo = skinnable->metaObject(); - mo != nullptr; mo = mo->superClass() ) - { - if ( mo == &QskControl::staticMetaObject ) - return true; - } - - return false; -#endif } static inline QVariant qskTypedNullValue( const QVariant& value ) diff --git a/src/controls/QskTextInput.cpp b/src/controls/QskTextInput.cpp index 229d0def..b16b8e7c 100644 --- a/src/controls/QskTextInput.cpp +++ b/src/controls/QskTextInput.cpp @@ -36,10 +36,8 @@ static inline void qskBindSignals( QObject::connect( wrappedInput, &QQuickTextInput::displayTextChanged, input, [ input ] { Q_EMIT input->displayTextChanged( input->displayText() ); } ); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) QObject::connect( wrappedInput, &QQuickTextInput::textEdited, input, [ input ] { Q_EMIT input->textEdited( input->text() ); } ); -#endif QObject::connect( wrappedInput, &QQuickTextInput::validatorChanged, input, &QskTextInput::validatorChanged ); @@ -50,10 +48,8 @@ static inline void qskBindSignals( QObject::connect( wrappedInput, &QQuickTextInput::readOnlyChanged, input, [ input ] { qskPropagateReadOnly( input ); } ); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) QObject::connect( wrappedInput, &QQuickTextInput::overwriteModeChanged, input, &QskTextInput::overwriteModeChanged ); -#endif QObject::connect( wrappedInput, &QQuickTextInput::maximumLengthChanged, input, &QskTextInput::maximumLengthChanged ); @@ -219,9 +215,7 @@ namespace return; setCursorVisible( on ); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) d->setBlinkingCursorEnabled( on ); -#endif if ( !on ) { @@ -561,11 +555,7 @@ void QskTextInput::setActivationModes( ActivationModes modes ) static inline void qskUpdateInputMethodFont( const QskTextInput* input ) { - auto queries = Qt::ImCursorRectangle | Qt::ImFont; -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) - queries |= Qt::ImAnchorRectangle; -#endif - + const auto queries = Qt::ImCursorRectangle | Qt::ImFont | Qt::ImAnchorRectangle; qskUpdateInputMethod( input, queries ); } @@ -785,8 +775,6 @@ QString QskTextInput::preeditText() const return d->m_textLayout.preeditAreaText(); } -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) - bool QskTextInput::overwriteMode() const { return m_data->textInput->overwriteMode(); @@ -797,8 +785,6 @@ void QskTextInput::setOverwriteMode( bool overwrite ) m_data->textInput->setOverwriteMode( overwrite ); } -#endif - bool QskTextInput::hasAcceptableInput() const { return m_data->textInput->hasAcceptableInput(); @@ -832,9 +818,7 @@ QVariant QskTextInput::inputMethodQuery( { return locale(); } -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) case Qt::ImInputItemClipRectangle: -#endif case Qt::ImCursorRectangle: { QVariant v = m_data->textInput->inputMethodQuery( query, argument ); diff --git a/src/controls/QskTextInput.h b/src/controls/QskTextInput.h index a9493463..c4a798eb 100644 --- a/src/controls/QskTextInput.h +++ b/src/controls/QskTextInput.h @@ -137,10 +137,8 @@ class QSK_EXPORT QskTextInput : public QskControl QString displayText() const; QString preeditText() const; -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) bool overwriteMode() const; void setOverwriteMode( bool ); -#endif bool hasAcceptableInput() const; bool fixup(); @@ -170,20 +168,14 @@ class QSK_EXPORT QskTextInput : public QskControl void textChanged( const QString& ); void displayTextChanged( const QString& ); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) void textEdited( const QString& ); -#endif - void descriptionChanged( const QString& ); void textOptionsChanged(); void fontRoleChanged(); void alignmentChanged(); -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) void overwriteModeChanged( bool ); -#endif - void maximumLengthChanged( int ); void echoModeChanged( EchoMode ); diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 92b20f23..0be35d4a 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -201,37 +201,8 @@ QskWindow::QskWindow( QQuickRenderControl* renderControl, QWindow* parent ) 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 ) - -void QskWindow::setFlag(Qt::WindowType flag, bool on) -{ - if( on ) - setFlags( flags() | flag ); - else - setFlags( flags() & ~flag ); -} - -#endif - void QskWindow::setScreen( const QString& name ) { if ( !name.isEmpty() ) diff --git a/src/controls/QskWindow.h b/src/controls/QskWindow.h index de5ef4a5..8a2a158f 100644 --- a/src/controls/QskWindow.h +++ b/src/controls/QskWindow.h @@ -43,10 +43,6 @@ class QSK_EXPORT QskWindow : public QQuickWindow using Inherited::setScreen; void setScreen( const QString& ); -#if QT_VERSION < QT_VERSION_CHECK( 5, 9, 0 ) - void setFlag( Qt::WindowType, bool on = true ); -#endif - bool deleteOnClose() const; void setDeleteOnClose( bool ); diff --git a/src/dialogs/QskDialogButtonBox.cpp b/src/dialogs/QskDialogButtonBox.cpp index 440c1142..95b905bf 100644 --- a/src/dialogs/QskDialogButtonBox.cpp +++ b/src/dialogs/QskDialogButtonBox.cpp @@ -131,7 +131,7 @@ QskDialogButtonBox::~QskDialogButtonBox() { 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 @@ -595,14 +595,9 @@ QString QskDialogButtonBox::buttonText( QskDialog::Action action ) { // should be redirected through the skin ! - const QPlatformTheme* theme = QGuiApplicationPrivate::platformTheme(); + const auto 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; } diff --git a/src/graphic/QskGraphic.cpp b/src/graphic/QskGraphic.cpp index 2705baf7..ab6e6b30 100644 --- a/src/graphic/QskGraphic.cpp +++ b/src/graphic/QskGraphic.cpp @@ -565,7 +565,7 @@ QRectF QskGraphic::scaledBoundingRect( qreal sx, qreal sy ) const QRectF rect = transform.mapRect( m_data->pointRect ); - for ( const auto& info : qskAsConst( m_data->pathInfos ) ) + for ( const auto& info : qAsConst( m_data->pathInfos ) ) rect |= info.scaledBoundingRect( sx, sy, scalePens ); return rect; @@ -678,7 +678,7 @@ void QskGraphic::render( QPainter* painter, const QRectF& rect, const bool scalePens = !( m_data->renderHints & RenderPensUnscaled ); - for ( const auto& info : qskAsConst( m_data->pathInfos ) ) + for ( const auto& info : qAsConst( m_data->pathInfos ) ) { const qreal ssx = info.scaleFactorX( m_data->pointRect, rect, scalePens ); diff --git a/src/layouts/QskStackBox.cpp b/src/layouts/QskStackBox.cpp index e2054d1e..7d6a03fc 100644 --- a/src/layouts/QskStackBox.cpp +++ b/src/layouts/QskStackBox.cpp @@ -316,7 +316,7 @@ void QskStackBox::autoRemoveItem( QQuickItem* item ) void QskStackBox::clear( bool autoDelete ) { - for ( const auto item : qskAsConst( m_data->items ) ) + for ( const auto item : qAsConst( m_data->items ) ) { if( autoDelete && ( item->parent() == this ) ) delete item; diff --git a/src/nodes/QskTickmarksNode.cpp b/src/nodes/QskTickmarksNode.cpp index ab1d3f59..bf06f862 100644 --- a/src/nodes/QskTickmarksNode.cpp +++ b/src/nodes/QskTickmarksNode.cpp @@ -21,11 +21,7 @@ class QskTickmarksNodePrivate final : public QSGGeometryNodePrivate QskTickmarksNodePrivate() : 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 ); } From 7f63392eed99143b37a8996eaacacd145d8e9771 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 8 Mar 2022 12:08:15 +0100 Subject: [PATCH 002/107] TODO note added --- src/controls/QskQuickItem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/controls/QskQuickItem.cpp b/src/controls/QskQuickItem.cpp index 8bb22370..85949787 100644 --- a/src/controls/QskQuickItem.cpp +++ b/src/controls/QskQuickItem.cpp @@ -65,6 +65,10 @@ namespace QObject::connect( qskSetup, &QskSetup::itemUpdateFlagsChanged, qskSetup, [ this ] { updateControlFlags(); } ); + /* + We would also need to send QEvent::StyleChange, when + a window has a new skin. TODO ... + */ QObject::connect( qskSetup, &QskSetup::skinChanged, qskSetup, [ this ] { updateSkin(); } ); } From cdb17476b5517a4a998f8e4b3fd0d9b7c1a4d9b2 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 8 Mar 2022 15:59:35 +0100 Subject: [PATCH 003/107] platform depending code moved to QskSkin --- src/controls/QskSkin.cpp | 10 ++++++++++ src/controls/QskSkin.h | 1 + src/dialogs/QskDialog.cpp | 10 ++++++++++ src/dialogs/QskDialog.h | 2 ++ src/dialogs/QskDialogButton.cpp | 22 ++++++++++++++++++---- src/dialogs/QskDialogButtonBox.cpp | 29 ++--------------------------- src/dialogs/QskDialogButtonBox.h | 1 - 7 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 429ac4cf..f99dc41a 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -321,6 +321,16 @@ bool QskSkin::hasGraphicProvider() const return m_data->graphicProviders.size() > 0; } +QString QskSkin::dialogButtonText( int action ) const +{ + const auto theme = QGuiApplicationPrivate::platformTheme(); + + auto text = theme->standardButtonText( action ); + text = QPlatformTheme::removeMnemonics( text ); + + return text; +} + const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const { // auto policy = QPlatformDialogHelper::UnknownLayout; diff --git a/src/controls/QskSkin.h b/src/controls/QskSkin.h index a86dcd0d..adeb2c54 100644 --- a/src/controls/QskSkin.h +++ b/src/controls/QskSkin.h @@ -75,6 +75,7 @@ class QSK_EXPORT QskSkin : public QObject bool hasGraphicProvider() const; virtual const int* dialogButtonLayout( Qt::Orientation ) const; + virtual QString dialogButtonText( int button ) const; void setStateMask( QskAspect::States ); QskAspect::States stateMask() const; diff --git a/src/dialogs/QskDialog.cpp b/src/dialogs/QskDialog.cpp index e73da52d..e8913895 100644 --- a/src/dialogs/QskDialog.cpp +++ b/src/dialogs/QskDialog.cpp @@ -19,6 +19,8 @@ #include #include +#include + static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox ) { // not the fastest code ever, but usually we always @@ -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" diff --git a/src/dialogs/QskDialog.h b/src/dialogs/QskDialog.h index 8203ed82..980cd44b 100644 --- a/src/dialogs/QskDialog.h +++ b/src/dialogs/QskDialog.h @@ -139,6 +139,8 @@ class QSK_EXPORT QskDialog : public QObject const QString& title, const QString& text, const QStringList& entries, int selectedRow = 0 ) const; + static ActionRole actionRole( Action action ); + Q_SIGNALS: void transientParentChanged(); void policyChanged(); diff --git a/src/dialogs/QskDialogButton.cpp b/src/dialogs/QskDialogButton.cpp index 4c40e4d1..b1db39f8 100644 --- a/src/dialogs/QskDialogButton.cpp +++ b/src/dialogs/QskDialogButton.cpp @@ -5,17 +5,27 @@ #include "QskDialogButton.h" #include "QskDialogButtonBox.h" +#include "QskSkin.h" QSK_SUBCONTROL( QskDialogButton, Panel ) QSK_SUBCONTROL( QskDialogButton, Text ) QSK_SUBCONTROL( QskDialogButton, Graphic ) +static QString qskButtonText( + const QskDialogButton* button, QskDialog::Action action ) +{ + if ( const auto skin = button->effectiveSkin() ) + return skin->dialogButtonText( action ); + + return QString(); +} + QskDialogButton::QskDialogButton( QskDialog::Action action, QQuickItem* parent ) : QskPushButton( parent ) , m_action( action ) { - setText( QskDialogButtonBox::buttonText( m_action ) ); + setText( qskButtonText( this, m_action ) ); } QskDialogButton::QskDialogButton( QQuickItem* parent ) @@ -47,7 +57,7 @@ void QskDialogButton::setAction( QskDialog::Action action ) if ( action != m_action ) { m_action = action; - setText( QskDialogButtonBox::buttonText( m_action ) ); + setText( qskButtonText( this, action ) ); Q_EMIT actionChanged(); } @@ -60,8 +70,12 @@ QskDialog::Action QskDialogButton::action() const void QskDialogButton::changeEvent( QEvent* event ) { - if ( event->type() == QEvent::LocaleChange ) - setText( QskDialogButtonBox::buttonText( m_action ) ); + switch( static_cast< int >( event->type() ) ) + { + case QEvent::LocaleChange: + case QEvent::StyleChange: + setText( qskButtonText( this, m_action ) ); + } Inherited::changeEvent( event ); } diff --git a/src/dialogs/QskDialogButtonBox.cpp b/src/dialogs/QskDialogButtonBox.cpp index 95b905bf..f15bcc6f 100644 --- a/src/dialogs/QskDialogButtonBox.cpp +++ b/src/dialogs/QskDialogButtonBox.cpp @@ -15,11 +15,6 @@ #include #include -#include - -QSK_QT_PRIVATE_BEGIN -#include -QSK_QT_PRIVATE_END #include @@ -31,14 +26,6 @@ static void qskSendEventTo( QObject* object, QEvent::Type type ) 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 { class LayoutEngine : public QskLinearLayoutEngine @@ -346,9 +333,8 @@ void QskDialogButtonBox::addButton( void QskDialogButtonBox::addAction( QskDialog::Action action ) { - QskPushButton* button = createButton( action ); - if ( button ) - addButton( button, qskActionRole( action ) ); + if ( auto button = createButton( action ) ) + addButton( button, QskDialog::actionRole( action ) ); } void QskDialogButtonBox::removeButton( QskPushButton* button ) @@ -591,15 +577,4 @@ bool QskDialogButtonBox::isDefaultButtonKeyEvent( const QKeyEvent* event ) } } -QString QskDialogButtonBox::buttonText( QskDialog::Action action ) -{ - // should be redirected through the skin ! - - const auto theme = QGuiApplicationPrivate::platformTheme(); - QString text = theme->standardButtonText( action ); - text = QPlatformTheme::removeMnemonics( text ); - - return text; -} - #include "moc_QskDialogButtonBox.cpp" diff --git a/src/dialogs/QskDialogButtonBox.h b/src/dialogs/QskDialogButtonBox.h index bf872d23..3523bfef 100644 --- a/src/dialogs/QskDialogButtonBox.h +++ b/src/dialogs/QskDialogButtonBox.h @@ -61,7 +61,6 @@ class QSK_EXPORT QskDialogButtonBox : public QskBox QskPushButton* defaultButton() const; static bool isDefaultButtonKeyEvent( const QKeyEvent* ); - static QString buttonText( QskDialog::Action ); Q_SIGNALS: void clicked( QskPushButton* button ); From ff3c3321da7e7cc94eea7a7fa1a5524448c9064c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 8 Mar 2022 16:15:37 +0100 Subject: [PATCH 004/107] QskDialogButton::resetButton --- src/dialogs/QskDialogButton.cpp | 22 ++++++++++------------ src/dialogs/QskDialogButton.h | 2 ++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/dialogs/QskDialogButton.cpp b/src/dialogs/QskDialogButton.cpp index b1db39f8..c0294aae 100644 --- a/src/dialogs/QskDialogButton.cpp +++ b/src/dialogs/QskDialogButton.cpp @@ -11,21 +11,12 @@ QSK_SUBCONTROL( QskDialogButton, Panel ) QSK_SUBCONTROL( QskDialogButton, Text ) QSK_SUBCONTROL( QskDialogButton, Graphic ) -static QString qskButtonText( - const QskDialogButton* button, QskDialog::Action action ) -{ - if ( const auto skin = button->effectiveSkin() ) - return skin->dialogButtonText( action ); - - return QString(); -} - QskDialogButton::QskDialogButton( QskDialog::Action action, QQuickItem* parent ) : QskPushButton( parent ) , m_action( action ) { - setText( qskButtonText( this, m_action ) ); + resetButton(); } QskDialogButton::QskDialogButton( QQuickItem* parent ) @@ -57,7 +48,7 @@ void QskDialogButton::setAction( QskDialog::Action action ) if ( action != m_action ) { m_action = action; - setText( qskButtonText( this, action ) ); + resetButton(); Q_EMIT actionChanged(); } @@ -74,10 +65,17 @@ void QskDialogButton::changeEvent( QEvent* event ) { case QEvent::LocaleChange: case QEvent::StyleChange: - setText( qskButtonText( this, m_action ) ); + resetButton(); + break; } Inherited::changeEvent( event ); } +void QskDialogButton::resetButton() +{ + if ( const auto skin = effectiveSkin() ) + setText( skin->dialogButtonText( m_action ) ); +} + #include "moc_QskDialogButton.cpp" diff --git a/src/dialogs/QskDialogButton.h b/src/dialogs/QskDialogButton.h index a093a481..afb9e875 100644 --- a/src/dialogs/QskDialogButton.h +++ b/src/dialogs/QskDialogButton.h @@ -39,6 +39,8 @@ class QSK_EXPORT QskDialogButton : public QskPushButton QskAspect::Subcontrol ) const override; private: + void resetButton(); + QskDialog::Action m_action; }; From 820bb9cdc2a2b5a732e05fe3ee3f2e975c9b1370 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 9 Mar 2022 07:25:18 +0100 Subject: [PATCH 005/107] obsolete version check removed --- src/controls/QskQuickItem.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/controls/QskQuickItem.cpp b/src/controls/QskQuickItem.cpp index 85949787..bcd95a1e 100644 --- a/src/controls/QskQuickItem.cpp +++ b/src/controls/QskQuickItem.cpp @@ -781,13 +781,11 @@ void QskQuickItem::itemChange( QQuickItem::ItemChange change, break; } -#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 ) case QQuickItem::ItemEnabledHasChanged: { qskSendEventTo( this, QEvent::EnabledChange ); break; } -#endif case QQuickItem::ItemVisibleHasChanged: { Q_D( QskQuickItem ); From d7d5c8cff32fcc1c8efd59fb3f82a7095cad38ee Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 11 Mar 2022 14:16:41 +0100 Subject: [PATCH 006/107] Squashed commit of the following: commit 02f95db2e5a105cad4ac0bc07f5dcfc655546f9d Author: Uwe Rathmann Date: Fri Mar 11 14:14:35 2022 +0100 wip --- src/controls/QskBoundedInput.cpp | 6 ++++-- src/controls/QskEvent.cpp | 15 +++++++++++++++ src/controls/QskEvent.h | 4 ++++ src/controls/QskPageIndicator.cpp | 4 ++-- src/dialogs/QskDialogSubWindow.cpp | 3 ++- src/dialogs/QskDialogWindow.cpp | 3 ++- 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/controls/QskBoundedInput.cpp b/src/controls/QskBoundedInput.cpp index 26aac2e6..02d88313 100644 --- a/src/controls/QskBoundedInput.cpp +++ b/src/controls/QskBoundedInput.cpp @@ -181,13 +181,15 @@ void QskBoundedInput::keyPressEvent( QKeyEvent* event ) { if ( !isReadOnly() ) { - if ( event->key() == Qt::Key_Up || event->matches( QKeySequence::MoveToNextChar ) ) + if ( event->key() == Qt::Key_Up || + qskKeyMatches( event, QKeySequence::MoveToNextChar ) ) { increment( m_stepSize ); return; } - if ( event->key() == Qt::Key_Down || event->matches( QKeySequence::MoveToPreviousChar ) ) + if ( event->key() == Qt::Key_Down || + qskKeyMatches( event, QKeySequence::MoveToPreviousChar ) ) { increment( -m_stepSize ); return; diff --git a/src/controls/QskEvent.cpp b/src/controls/QskEvent.cpp index 84d16d8b..85965d70 100644 --- a/src/controls/QskEvent.cpp +++ b/src/controls/QskEvent.cpp @@ -114,6 +114,21 @@ qreal qskWheelIncrement( const QWheelEvent* event ) #endif +bool qskKeyMatches( 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 ) : QEvent( static_cast< QEvent::Type >( type ) ) { diff --git a/src/controls/QskEvent.h b/src/controls/QskEvent.h index 51efd964..d0db70a3 100644 --- a/src/controls/QskEvent.h +++ b/src/controls/QskEvent.h @@ -10,6 +10,7 @@ #include #include +#include #include class QskGesture; @@ -20,6 +21,7 @@ class QQuickItem; class QMouseEvent; class QWheelEvent; class QHoverEvent; +class QKeyEvent; class QSK_EXPORT QskEvent : public QEvent { @@ -148,4 +150,6 @@ QSK_EXPORT qreal qskWheelIncrement( const QWheelEvent* ); #endif +QSK_EXPORT bool qskKeyMatches( const QKeyEvent*, QKeySequence::StandardKey ); + #endif diff --git a/src/controls/QskPageIndicator.cpp b/src/controls/QskPageIndicator.cpp index 3b9a8071..750b5cb2 100644 --- a/src/controls/QskPageIndicator.cpp +++ b/src/controls/QskPageIndicator.cpp @@ -15,10 +15,10 @@ QSK_SYSTEM_STATE( QskPageIndicator, Selected, QskAspect::FirstSystemState << 1 ) static int qskKeyIncrement( const QskPageIndicator* indicator, const QKeyEvent* event ) { - if ( event->matches( QKeySequence::MoveToNextChar ) ) + if ( qskKeyMatches( event, QKeySequence::MoveToNextChar ) ) return 1; - if ( event->matches( QKeySequence::MoveToPreviousChar ) ) + if ( qskKeyMatches( event, QKeySequence::MoveToPreviousChar ) ) return -1; const auto key = event->key(); diff --git a/src/dialogs/QskDialogSubWindow.cpp b/src/dialogs/QskDialogSubWindow.cpp index 3113c226..23c86e00 100644 --- a/src/dialogs/QskDialogSubWindow.cpp +++ b/src/dialogs/QskDialogSubWindow.cpp @@ -7,6 +7,7 @@ #include "QskDialogButtonBox.h" #include "QskPushButton.h" #include "QskQuick.h" +#include "QskEvent.h" #include #include @@ -280,7 +281,7 @@ void QskDialogSubWindow::keyPressEvent( QKeyEvent* event ) button->click(); } - if ( event->matches( QKeySequence::Cancel ) ) + if ( qskKeyMatches( event, QKeySequence::Cancel ) ) { // using shortcuts instead ??? diff --git a/src/dialogs/QskDialogWindow.cpp b/src/dialogs/QskDialogWindow.cpp index 6eb40646..5a726192 100644 --- a/src/dialogs/QskDialogWindow.cpp +++ b/src/dialogs/QskDialogWindow.cpp @@ -8,6 +8,7 @@ #include "QskLinearBox.h" #include "QskPushButton.h" #include "QskQuick.h" +#include "QskEvent.h" #include #include @@ -248,7 +249,7 @@ void QskDialogWindow::keyPressEvent( QKeyEvent* event ) button->click(); } - if ( event->matches( QKeySequence::Cancel ) ) + if ( qskKeyMatches( event, QKeySequence::Cancel ) ) { // using shortcuts instead ??? From 36c759dc41b9a64477cba81620d8a6e487ae6090 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 11 Mar 2022 14:24:10 +0100 Subject: [PATCH 007/107] qskIsStandardKeyInput added --- src/controls/QskBoundedInput.cpp | 4 ++-- src/controls/QskEvent.cpp | 2 +- src/controls/QskEvent.h | 2 +- src/controls/QskPageIndicator.cpp | 4 ++-- src/dialogs/QskDialogSubWindow.cpp | 2 +- src/dialogs/QskDialogWindow.cpp | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/controls/QskBoundedInput.cpp b/src/controls/QskBoundedInput.cpp index 02d88313..4b6e647b 100644 --- a/src/controls/QskBoundedInput.cpp +++ b/src/controls/QskBoundedInput.cpp @@ -182,14 +182,14 @@ void QskBoundedInput::keyPressEvent( QKeyEvent* event ) if ( !isReadOnly() ) { if ( event->key() == Qt::Key_Up || - qskKeyMatches( event, QKeySequence::MoveToNextChar ) ) + qskIsStandardKeyInput( event, QKeySequence::MoveToNextChar ) ) { increment( m_stepSize ); return; } if ( event->key() == Qt::Key_Down || - qskKeyMatches( event, QKeySequence::MoveToPreviousChar ) ) + qskIsStandardKeyInput( event, QKeySequence::MoveToPreviousChar ) ) { increment( -m_stepSize ); return; diff --git a/src/controls/QskEvent.cpp b/src/controls/QskEvent.cpp index 85965d70..e349e619 100644 --- a/src/controls/QskEvent.cpp +++ b/src/controls/QskEvent.cpp @@ -114,7 +114,7 @@ qreal qskWheelIncrement( const QWheelEvent* event ) #endif -bool qskKeyMatches( const QKeyEvent* event, QKeySequence::StandardKey key ) +bool qskIsStandardKeyInput( const QKeyEvent* event, QKeySequence::StandardKey key ) { #if 1 return event->matches( key ); diff --git a/src/controls/QskEvent.h b/src/controls/QskEvent.h index d0db70a3..bd5b8e90 100644 --- a/src/controls/QskEvent.h +++ b/src/controls/QskEvent.h @@ -150,6 +150,6 @@ QSK_EXPORT qreal qskWheelIncrement( const QWheelEvent* ); #endif -QSK_EXPORT bool qskKeyMatches( const QKeyEvent*, QKeySequence::StandardKey ); +QSK_EXPORT bool qskIsStandardKeyInput( const QKeyEvent*, QKeySequence::StandardKey ); #endif diff --git a/src/controls/QskPageIndicator.cpp b/src/controls/QskPageIndicator.cpp index 750b5cb2..50ff5b82 100644 --- a/src/controls/QskPageIndicator.cpp +++ b/src/controls/QskPageIndicator.cpp @@ -15,10 +15,10 @@ QSK_SYSTEM_STATE( QskPageIndicator, Selected, QskAspect::FirstSystemState << 1 ) static int qskKeyIncrement( const QskPageIndicator* indicator, const QKeyEvent* event ) { - if ( qskKeyMatches( event, QKeySequence::MoveToNextChar ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::MoveToNextChar ) ) return 1; - if ( qskKeyMatches( event, QKeySequence::MoveToPreviousChar ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::MoveToPreviousChar ) ) return -1; const auto key = event->key(); diff --git a/src/dialogs/QskDialogSubWindow.cpp b/src/dialogs/QskDialogSubWindow.cpp index 23c86e00..20c690e5 100644 --- a/src/dialogs/QskDialogSubWindow.cpp +++ b/src/dialogs/QskDialogSubWindow.cpp @@ -281,7 +281,7 @@ void QskDialogSubWindow::keyPressEvent( QKeyEvent* event ) button->click(); } - if ( qskKeyMatches( event, QKeySequence::Cancel ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::Cancel ) ) { // using shortcuts instead ??? diff --git a/src/dialogs/QskDialogWindow.cpp b/src/dialogs/QskDialogWindow.cpp index 5a726192..29a5e714 100644 --- a/src/dialogs/QskDialogWindow.cpp +++ b/src/dialogs/QskDialogWindow.cpp @@ -249,7 +249,7 @@ void QskDialogWindow::keyPressEvent( QKeyEvent* event ) button->click(); } - if ( qskKeyMatches( event, QKeySequence::Cancel ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::Cancel ) ) { // using shortcuts instead ??? From 598224e487c2dbd4b1551d4ecbdf53bf007e475c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 18 Mar 2022 12:32:57 +0100 Subject: [PATCH 008/107] qmake setup changed --- features/qskconfig.pri | 11 +++++++++++ src/common/common.pro | 2 -- src/controls/controls.pro | 2 -- src/dialogs/dialogs.pro | 2 -- src/graphic/graphic.pro | 2 -- src/inputpanel/inputpanel.pro | 2 -- src/layouts/layouts.pro | 2 -- src/nodes/nodes.pro | 2 -- 8 files changed, 11 insertions(+), 14 deletions(-) delete mode 100644 src/common/common.pro delete mode 100644 src/controls/controls.pro delete mode 100644 src/dialogs/dialogs.pro delete mode 100644 src/graphic/graphic.pro delete mode 100644 src/inputpanel/inputpanel.pro delete mode 100644 src/layouts/layouts.pro delete mode 100644 src/nodes/nodes.pro diff --git a/features/qskconfig.pri b/features/qskconfig.pri index bb79ee5f..f25494e7 100644 --- a/features/qskconfig.pri +++ b/features/qskconfig.pri @@ -189,3 +189,14 @@ debug { ide: DEFINES += QT_IDE # DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x000000 + +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} ) +} diff --git a/src/common/common.pro b/src/common/common.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/common/common.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/controls/controls.pro b/src/controls/controls.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/controls/controls.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/dialogs/dialogs.pro b/src/dialogs/dialogs.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/dialogs/dialogs.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/graphic/graphic.pro b/src/graphic/graphic.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/graphic/graphic.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/inputpanel/inputpanel.pro b/src/inputpanel/inputpanel.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/inputpanel/inputpanel.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/layouts/layouts.pro b/src/layouts/layouts.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/layouts/layouts.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/nodes/nodes.pro b/src/nodes/nodes.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/nodes/nodes.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ From b02e6ccbc3d8eae07698e88ba05404e66ceb72d1 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 18 Mar 2022 16:08:40 +0100 Subject: [PATCH 009/107] constexpr, where possible --- src/common/QskGradientStop.h | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/common/QskGradientStop.h b/src/common/QskGradientStop.h index d3cf8931..640352e9 100644 --- a/src/common/QskGradientStop.h +++ b/src/common/QskGradientStop.h @@ -11,13 +11,6 @@ #include #include -#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 { Q_GADGET @@ -26,21 +19,22 @@ class QSK_EXPORT QskGradientStop Q_PROPERTY( QColor color READ color WRITE setColor RESET resetColor ) public: - QskGradientStop() noexcept; - QskGradientStop( qreal position, const QColor& ) noexcept; + constexpr QskGradientStop() noexcept; + constexpr QskGradientStop( qreal position, const QColor& ) noexcept; + QskGradientStop( qreal position, Qt::GlobalColor ) noexcept; QskGradientStop( qreal position, QRgb ) noexcept; - bool operator==( const QskGradientStop& ) const noexcept; - bool operator!=( const QskGradientStop& ) const noexcept; + constexpr bool operator==( const QskGradientStop& ) const noexcept; + constexpr bool operator!=( const QskGradientStop& ) const noexcept; void setStop( qreal position, const QColor& ) noexcept; - qreal position() const noexcept; + constexpr qreal position() const noexcept; void setPosition( qreal position ) noexcept; void resetPosition() noexcept; - const QColor& color() const noexcept; + constexpr const QColor& color() const noexcept; void setColor( const QColor& ) noexcept; void resetColor() noexcept; @@ -57,12 +51,12 @@ class QSK_EXPORT QskGradientStop Q_DECLARE_TYPEINFO( QskGradientStop, Q_MOVABLE_TYPE ); Q_DECLARE_METATYPE( QskGradientStop ) -inline QskGradientStop::QskGradientStop() noexcept +inline constexpr QskGradientStop::QskGradientStop() noexcept : m_position( -1.0 ) { } -inline QskGradientStop::QskGradientStop( +inline constexpr QskGradientStop::QskGradientStop( qreal position, const QColor& color ) noexcept : m_position( position ) , m_color( color ) @@ -81,22 +75,22 @@ inline QskGradientStop::QskGradientStop( { } -inline qreal QskGradientStop::position() const noexcept +inline constexpr qreal QskGradientStop::position() const noexcept { return m_position; } -inline const QColor& QskGradientStop::color() const noexcept +inline constexpr const QColor& QskGradientStop::color() const noexcept { return m_color; } -inline bool QskGradientStop::operator==( const QskGradientStop& other ) const noexcept +inline constexpr bool QskGradientStop::operator==( const QskGradientStop& other ) const noexcept { return ( m_position == other.m_position ) && ( m_color == other.m_color ); } -inline bool QskGradientStop::operator!=( const QskGradientStop& other ) const noexcept +inline constexpr bool QskGradientStop::operator!=( const QskGradientStop& other ) const noexcept { return ( !( *this == other ) ); } From 13d00d176f2d4d704fe8835eb4fe0813b38279d9 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 18 Mar 2022 16:50:34 +0100 Subject: [PATCH 010/107] support for QGradient::Preset --- src/common/QskGradient.cpp | 16 ++++++++++++++++ src/common/QskGradient.h | 9 ++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 7e1ec065..247369cb 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -179,6 +179,16 @@ static inline QskGradientStops qskExtractedStops( return extracted; } +static inline QskGradientStops qskGradientStops( const QGradientStops& qtStops ) +{ + QskGradientStops stops; + + for ( const auto& s : qtStops ) + stops += QskGradientStop( s.first, s.second ); + + return stops; +} + QskGradient::QskGradient( Orientation orientation ) : m_orientation( orientation ) , m_isDirty( false ) @@ -218,6 +228,12 @@ QskGradient::QskGradient( Orientation orientation, const QskGradientStops& stops setStops( stops ); } +QskGradient::QskGradient( Orientation orientation, QGradient::Preset preset ) + : QskGradient( orientation ) +{ + setStops( qskGradientStops( QGradient( preset ).stops() ) ); +} + QskGradient::~QskGradient() { } diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index 01b0bc4a..c0544bfd 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -9,7 +9,7 @@ #include "QskGlobal.h" #include "QskGradientStop.h" -#include +#include #include #include @@ -48,12 +48,14 @@ class QSK_EXPORT QskGradient QskGradient( Qt::GlobalColor ); QskGradient( QRgb ); QskGradient( const QColor& ); + QskGradient( QGradient::Preset ); QskGradient( Qt::Orientation, const QVector< QskGradientStop >& ); QskGradient( Qt::Orientation, const QColor&, const QColor& ); QskGradient( Orientation, const QVector< QskGradientStop >& ); QskGradient( Orientation, const QColor&, const QColor& ); + QskGradient( Orientation, QGradient::Preset ); ~QskGradient(); @@ -133,6 +135,11 @@ inline QskGradient::QskGradient( QRgb rgb ) { } +inline QskGradient::QskGradient( QGradient::Preset preset ) + : QskGradient( Vertical, preset ) +{ +} + inline QskGradient::Orientation QskGradient::orientation() const { return static_cast< Orientation >( m_orientation ); From bc3ef26584f2bd3c1bbab7031a589cce5bccbe71 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 20 Mar 2022 13:11:34 +0100 Subject: [PATCH 011/107] include guards formalized --- src/controls/QskFlickAnimator.h | 2 +- src/controls/QskInputGrabber.h | 2 +- src/controls/QskObjectTree.h | 2 +- src/controls/QskQuick.h | 2 +- src/controls/QskSubWindow.h | 2 +- src/controls/QskSubWindowArea.h | 2 +- src/controls/QskWindow.h | 2 +- src/dialogs/QskDialog.h | 2 +- src/dialogs/QskDialogSubWindow.h | 2 +- src/dialogs/QskDialogWindow.h | 2 +- src/dialogs/QskMessageSubWindow.h | 2 +- src/dialogs/QskMessageWindow.h | 2 +- src/dialogs/QskSelectionSubWindow.h | 2 +- src/dialogs/QskSelectionWindow.h | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/controls/QskFlickAnimator.h b/src/controls/QskFlickAnimator.h index 92dce7d3..e9168383 100644 --- a/src/controls/QskFlickAnimator.h +++ b/src/controls/QskFlickAnimator.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_FLICK_ANIMATOR_H -#define QSK_FLICK_ANIMATOR_H 1 +#define QSK_FLICK_ANIMATOR_H #include "QskAnimator.h" diff --git a/src/controls/QskInputGrabber.h b/src/controls/QskInputGrabber.h index 6e1a77b7..b13bc5ec 100644 --- a/src/controls/QskInputGrabber.h +++ b/src/controls/QskInputGrabber.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_INPUT_GRABBER_H -#define QSK_INPUT_GRABBER_H 1 +#define QSK_INPUT_GRABBER_H #include "QskControl.h" diff --git a/src/controls/QskObjectTree.h b/src/controls/QskObjectTree.h index f8c3e757..c805e5b8 100644 --- a/src/controls/QskObjectTree.h +++ b/src/controls/QskObjectTree.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_OBJECT_TREE_H -#define QSK_OBJECT_TREE_H 1 +#define QSK_OBJECT_TREE_H #include "QskControl.h" #include "QskWindow.h" diff --git a/src/controls/QskQuick.h b/src/controls/QskQuick.h index 1fa917e5..74d29b6b 100644 --- a/src/controls/QskQuick.h +++ b/src/controls/QskQuick.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_QUICK_H -#define QSK_QUICK_H 1 +#define QSK_QUICK_H #include "QskGlobal.h" #include diff --git a/src/controls/QskSubWindow.h b/src/controls/QskSubWindow.h index aa8d5243..d13d5765 100644 --- a/src/controls/QskSubWindow.h +++ b/src/controls/QskSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SUB_WINDOW_H -#define QSK_SUB_WINDOW_H 1 +#define QSK_SUB_WINDOW_H #include "QskPopup.h" diff --git a/src/controls/QskSubWindowArea.h b/src/controls/QskSubWindowArea.h index e381c501..3cbc30d3 100644 --- a/src/controls/QskSubWindowArea.h +++ b/src/controls/QskSubWindowArea.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SUB_WINDOW_AREA_H -#define QSK_SUB_WINDOW_AREA_H 1 +#define QSK_SUB_WINDOW_AREA_H #include "QskControl.h" diff --git a/src/controls/QskWindow.h b/src/controls/QskWindow.h index 8a2a158f..da425752 100644 --- a/src/controls/QskWindow.h +++ b/src/controls/QskWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_WINDOW_H -#define QSK_WINDOW_H 1 +#define QSK_WINDOW_H #include "QskGlobal.h" #include diff --git a/src/dialogs/QskDialog.h b/src/dialogs/QskDialog.h index 980cd44b..25e13c6f 100644 --- a/src/dialogs/QskDialog.h +++ b/src/dialogs/QskDialog.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_DIALOG_H -#define QSK_DIALOG_H 1 +#define QSK_DIALOG_H #include "QskGlobal.h" diff --git a/src/dialogs/QskDialogSubWindow.h b/src/dialogs/QskDialogSubWindow.h index 8d66471d..278ca5d7 100644 --- a/src/dialogs/QskDialogSubWindow.h +++ b/src/dialogs/QskDialogSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_DIALOG_SUB_WINDOW_H -#define QSK_DIALOG_SUB_WINDOW_H 1 +#define QSK_DIALOG_SUB_WINDOW_H #include "QskDialog.h" #include "QskSubWindow.h" diff --git a/src/dialogs/QskDialogWindow.h b/src/dialogs/QskDialogWindow.h index ad9d15ae..3131be5b 100644 --- a/src/dialogs/QskDialogWindow.h +++ b/src/dialogs/QskDialogWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_DIALOG_WINDOW_H -#define QSK_DIALOG_WINDOW_H 1 +#define QSK_DIALOG_WINDOW_H #include "QskDialog.h" #include "QskWindow.h" diff --git a/src/dialogs/QskMessageSubWindow.h b/src/dialogs/QskMessageSubWindow.h index 1d98232d..7a34cb18 100644 --- a/src/dialogs/QskMessageSubWindow.h +++ b/src/dialogs/QskMessageSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_MESSAGE_SUB_WINDOW_H -#define QSK_MESSAGE_SUB_WINDOW_H 1 +#define QSK_MESSAGE_SUB_WINDOW_H #include "QskDialogSubWindow.h" diff --git a/src/dialogs/QskMessageWindow.h b/src/dialogs/QskMessageWindow.h index 7fb40058..6fa68b1c 100644 --- a/src/dialogs/QskMessageWindow.h +++ b/src/dialogs/QskMessageWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_MESSAGE_WINDOW_H -#define QSK_MESSAGE_WINDOW_H 1 +#define QSK_MESSAGE_WINDOW_H #include "QskDialogWindow.h" diff --git a/src/dialogs/QskSelectionSubWindow.h b/src/dialogs/QskSelectionSubWindow.h index 5259c7df..7ab602de 100644 --- a/src/dialogs/QskSelectionSubWindow.h +++ b/src/dialogs/QskSelectionSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SELECTION_SUB_WINDOW_H -#define QSK_SELECTION_SUB_WINDOW_H 1 +#define QSK_SELECTION_SUB_WINDOW_H #include "QskDialogSubWindow.h" diff --git a/src/dialogs/QskSelectionWindow.h b/src/dialogs/QskSelectionWindow.h index dc13a322..0b279e87 100644 --- a/src/dialogs/QskSelectionWindow.h +++ b/src/dialogs/QskSelectionWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SELECTION_WINDOW_H -#define QSK_SELECTION_WINDOW_H 1 +#define QSK_SELECTION_WINDOW_H #include "QskDialogWindow.h" From 25e40103d390f63769d8079f93e258469b243df1 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 20 Mar 2022 13:12:30 +0100 Subject: [PATCH 012/107] outdated comment fixed --- src/layouts/QskLayoutChain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/QskLayoutChain.cpp b/src/layouts/QskLayoutChain.cpp index 48ceb4a5..43a2f514 100644 --- a/src/layouts/QskLayoutChain.cpp +++ b/src/layouts/QskLayoutChain.cpp @@ -341,7 +341,7 @@ QskLayoutChain::Segments QskLayoutChain::minimumExpanded( qreal size ) const - according to the preferred sizes - items with a larger preferred size are stretchier: this is - what QSK_LAYOUT_COMPAT does ( compatible with QGridLayoutEngine ) + what QGridLayoutEngine does - somehow using the stretch factors */ From 3bfdd9ed93259f2186f626b4559352477c8935d0 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 20 Mar 2022 13:14:06 +0100 Subject: [PATCH 013/107] workaround for emit usages in qt headers --- src/controls/QskGestureRecognizer.cpp | 4 +++- src/controls/QskQuickItem.cpp | 11 ++++++++--- src/controls/QskVariantAnimator.cpp | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/controls/QskGestureRecognizer.cpp b/src/controls/QskGestureRecognizer.cpp index dc75d3c8..a5c376b2 100644 --- a/src/controls/QskGestureRecognizer.cpp +++ b/src/controls/QskGestureRecognizer.cpp @@ -11,13 +11,15 @@ #include QSK_QT_PRIVATE_BEGIN + #include -QSK_QT_PRIVATE_END #if QT_VERSION >= QT_VERSION_CHECK( 6, 3, 0 ) #include #endif +QSK_QT_PRIVATE_END + static QMouseEvent* qskClonedMouseEventAt( const QMouseEvent* event, QPointF* localPos ) { diff --git a/src/controls/QskQuickItem.cpp b/src/controls/QskQuickItem.cpp index bcd95a1e..b60016eb 100644 --- a/src/controls/QskQuickItem.cpp +++ b/src/controls/QskQuickItem.cpp @@ -15,16 +15,21 @@ #include #if defined( QT_DEBUG ) + QSK_QT_PRIVATE_BEGIN + #if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) #ifndef emit - // qvariantanimation_p.h needs it #define emit + #include + #undef emit #endif #endif #include + QSK_QT_PRIVATE_END + #endif #include @@ -193,9 +198,9 @@ void QskQuickItem::classBegin() void QskQuickItem::componentComplete() { #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" ); } diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index 9492106d..6372fbf0 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -21,14 +21,17 @@ #include QSK_QT_PRIVATE_BEGIN + #if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) #ifndef emit - // qvariantanimation_p.h needs it #define emit + #include + #undef emit #endif #endif #include + QSK_QT_PRIVATE_END #if 1 From 7f5d289808b9b937fd9eadb64acfd7bd8a0e2a28 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 20 Mar 2022 14:22:11 +0100 Subject: [PATCH 014/107] obsolete code for earlier versions removed --- .../gallery/slider/CustomSliderSkinlet.cpp | 4 --- examples/iotdashboard/iotdashboard.pro | 1 + .../iotdashboard/nodes/DiagramDataNode.cpp | 4 --- .../nodes/DiagramSegmentsNode.cpp | 4 --- .../nodes/RadialTickmarksNode.cpp | 4 --- features/qskconfig.pri | 32 ++++--------------- playground/images/Image.h | 15 +++++---- playground/shadows/BoxShadowNode.cpp | 2 -- src/common/QskFunctions.cpp | 4 --- src/common/QskGlobal.h | 12 ++----- src/controls/QskListView.cpp | 2 -- src/inputpanel/QskInputPanel.cpp | 2 -- src/src.pro | 2 -- 13 files changed, 19 insertions(+), 69 deletions(-) diff --git a/examples/gallery/slider/CustomSliderSkinlet.cpp b/examples/gallery/slider/CustomSliderSkinlet.cpp index 54dd1cea..75a7f990 100644 --- a/examples/gallery/slider/CustomSliderSkinlet.cpp +++ b/examples/gallery/slider/CustomSliderSkinlet.cpp @@ -37,11 +37,7 @@ namespace TicksNode( const QColor& color ) : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) { -#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 ); m_material.setColor( color ); diff --git a/examples/iotdashboard/iotdashboard.pro b/examples/iotdashboard/iotdashboard.pro index 1b6a87b7..1669d26d 100644 --- a/examples/iotdashboard/iotdashboard.pro +++ b/examples/iotdashboard/iotdashboard.pro @@ -1,6 +1,7 @@ CONFIG += qskexample QT += svg +QT += quick_private # TODO: examples should not use private headers SOURCES += \ Box.cpp \ diff --git a/examples/iotdashboard/nodes/DiagramDataNode.cpp b/examples/iotdashboard/nodes/DiagramDataNode.cpp index cd155df3..a5fa2006 100644 --- a/examples/iotdashboard/nodes/DiagramDataNode.cpp +++ b/examples/iotdashboard/nodes/DiagramDataNode.cpp @@ -48,11 +48,7 @@ void DiagramDataNode::update( const QRectF& rect, Type type, m_type = type; const auto drawingMode = -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) ( m_type == Line ) ? QSGGeometry::DrawLines : QSGGeometry::DrawTriangleStrip; -#else - ( m_type == Line ) ? GL_LINES : GL_TRIANGLE_STRIP; -#endif m_geometry.setDrawingMode( drawingMode ); diff --git a/examples/iotdashboard/nodes/DiagramSegmentsNode.cpp b/examples/iotdashboard/nodes/DiagramSegmentsNode.cpp index 9ec72f56..976abae7 100644 --- a/examples/iotdashboard/nodes/DiagramSegmentsNode.cpp +++ b/examples/iotdashboard/nodes/DiagramSegmentsNode.cpp @@ -10,11 +10,7 @@ DiagramSegmentsNode::DiagramSegmentsNode() : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) { -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) m_geometry.setDrawingMode( QSGGeometry::DrawLines ); -#else - m_geometry.setDrawingMode( GL_LINES ); -#endif setGeometry( &m_geometry ); setMaterial( &m_material ); diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp index 13a86dbc..cb5d7449 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp @@ -24,11 +24,7 @@ class RadialTickmarksNodePrivate final : public QSGGeometryNodePrivate 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 ); } diff --git a/features/qskconfig.pri b/features/qskconfig.pri index f25494e7..136c76b8 100644 --- a/features/qskconfig.pri +++ b/features/qskconfig.pri @@ -37,7 +37,7 @@ CONFIG += no_private_qt_headers_warning CONFIG += warn_on CONFIG += no_keywords CONFIG += silent -CONFIG -= depend_includepath +#CONFIG -= depend_includepath CONFIG += strict_c++ CONFIG += c++11 @@ -64,16 +64,6 @@ RCC_DIR = rcc 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 { pedantic { @@ -83,14 +73,17 @@ linux { # Qt headers do not stand pedantic checks, so it's better # to exclude them by declaring them as system includes + #CONFIG += qtassysteminclude + } + + qtassysteminclude { + # As most distros set QT_INSTALL_HEADERS to /usr/include we # would run into gcc compiler errors and better drop it # from the list below. Should be no problem as we don't # add the Qt module to our includes and therefore don't # need this path. - # QMAKE_CXXFLAGS += -isystem $$[QT_INSTALL_HEADERS] - QMAKE_CXXFLAGS += \ -isystem $$[QT_INSTALL_HEADERS]/QtCore \ -isystem $$[QT_INSTALL_HEADERS]/QtGui \ @@ -114,13 +107,6 @@ linux-g++ | linux-g++-64 { # QMAKE_CXXFLAGS_RELEASE *= -Ofast # 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 { @@ -172,8 +158,7 @@ sanitize { CONFIG += sanitizer CONFIG += sanitize_address - #CONFIG *= sanitize_memory - CONFIG *= sanitize_undefined + # CONFIG *= sanitize_undefined linux-g++ | linux-g++-64 { #QMAKE_CXXFLAGS *= -fsanitize-address-use-after-scope @@ -185,9 +170,6 @@ debug { DEFINES += ITEM_STATISTICS=1 } -# Help out Qt Creator -ide: DEFINES += QT_IDE - # DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x000000 LOCAL_PRI=$$(QSK_LOCAL_PRI) diff --git a/playground/images/Image.h b/playground/images/Image.h index b3c9df96..3eaabe49 100644 --- a/playground/images/Image.h +++ b/playground/images/Image.h @@ -7,17 +7,18 @@ #include "QskGlobal.h" -#ifdef QT_NO_KEYWORDS - -// qquickimage_p.h uses emit -#define emit Q_EMIT -#include -#undef emit +QSK_QT_PRIVATE_BEGIN +#ifndef emit + #define emit + #include + #undef emit #else -#include + #include #endif +QSK_QT_PRIVATE_END + #include class Image : public QQuickImage diff --git a/playground/shadows/BoxShadowNode.cpp b/playground/shadows/BoxShadowNode.cpp index 0087fa58..f1a5ef1a 100644 --- a/playground/shadows/BoxShadowNode.cpp +++ b/playground/shadows/BoxShadowNode.cpp @@ -94,9 +94,7 @@ namespace bool updateMaterial = ( oldMaterial == nullptr ) || newMaterial->compare( oldMaterial ) != 0; -#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 ) updateMaterial |= state.isCachedMaterialDataDirty(); -#endif if ( updateMaterial ) { diff --git a/src/common/QskFunctions.cpp b/src/common/QskFunctions.cpp index aa5870bc..ded47fa5 100644 --- a/src/common/QskFunctions.cpp +++ b/src/common/QskFunctions.cpp @@ -159,11 +159,7 @@ qreal qskHorizontalAdvance( const QFont& font, const QString& text ) qreal qskHorizontalAdvance( const QFontMetricsF& fontMetrics, const QString& text ) { -#if QT_VERSION >= QT_VERSION_CHECK( 5, 11, 0 ) return fontMetrics.horizontalAdvance( text ); -#else - return fontMetrics.width( text ); -#endif } qreal qskFuzzyFloor( qreal value, qreal stepSize ) diff --git a/src/common/QskGlobal.h b/src/common/QskGlobal.h index 56361c17..9bb265fe 100644 --- a/src/common/QskGlobal.h +++ b/src/common/QskGlobal.h @@ -17,15 +17,15 @@ #ifdef QSK_DLL #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 -#define QSK_EXPORT Q_DECL_IMPORT + #define QSK_EXPORT Q_DECL_IMPORT #endif #endif // QSK_DLL #ifndef QSK_EXPORT -#define QSK_EXPORT + #define QSK_EXPORT #endif #define QSK_QT_PRIVATE_BEGIN \ @@ -39,10 +39,4 @@ #define QSK_QT_PRIVATE_END \ QT_WARNING_POP -#ifdef Q_FALLTHROUGH -#define QSK_FALLTHROUGH Q_FALLTHROUGH -#else -#define QSK_FALLTHROUGH -#endif - #endif diff --git a/src/controls/QskListView.cpp b/src/controls/QskListView.cpp index f0a30301..331f8f8b 100644 --- a/src/controls/QskListView.cpp +++ b/src/controls/QskListView.cpp @@ -8,10 +8,8 @@ #include "QskColorFilter.h" #include "QskEvent.h" -#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) #include #include -#endif #include diff --git a/src/inputpanel/QskInputPanel.cpp b/src/inputpanel/QskInputPanel.cpp index c2eb0974..bcad0e63 100644 --- a/src/inputpanel/QskInputPanel.cpp +++ b/src/inputpanel/QskInputPanel.cpp @@ -455,7 +455,6 @@ void QskInputPanel::updateInputPanel( Qt::InputMethodQueries queries ) setLocale( event.value( Qt::ImPreferredLanguage ).toLocale() ); } -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) if ( queries & Qt::ImInputItemClipRectangle ) { /* @@ -463,7 +462,6 @@ void QskInputPanel::updateInputPanel( Qt::InputMethodQueries queries ) so that it does not hide the item. */ } -#endif } void QskInputPanel::updateLocale( const QLocale& locale ) diff --git a/src/src.pro b/src/src.pro index 9358bdf2..a25be7da 100644 --- a/src/src.pro +++ b/src/src.pro @@ -12,8 +12,6 @@ DEPENDPATH *= $${QSK_SUBDIRS} # CONFIG += pinyin # CONFIG += hunspell -# DEFINES += QSK_LAYOUT_COMPAT - HEADERS += \ common/QskArcMetrics.h \ common/QskAspect.h \ From 1cc0dff8d564be8b7fdeccb7949688ee98a9fc6a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 23 Mar 2022 11:54:34 +0100 Subject: [PATCH 015/107] uncrustified --- .uncrustify | 1851 ++++++++++++----- examples/gallery/main.cpp | 4 +- examples/iotdashboard/LightDisplay.cpp | 11 +- examples/iotdashboard/LightDisplaySkinlet.cpp | 24 +- examples/iotdashboard/ShadowedBox.cpp | 2 +- examples/iotdashboard/nodes/BoxShadowNode.cpp | 4 +- playground/grids/main.cpp | 2 +- playground/shadows/BoxShadowNode.cpp | 4 +- src/common/QskArcMetrics.h | 2 +- src/common/QskBoxHints.cpp | 6 +- src/common/QskFunctions.cpp | 4 +- src/common/QskGradient.cpp | 4 +- src/controls/QskEvent.cpp | 6 +- src/controls/QskMenu.cpp | 4 +- src/controls/QskMenuSkinlet.cpp | 3 +- src/controls/QskPageIndicator.cpp | 16 +- src/controls/QskPageIndicatorSkinlet.cpp | 4 +- src/controls/QskPopup.cpp | 8 +- src/controls/QskSkinnable.cpp | 3 +- src/dialogs/QskDialogButtonBox.cpp | 4 +- src/inputpanel/QskHunspellTextPredictor.cpp | 10 +- src/inputpanel/QskInputContext.cpp | 6 +- src/inputpanel/QskInputPanel.cpp | 9 +- src/inputpanel/QskInputPanel.h | 2 +- src/nodes/QskBoxNode.cpp | 2 +- src/nodes/QskBoxRendererEllipse.cpp | 119 +- src/nodes/QskBoxRendererRect.cpp | 7 +- 27 files changed, 1514 insertions(+), 607 deletions(-) diff --git a/.uncrustify b/.uncrustify index 43ae453c..c20650e8 100644 --- a/.uncrustify +++ b/.uncrustify @@ -26,30 +26,40 @@ string_escape_char = 92 # unsigned number # Only works right before the quote char. string_escape_char2 = 0 # unsigned number -# Replace tab characters found in string literals with the escape sequence \t instead. -string_replace_tab_chars = true # false/true +# Replace tab characters found in string literals with the escape sequence \t +# instead. +string_replace_tab_chars = true # true/false # Allow interpreting '>=' and '>>=' as part of a template in code like # 'void f(list>=val);'. If true, 'assert(x<0 && y>=3)' will be broken. # Improvements to template detection may make this option obsolete. tok_split_gte = false # true/false +# Disable formatting of NL_CONT ('\\n') ended lines (e.g. multi-line macros). +disable_processing_nl_cont = false # true/false + # Specify the marker used in comments to disable processing of part of the # file. # # Default: *INDENT-OFF* -disable_processing_cmt = "" # string +disable_processing_cmt = " *INDENT-OFF*" # string # Specify the marker used in comments to (re)enable processing in a file. # # Default: *INDENT-ON* -enable_processing_cmt = "" # string +enable_processing_cmt = " *INDENT-ON*" # string # Enable parsing of digraphs. enable_digraphs = false # true/false +# Option to allow both disable_processing_cmt and enable_processing_cmt +# strings, if specified, to be interpreted as ECMAScript regular expressions. +# If true, a regex search will be performed within comments according to the +# specified patterns in order to disable/enable processing. +processing_cmt_as_regex = false # true/false + # Add or remove the UTF-8 BOM (recommend 'remove'). -utf8_bom = ignore # ignore/add/remove/force +utf8_bom = ignore # ignore/add/remove/force/not_defined # If the file contains bytes with values between 128 and 255, but is not # UTF-8, then output as UTF-8. @@ -64,184 +74,236 @@ utf8_force = false # true/false # Add or remove space around non-assignment symbolic operators ('+', '/', '%', # '<<', and so forth). -sp_arith = force # ignore/add/remove/force +sp_arith = force # ignore/add/remove/force/not_defined # Add or remove space around arithmetic operators '+' and '-'. # # Overrides sp_arith. -sp_arith_additive = force # ignore/add/remove/force +sp_arith_additive = force # ignore/add/remove/force/not_defined # Add or remove space around assignment operator '=', '+=', etc. -sp_assign = force # ignore/add/remove/force +sp_assign = force # ignore/add/remove/force/not_defined # Add or remove space around '=' in C++11 lambda capture specifications. # # Overrides sp_assign. -sp_cpp_lambda_assign = force # ignore/add/remove/force +sp_cpp_lambda_assign = force # ignore/add/remove/force/not_defined -# Add or remove space after the capture specification in C++11 lambda. -sp_cpp_lambda_paren = ignore # ignore/add/remove/force +# Add or remove space after the capture specification of a C++11 lambda when +# an argument list is present, as in '[] (int x){ ... }'. +sp_cpp_lambda_square_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the capture specification of a C++11 lambda with +# no argument list is present, as in '[] { ... }'. +sp_cpp_lambda_square_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space after the opening parenthesis and before the closing +# parenthesis of a argument list of a C++11 lambda, as in +# '[]( int x ){ ... }'. +sp_cpp_lambda_argument_list = force # ignore/add/remove/force/not_defined + +# Add or remove space after the argument list of a C++11 lambda, as in +# '[](int x) { ... }'. +sp_cpp_lambda_paren_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space between a lambda body and its call operator of an +# immediately invoked lambda, as in '[]( ... ){ ... } ( ... )'. +sp_cpp_lambda_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space around assignment operator '=' in a prototype. -sp_assign_default = force # ignore/add/remove/force +# +# If set to ignore, use sp_assign. +sp_assign_default = force # ignore/add/remove/force/not_defined # Add or remove space before assignment operator '=', '+=', etc. # # Overrides sp_assign. -sp_before_assign = ignore # ignore/add/remove/force +sp_before_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space after assignment operator '=', '+=', etc. # # Overrides sp_assign. -sp_after_assign = ignore # ignore/add/remove/force +sp_after_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space in 'NS_ENUM ('. -sp_enum_paren = ignore # ignore/add/remove/force +sp_enum_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space around assignment '=' in enum. -sp_enum_assign = add # ignore/add/remove/force +sp_enum_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space before assignment '=' in enum. # # Overrides sp_enum_assign. -sp_enum_before_assign = ignore # ignore/add/remove/force +sp_enum_before_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space after assignment '=' in enum. # # Overrides sp_enum_assign. -sp_enum_after_assign = ignore # ignore/add/remove/force +sp_enum_after_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space around assignment ':' in enum. -sp_enum_colon = force # ignore/add/remove/force +sp_enum_colon = force # ignore/add/remove/force/not_defined # Add or remove space around preprocessor '##' concatenation operator. # # Default: add -sp_pp_concat = force # ignore/add/remove/force +sp_pp_concat = force # ignore/add/remove/force/not_defined # Add or remove space after preprocessor '#' stringify operator. # Also affects the '#@' charizing operator. -sp_pp_stringify = ignore # ignore/add/remove/force +sp_pp_stringify = ignore # ignore/add/remove/force/not_defined # Add or remove space before preprocessor '#' stringify operator # as in '#define x(y) L#y'. -sp_before_pp_stringify = ignore # ignore/add/remove/force +sp_before_pp_stringify = ignore # ignore/add/remove/force/not_defined # Add or remove space around boolean operators '&&' and '||'. -sp_bool = force # ignore/add/remove/force +sp_bool = force # ignore/add/remove/force/not_defined # Add or remove space around compare operator '<', '>', '==', etc. -sp_compare = force # ignore/add/remove/force +sp_compare = force # ignore/add/remove/force/not_defined # Add or remove space inside '(' and ')'. -sp_inside_paren = force # ignore/add/remove/force +sp_inside_paren = force # ignore/add/remove/force/not_defined # Add or remove space between nested parentheses, i.e. '((' vs. ') )'. -sp_paren_paren = force # ignore/add/remove/force +sp_paren_paren = force # ignore/add/remove/force/not_defined # Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('. -sp_cparen_oparen = ignore # ignore/add/remove/force +sp_cparen_oparen = ignore # ignore/add/remove/force/not_defined # Whether to balance spaces inside nested parentheses. sp_balance_nested_parens = false # true/false # Add or remove space between ')' and '{'. -sp_paren_brace = force # ignore/add/remove/force +sp_paren_brace = force # ignore/add/remove/force/not_defined -# Add or remove space between nested braces, i.e. '{{' vs '{ {'. -sp_brace_brace = force # ignore/add/remove/force +# Add or remove space between nested braces, i.e. '{{' vs. '{ {'. +sp_brace_brace = force # ignore/add/remove/force/not_defined # Add or remove space before pointer star '*'. -sp_before_ptr_star = remove # ignore/add/remove/force +sp_before_ptr_star = remove # ignore/add/remove/force/not_defined # Add or remove space before pointer star '*' that isn't followed by a -# variable name. If set to 'ignore', sp_before_ptr_star is used instead. -sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force +# variable name. If set to ignore, sp_before_ptr_star is used instead. +sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force/not_defined -# Add or remove space between pointer stars '*'. -sp_between_ptr_star = remove # ignore/add/remove/force +# Add or remove space between pointer stars '*', as in 'int ***a;'. +sp_between_ptr_star = remove # ignore/add/remove/force/not_defined # Add or remove space after pointer star '*', if followed by a word. -sp_after_ptr_star = force # ignore/add/remove/force +# +# Overrides sp_type_func. +sp_after_ptr_star = force # ignore/add/remove/force/not_defined # Add or remove space after pointer caret '^', if followed by a word. -sp_after_ptr_block_caret = remove # ignore/add/remove/force +sp_after_ptr_block_caret = remove # ignore/add/remove/force/not_defined # Add or remove space after pointer star '*', if followed by a qualifier. -sp_after_ptr_star_qualifier = force # ignore/add/remove/force +sp_after_ptr_star_qualifier = force # ignore/add/remove/force/not_defined # Add or remove space after a pointer star '*', if followed by a function # prototype or function definition. -sp_after_ptr_star_func = force # ignore/add/remove/force +# +# Overrides sp_after_ptr_star and sp_type_func. +sp_after_ptr_star_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after a pointer star '*' in the trailing return of a +# function prototype or function definition. +sp_after_ptr_star_trailing = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the pointer star '*' and the name of the variable +# in a function pointer definition. +sp_ptr_star_func_var = ignore # ignore/add/remove/force/not_defined # Add or remove space after a pointer star '*', if followed by an open -# parenthesis, as in 'void* (*)(). -sp_ptr_star_paren = force # ignore/add/remove/force +# parenthesis, as in 'void* (*)()'. +sp_ptr_star_paren = force # ignore/add/remove/force/not_defined # Add or remove space before a pointer star '*', if followed by a function # prototype or function definition. -sp_before_ptr_star_func = remove # ignore/add/remove/force +sp_before_ptr_star_func = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*' in the trailing return of a +# function prototype or function definition. +sp_before_ptr_star_trailing = ignore # ignore/add/remove/force/not_defined # Add or remove space before a reference sign '&'. -sp_before_byref = remove # ignore/add/remove/force +sp_before_byref = remove # ignore/add/remove/force/not_defined # Add or remove space before a reference sign '&' that isn't followed by a -# variable name. If set to 'ignore', sp_before_byref is used instead. -sp_before_unnamed_byref = remove # ignore/add/remove/force +# variable name. If set to ignore, sp_before_byref is used instead. +sp_before_unnamed_byref = remove # ignore/add/remove/force/not_defined # Add or remove space after reference sign '&', if followed by a word. -sp_after_byref = force # ignore/add/remove/force +# +# Overrides sp_type_func. +sp_after_byref = force # ignore/add/remove/force/not_defined # Add or remove space after a reference sign '&', if followed by a function # prototype or function definition. -sp_after_byref_func = force # ignore/add/remove/force +# +# Overrides sp_after_byref and sp_type_func. +sp_after_byref_func = force # ignore/add/remove/force/not_defined # Add or remove space before a reference sign '&', if followed by a function # prototype or function definition. -sp_before_byref_func = remove # ignore/add/remove/force +sp_before_byref_func = remove # ignore/add/remove/force/not_defined -# Add or remove space between type and word. +# Add or remove space between type and word. In cases where total removal of +# whitespace would be a syntax error, a value of 'remove' is treated the same +# as 'force'. +# +# This also affects some other instances of space following a type that are +# not covered by other options; for example, between the return type and +# parenthesis of a function type template argument, between the type and +# parenthesis of an array parameter, or between 'decltype(...)' and the +# following word. # # Default: force -sp_after_type = force # ignore/add/remove/force +sp_after_type = force # ignore/add/remove/force/not_defined -# Add or remove space between 'decltype(...)' and word. -sp_after_decltype = ignore # ignore/add/remove/force +# Add or remove space between 'decltype(...)' and word, +# brace or function call. +sp_after_decltype = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space before the parenthesis in the D constructs # 'template Foo(' and 'class Foo('. -sp_before_template_paren = ignore # ignore/add/remove/force +sp_before_template_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'template' and '<'. # If set to ignore, sp_before_angle is used. -sp_template_angle = remove # ignore/add/remove/force +sp_template_angle = remove # ignore/add/remove/force/not_defined # Add or remove space before '<'. -sp_before_angle = ignore # ignore/add/remove/force +sp_before_angle = ignore # ignore/add/remove/force/not_defined # Add or remove space inside '<' and '>'. -sp_inside_angle = force # ignore/add/remove/force +sp_inside_angle = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '<>'. +sp_inside_angle_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and ':'. -sp_angle_colon = ignore # ignore/add/remove/force +sp_angle_colon = ignore # ignore/add/remove/force/not_defined -# Add or remove space after '<>'. -sp_after_angle = ignore # ignore/add/remove/force +# Add or remove space after '>'. +sp_after_angle = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and '(' as found in 'new List(foo);'. -sp_angle_paren = ignore # ignore/add/remove/force +sp_angle_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and '()' as found in 'new List();'. -sp_angle_paren_empty = ignore # ignore/add/remove/force +sp_angle_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and a word as in 'List m;' or # 'template static ...'. -sp_angle_word = ignore # ignore/add/remove/force +sp_angle_word = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and '>' in '>>' (template stuff). # # Default: add -sp_angle_shift = add # ignore/add/remove/force +sp_angle_shift = add # ignore/add/remove/force/not_defined # (C++11) Permit removal of the space between '>>' in 'foo >'. Note # that sp_angle_shift cannot remove the space without this option. @@ -249,492 +311,724 @@ sp_permit_cpp11_shift = false # true/false # Add or remove space before '(' of control statements ('if', 'for', 'switch', # 'while', etc.). -sp_before_sparen = ignore # ignore/add/remove/force +sp_before_sparen = ignore # ignore/add/remove/force/not_defined -# Add or remove space inside '(' and ')' of control statements. -sp_inside_sparen = ignore # ignore/add/remove/force +# Add or remove space inside '(' and ')' of control statements other than +# 'for'. +sp_inside_sparen = ignore # ignore/add/remove/force/not_defined -# Add or remove space after '(' of control statements. +# Add or remove space after '(' of control statements other than 'for'. # # Overrides sp_inside_sparen. -sp_inside_sparen_open = ignore # ignore/add/remove/force +sp_inside_sparen_open = ignore # ignore/add/remove/force/not_defined -# Add or remove space before ')' of control statements. +# Add or remove space before ')' of control statements other than 'for'. # # Overrides sp_inside_sparen. -sp_inside_sparen_close = ignore # ignore/add/remove/force +sp_inside_sparen_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of 'for' statements. +sp_inside_for = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '((' or '))' of control statements. +sp_sparen_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space after ')' of control statements. -sp_after_sparen = ignore # ignore/add/remove/force +sp_after_sparen = ignore # ignore/add/remove/force/not_defined -# Add or remove space between ')' and '{' of of control statements. -sp_sparen_brace = ignore # ignore/add/remove/force +# Add or remove space between ')' and '{' of control statements. +sp_sparen_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'do' and '{'. +sp_do_brace_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and 'while'. +sp_brace_close_while = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'while' and '('. Overrides sp_before_sparen. +sp_while_paren_open = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space between 'invariant' and '('. -sp_invariant_paren = ignore # ignore/add/remove/force +sp_invariant_paren = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space after the ')' in 'invariant (C) c'. -sp_after_invariant_paren = ignore # ignore/add/remove/force +sp_after_invariant_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space before empty statement ';' on 'if', 'for' and 'while'. -sp_special_semi = ignore # ignore/add/remove/force +sp_special_semi = ignore # ignore/add/remove/force/not_defined # Add or remove space before ';'. # # Default: remove -sp_before_semi = remove # ignore/add/remove/force +sp_before_semi = remove # ignore/add/remove/force/not_defined # Add or remove space before ';' in non-empty 'for' statements. -sp_before_semi_for = ignore # ignore/add/remove/force +sp_before_semi_for = ignore # ignore/add/remove/force/not_defined -# Add or remove space before a semicolon of an empty part of a for statement. -sp_before_semi_for_empty = ignore # ignore/add/remove/force +# Add or remove space before a semicolon of an empty left part of a for +# statement, as in 'for ( ; ; )'. +sp_before_semi_for_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the semicolons of an empty middle part of a for +# statement, as in 'for ( ; ; )'. +sp_between_semi_for_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space after ';', except when followed by a comment. # # Default: add -sp_after_semi = add # ignore/add/remove/force +sp_after_semi = add # ignore/add/remove/force/not_defined # Add or remove space after ';' in non-empty 'for' statements. # # Default: force -sp_after_semi_for = force # ignore/add/remove/force +sp_after_semi_for = force # ignore/add/remove/force/not_defined # Add or remove space after the final semicolon of an empty part of a for # statement, as in 'for ( ; ; )'. -sp_after_semi_for_empty = ignore # ignore/add/remove/force +sp_after_semi_for_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space before '[' (except '[]'). -sp_before_square = ignore # ignore/add/remove/force +sp_before_square = ignore # ignore/add/remove/force/not_defined -# Add or remove space before '[]'. -sp_before_squares = ignore # ignore/add/remove/force - -# Add or remove space before C++17 structured bindings. -sp_cpp_before_struct_binding = ignore # ignore/add/remove/force - -# Add or remove space inside a non-empty '[' and ']'. -sp_inside_square = ignore # ignore/add/remove/force - -# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. -sp_after_comma = ignore # ignore/add/remove/force - -# Add or remove space before ','. +# Add or remove space before '[' for a variable definition. # # Default: remove -sp_before_comma = remove # ignore/add/remove/force +sp_before_vardef_square = remove # ignore/add/remove/force/not_defined + +# Add or remove space before '[' for asm block. +sp_before_square_asm_block = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before '[]'. +sp_before_squares = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before C++17 structured bindings. +sp_cpp_before_struct_binding = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside a non-empty '[' and ']'. +sp_inside_square = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '[]'. +sp_inside_square_empty = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside a non-empty Objective-C boxed array '@[' and +# ']'. If set to ignore, sp_inside_square is used. +sp_inside_square_oc_array = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. +sp_after_comma = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before ',', i.e. 'a,b' vs. 'a ,b'. +# +# Default: remove +sp_before_comma = remove # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between ',' in multidimensional array type +# like 'int[,,]'. +sp_between_mdatype_commas = ignore # ignore/add/remove/force/not_defined # Add or remove space between an open parenthesis and comma, # i.e. '(,' vs. '( ,'. # # Default: force -sp_paren_comma = force # ignore/add/remove/force +sp_paren_comma = force # ignore/add/remove/force/not_defined + +# Add or remove space after the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overriden with FORCE +sp_after_ellipsis = add # ignore/add/remove/force/not_defined # Add or remove space before the variadic '...' when preceded by a # non-punctuator. -sp_before_ellipsis = add # ignore/add/remove/force +# The value REMOVE will be overriden with FORCE +sp_before_ellipsis = add # ignore/add/remove/force/not_defined # Add or remove space between a type and '...'. -sp_type_ellipsis = add # ignore/add/remove/force +sp_type_ellipsis = add # ignore/add/remove/force/not_defined + +# Add or remove space between a '*' and '...'. +sp_ptr_type_ellipsis = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space between a type and '?'. +sp_type_question = ignore # ignore/add/remove/force/not_defined # Add or remove space between ')' and '...'. -sp_paren_ellipsis = add # ignore/add/remove/force +sp_paren_ellipsis = add # ignore/add/remove/force/not_defined + +# Add or remove space between '&&' and '...'. +sp_byref_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and a qualifier such as 'const'. +sp_paren_qualifier = add # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = add # ignore/add/remove/force/not_defined # Add or remove space after class ':'. -sp_after_class_colon = add # ignore/add/remove/force +sp_after_class_colon = add # ignore/add/remove/force/not_defined # Add or remove space before class ':'. -sp_before_class_colon = add # ignore/add/remove/force +sp_before_class_colon = add # ignore/add/remove/force/not_defined # Add or remove space after class constructor ':'. -sp_after_constr_colon = add # ignore/add/remove/force +# +# Default: add +sp_after_constr_colon = add # ignore/add/remove/force/not_defined # Add or remove space before class constructor ':'. -sp_before_constr_colon = remove # ignore/add/remove/force +# +# Default: add +sp_before_constr_colon = remove # ignore/add/remove/force/not_defined # Add or remove space before case ':'. # # Default: remove -sp_before_case_colon = remove # ignore/add/remove/force +sp_before_case_colon = remove # ignore/add/remove/force/not_defined # Add or remove space between 'operator' and operator sign. -sp_after_operator = ignore # ignore/add/remove/force +sp_after_operator = ignore # ignore/add/remove/force/not_defined # Add or remove space between the operator symbol and the open parenthesis, as # in 'operator ++('. -sp_after_operator_sym = ignore # ignore/add/remove/force +sp_after_operator_sym = ignore # ignore/add/remove/force/not_defined # Overrides sp_after_operator_sym when the operator has no arguments, as in # 'operator *()'. -sp_after_operator_sym_empty = ignore # ignore/add/remove/force +sp_after_operator_sym_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space after C/D cast, i.e. 'cast(int)a' vs. 'cast(int) a' or # '(int)a' vs. '(int) a'. -sp_after_cast = ignore # ignore/add/remove/force +sp_after_cast = ignore # ignore/add/remove/force/not_defined # Add or remove spaces inside cast parentheses. -sp_inside_paren_cast = ignore # ignore/add/remove/force +sp_inside_paren_cast = ignore # ignore/add/remove/force/not_defined # Add or remove space between the type and open parenthesis in a C++ cast, # i.e. 'int(exp)' vs. 'int (exp)'. -sp_cpp_cast_paren = remove # ignore/add/remove/force +sp_cpp_cast_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between 'sizeof' and '('. -sp_sizeof_paren = remove # ignore/add/remove/force +sp_sizeof_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between 'sizeof' and '...'. -sp_sizeof_ellipsis = force # ignore/add/remove/force +sp_sizeof_ellipsis = force # ignore/add/remove/force/not_defined # Add or remove space between 'sizeof...' and '('. -sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force +sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '...' and a parameter pack. +sp_ellipsis_parameter_pack = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a parameter pack and '...'. +sp_parameter_pack_ellipsis = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'decltype' and '('. -sp_decltype_paren = ignore # ignore/add/remove/force +sp_decltype_paren = ignore # ignore/add/remove/force/not_defined # (Pawn) Add or remove space after the tag keyword. -sp_after_tag = ignore # ignore/add/remove/force +sp_after_tag = ignore # ignore/add/remove/force/not_defined # Add or remove space inside enum '{' and '}'. -sp_inside_braces_enum = ignore # ignore/add/remove/force +sp_inside_braces_enum = ignore # ignore/add/remove/force/not_defined # Add or remove space inside struct/union '{' and '}'. -sp_inside_braces_struct = ignore # ignore/add/remove/force +sp_inside_braces_struct = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside Objective-C boxed dictionary '{' and '}' +sp_inside_braces_oc_dict = ignore # ignore/add/remove/force/not_defined # Add or remove space after open brace in an unnamed temporary -# direct-list-initialization. -sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force +# direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore. +sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force/not_defined # Add or remove space before close brace in an unnamed temporary -# direct-list-initialization. -sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force +# direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore. +sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force/not_defined -# Add or remove space inside an unnamed temporary direct-list-initialization. -sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force +# Add or remove space inside an unnamed temporary direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore +# works only if sp_before_type_brace_init_lst_close is set to ignore. +sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined # Add or remove space inside '{' and '}'. -sp_inside_braces = ignore # ignore/add/remove/force +sp_inside_braces = ignore # ignore/add/remove/force/not_defined # Add or remove space inside '{}'. -sp_inside_braces_empty = ignore # ignore/add/remove/force +sp_inside_braces_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # ignore/add/remove/force/not_defined # Add or remove space between return type and function name. A minimum of 1 # is forced except for pointer return types. -sp_type_func = ignore # ignore/add/remove/force +sp_type_func = ignore # ignore/add/remove/force/not_defined # Add or remove space between type and open brace of an unnamed temporary # direct-list-initialization. -sp_type_brace_init_lst = force # ignore/add/remove/force +sp_type_brace_init_lst = force # ignore/add/remove/force/not_defined # Add or remove space between function name and '(' on function declaration. -sp_func_proto_paren = ignore # ignore/add/remove/force +sp_func_proto_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '()' on function declaration # without parameters. -sp_func_proto_paren_empty = ignore # ignore/add/remove/force +sp_func_proto_paren_empty = ignore # ignore/add/remove/force/not_defined -# Add or remove space between function name and '(' on function definition. -sp_func_def_paren = ignore # ignore/add/remove/force +# Add or remove space between function name and '(' with a typedef specifier. +sp_func_type_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between alias name and '(' of a non-pointer function type typedef. +sp_func_def_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '()' on function definition # without parameters. -sp_func_def_paren_empty = ignore # ignore/add/remove/force +sp_func_def_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space inside empty function '()'. -sp_inside_fparens = remove # ignore/add/remove/force +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_fparens = remove # ignore/add/remove/force/not_defined # Add or remove space inside function '(' and ')'. -sp_inside_fparen = ignore # ignore/add/remove/force +sp_inside_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space inside the first parentheses in a function type, as in # 'void (*x)(...)'. -sp_inside_tparen = ignore # ignore/add/remove/force +sp_inside_tparen = ignore # ignore/add/remove/force/not_defined # Add or remove space between the ')' and '(' in a function type, as in # 'void (*x)(...)'. -sp_after_tparen_close = ignore # ignore/add/remove/force +sp_after_tparen_close = ignore # ignore/add/remove/force/not_defined # Add or remove space between ']' and '(' when part of a function call. -sp_square_fparen = ignore # ignore/add/remove/force +sp_square_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space between ')' and '{' of function. -sp_fparen_brace = ignore # ignore/add/remove/force +sp_fparen_brace = ignore # ignore/add/remove/force/not_defined -# Add or remove space between ')' and '{' of s function call in object +# Add or remove space between ')' and '{' of a function call in object # initialization. # # Overrides sp_fparen_brace. -sp_fparen_brace_initializer = ignore # ignore/add/remove/force +sp_fparen_brace_initializer = ignore # ignore/add/remove/force/not_defined # (Java) Add or remove space between ')' and '{{' of double brace initializer. -sp_fparen_dbrace = ignore # ignore/add/remove/force +sp_fparen_dbrace = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '(' on function calls. -sp_func_call_paren = ignore # ignore/add/remove/force +sp_func_call_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '()' on function calls without -# parameters. If set to 'ignore' (the default), sp_func_call_paren is used. -sp_func_call_paren_empty = ignore # ignore/add/remove/force +# parameters. If set to ignore (the default), sp_func_call_paren is used. +sp_func_call_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space between the user function name and '(' on function # calls. You need to set a keyword to be a user function in the config file, # like: # set func_call_user tr _ i18n -sp_func_call_user_paren = ignore # ignore/add/remove/force +sp_func_call_user_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space inside user function '(' and ')'. -sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force +sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space between nested parentheses with user functions, # i.e. '((' vs. '( ('. -sp_func_call_user_paren_paren = ignore # ignore/add/remove/force +sp_func_call_user_paren_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between a constructor/destructor and the open # parenthesis. -sp_func_class_paren = ignore # ignore/add/remove/force +sp_func_class_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between a constructor without parameters or destructor # and '()'. -sp_func_class_paren_empty = ignore # ignore/add/remove/force +sp_func_class_paren_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after 'return'. +# +# Default: force +sp_return = force # ignore/add/remove/force/not_defined # Add or remove space between 'return' and '('. -sp_return_paren = ignore # ignore/add/remove/force +sp_return_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'return' and '{'. -sp_return_brace = force # ignore/add/remove/force +sp_return_brace = force # ignore/add/remove/force/not_defined # Add or remove space between '__attribute__' and '('. -sp_attribute_paren = ignore # ignore/add/remove/force +sp_attribute_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'defined' and '(' in '#if defined (FOO)'. -sp_defined_paren = ignore # ignore/add/remove/force +sp_defined_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'throw' and '(' in 'throw (something)'. -sp_throw_paren = ignore # ignore/add/remove/force +sp_throw_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'throw' and anything other than '(' as in # '@throw [...];'. -sp_after_throw = ignore # ignore/add/remove/force +sp_after_throw = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'catch' and '(' in 'catch (something) { }'. # If set to ignore, sp_before_sparen is used. -sp_catch_paren = ignore # ignore/add/remove/force +sp_catch_paren = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@catch' and '(' +# in '@catch (something) { }'. If set to ignore, sp_catch_paren is used. +sp_oc_catch_paren = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before Objective-C protocol list +# as in '@protocol Protocol' or '@interface MyClass : NSObject'. +sp_before_oc_proto_list = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between class name and '(' +# in '@interface className(categoryName):BaseClass' +sp_oc_classname_paren = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space between 'version' and '(' # in 'version (something) { }'. If set to ignore, sp_before_sparen is used. -sp_version_paren = ignore # ignore/add/remove/force +sp_version_paren = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space between 'scope' and '(' # in 'scope (something) { }'. If set to ignore, sp_before_sparen is used. -sp_scope_paren = ignore # ignore/add/remove/force +sp_scope_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'super' and '(' in 'super (something)'. # # Default: remove -sp_super_paren = remove # ignore/add/remove/force +sp_super_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between 'this' and '(' in 'this (something)'. # # Default: remove -sp_this_paren = remove # ignore/add/remove/force +sp_this_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between a macro name and its definition. -sp_macro = ignore # ignore/add/remove/force +sp_macro = ignore # ignore/add/remove/force/not_defined # Add or remove space between a macro function ')' and its definition. -sp_macro_func = ignore # ignore/add/remove/force +sp_macro_func = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'else' and '{' if on the same line. -sp_else_brace = ignore # ignore/add/remove/force +sp_else_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and 'else' if on the same line. -sp_brace_else = ignore # ignore/add/remove/force +sp_brace_else = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and the name of a typedef on the same line. -sp_brace_typedef = ignore # ignore/add/remove/force +sp_brace_typedef = ignore # ignore/add/remove/force/not_defined # Add or remove space before the '{' of a 'catch' statement, if the '{' and # 'catch' are on the same line, as in 'catch (decl) {'. -sp_catch_brace = ignore # ignore/add/remove/force +sp_catch_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the '{' of a '@catch' statement, if the '{' +# and '@catch' are on the same line, as in '@catch (decl) {'. +# If set to ignore, sp_catch_brace is used. +sp_oc_catch_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and 'catch' if on the same line. -sp_brace_catch = ignore # ignore/add/remove/force +sp_brace_catch = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '}' and '@catch' if on the same line. +# If set to ignore, sp_brace_catch is used. +sp_oc_brace_catch = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'finally' and '{' if on the same line. -sp_finally_brace = ignore # ignore/add/remove/force +sp_finally_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and 'finally' if on the same line. -sp_brace_finally = ignore # ignore/add/remove/force +sp_brace_finally = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'try' and '{' if on the same line. -sp_try_brace = ignore # ignore/add/remove/force +sp_try_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between get/set and '{' if on the same line. -sp_getset_brace = ignore # ignore/add/remove/force +sp_getset_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between a variable and '{' for C++ uniform # initialization. -# -# Default: add -sp_word_brace = add # ignore/add/remove/force +sp_word_brace_init_lst = add # ignore/add/remove/force/not_defined # Add or remove space between a variable and '{' for a namespace. # # Default: add -sp_word_brace_ns = add # ignore/add/remove/force +sp_word_brace_ns = add # ignore/add/remove/force/not_defined # Add or remove space before the '::' operator. -sp_before_dc = ignore # ignore/add/remove/force +sp_before_dc = ignore # ignore/add/remove/force/not_defined # Add or remove space after the '::' operator. -sp_after_dc = ignore # ignore/add/remove/force +sp_after_dc = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove around the D named array initializer ':' operator. +sp_d_array_colon = ignore # ignore/add/remove/force/not_defined # Add or remove space after the '!' (not) unary operator. # # Default: remove -sp_not = remove # ignore/add/remove/force +sp_not = remove # ignore/add/remove/force/not_defined # Add or remove space after the '~' (invert) unary operator. # # Default: remove -sp_inv = remove # ignore/add/remove/force +sp_inv = remove # ignore/add/remove/force/not_defined # Add or remove space after the '&' (address-of) unary operator. This does not # affect the spacing after a '&' that is part of a type. # # Default: remove -sp_addr = remove # ignore/add/remove/force +sp_addr = remove # ignore/add/remove/force/not_defined # Add or remove space around the '.' or '->' operators. # # Default: remove -sp_member = remove # ignore/add/remove/force +sp_member = remove # ignore/add/remove/force/not_defined # Add or remove space after the '*' (dereference) unary operator. This does # not affect the spacing after a '*' that is part of a type. # # Default: remove -sp_deref = remove # ignore/add/remove/force +sp_deref = remove # ignore/add/remove/force/not_defined # Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. # # Default: remove -sp_sign = remove # ignore/add/remove/force +sp_sign = remove # ignore/add/remove/force/not_defined # Add or remove space between '++' and '--' the word to which it is being # applied, as in '(--x)' or 'y++;'. # # Default: remove -sp_incdec = remove # ignore/add/remove/force +sp_incdec = remove # ignore/add/remove/force/not_defined # Add or remove space before a backslash-newline at the end of a line. # # Default: add -sp_before_nl_cont = add # ignore/add/remove/force +sp_before_nl_cont = add # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the scope '+' or '-', as in '-(void) foo;' +# or '+(int) bar;'. +sp_after_oc_scope = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in message specs, +# i.e. '-(int) f:(int) x;' vs. '-(int) f: (int) x;'. +sp_after_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in message specs, +# i.e. '-(int) f: (int) x;' vs. '-(int) f : (int) x;'. +sp_before_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_after_oc_dict_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_before_oc_dict_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue: 1];'. +sp_after_send_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue :1];'. +sp_before_send_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the (type) in message specs, +# i.e. '-(int)f: (int) x;' vs. '-(int)f: (int)x;'. +sp_after_oc_type = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the first (type) in message specs, +# i.e. '-(int) f:(int)x;' vs. '-(int)f:(int)x;'. +sp_after_oc_return_type = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@selector' and '(', +# i.e. '@selector(msgName)' vs. '@selector (msgName)'. +# Also applies to '@protocol()' constructs. +sp_after_oc_at_sel = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@selector(x)' and the following word, +# i.e. '@selector(foo) a:' vs. '@selector(foo)a:'. +sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside '@selector' parentheses, +# i.e. '@selector(foo)' vs. '@selector( foo )'. +# Also applies to '@protocol()' constructs. +sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before a block pointer caret, +# i.e. '^int (int arg){...}' vs. ' ^int (int arg){...}'. +sp_before_oc_block_caret = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after a block pointer caret, +# i.e. '^int (int arg){...}' vs. '^ int (int arg){...}'. +sp_after_oc_block_caret = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between the receiver and selector in a message, +# as in '[receiver selector ...]'. +sp_after_oc_msg_receiver = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after '@property'. +sp_after_oc_property = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@synchronized' and the open parenthesis, +# i.e. '@synchronized(foo)' vs. '@synchronized (foo)'. +sp_after_oc_synchronized = ignore # ignore/add/remove/force/not_defined # Add or remove space around the ':' in 'b ? t : f'. -sp_cond_colon = force # ignore/add/remove/force +sp_cond_colon = force # ignore/add/remove/force/not_defined # Add or remove space before the ':' in 'b ? t : f'. # # Overrides sp_cond_colon. -sp_cond_colon_before = ignore # ignore/add/remove/force +sp_cond_colon_before = ignore # ignore/add/remove/force/not_defined # Add or remove space after the ':' in 'b ? t : f'. # # Overrides sp_cond_colon. -sp_cond_colon_after = ignore # ignore/add/remove/force +sp_cond_colon_after = ignore # ignore/add/remove/force/not_defined # Add or remove space around the '?' in 'b ? t : f'. -sp_cond_question = force # ignore/add/remove/force +sp_cond_question = force # ignore/add/remove/force/not_defined # Add or remove space before the '?' in 'b ? t : f'. # # Overrides sp_cond_question. -sp_cond_question_before = ignore # ignore/add/remove/force +sp_cond_question_before = ignore # ignore/add/remove/force/not_defined # Add or remove space after the '?' in 'b ? t : f'. # # Overrides sp_cond_question. -sp_cond_question_after = ignore # ignore/add/remove/force +sp_cond_question_after = ignore # ignore/add/remove/force/not_defined # In the abbreviated ternary form '(a ?: b)', add or remove space between '?' # and ':'. # # Overrides all other sp_cond_* options. -sp_cond_ternary_short = ignore # ignore/add/remove/force +sp_cond_ternary_short = ignore # ignore/add/remove/force/not_defined # Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make # sense here. -sp_case_label = ignore # ignore/add/remove/force +sp_case_label = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space around the D '..' operator. -sp_range = ignore # ignore/add/remove/force +sp_range = ignore # ignore/add/remove/force/not_defined # Add or remove space after ':' in a Java/C++11 range-based 'for', -# as in 'for (Type var : expr)'. -sp_after_for_colon = force # ignore/add/remove/force +# as in 'for (Type var : expr)'. +sp_after_for_colon = force # ignore/add/remove/force/not_defined # Add or remove space before ':' in a Java/C++11 range-based 'for', -# as in 'for (Type var : expr)'. -sp_before_for_colon = force # ignore/add/remove/force +# as in 'for (Type var : expr)'. +sp_before_for_colon = force # ignore/add/remove/force/not_defined -# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. -sp_extern_paren = ignore # ignore/add/remove/force +# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. +sp_extern_paren = ignore # ignore/add/remove/force/not_defined -# Add or remove space after the opening of a C++ comment, -# i.e. '// A' vs. '//A'. -sp_cmt_cpp_start = ignore # ignore/add/remove/force +# Add or remove space after the opening of a C++ comment, as in '// A'. +sp_cmt_cpp_start = ignore # ignore/add/remove/force/not_defined -# If true, space is added with sp_cmt_cpp_start will be added after doxygen +# Add or remove space in a C++ region marker comment, as in '// BEGIN'. +# A region marker is defined as a comment which is not preceded by other text +# (i.e. the comment is the first non-whitespace on the line), and which starts +# with either 'BEGIN' or 'END'. +# +# Overrides sp_cmt_cpp_start. +sp_cmt_cpp_region = ignore # ignore/add/remove/force/not_defined + +# If true, space added with sp_cmt_cpp_start will be added after Doxygen # sequences like '///', '///<', '//!' and '//!<'. sp_cmt_cpp_doxygen = false # true/false -# If true, space is added with sp_cmt_cpp_start will be added after Qt -# translator or meta-data comments like '//:', '//=', and '//~'. +# If true, space added with sp_cmt_cpp_start will be added after Qt translator +# or meta-data comments like '//:', '//=', and '//~'. sp_cmt_cpp_qttr = false # true/false # Add or remove space between #else or #endif and a trailing comment. -sp_endif_cmt = ignore # ignore/add/remove/force +sp_endif_cmt = ignore # ignore/add/remove/force/not_defined # Add or remove space after 'new', 'delete' and 'delete[]'. -sp_after_new = ignore # ignore/add/remove/force +sp_after_new = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'new' and '(' in 'new()'. -sp_between_new_paren = ignore # ignore/add/remove/force +sp_between_new_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between ')' and type in 'new(foo) BAR'. -sp_after_newop_paren = force # ignore/add/remove/force +sp_after_newop_paren = force # ignore/add/remove/force/not_defined # Add or remove space inside parenthesis of the new operator # as in 'new(foo) BAR'. -sp_inside_newop_paren = force # ignore/add/remove/force +sp_inside_newop_paren = force # ignore/add/remove/force/not_defined # Add or remove space after the open parenthesis of the new operator, # as in 'new(foo) BAR'. # # Overrides sp_inside_newop_paren. -sp_inside_newop_paren_open = force # ignore/add/remove/force +sp_inside_newop_paren_open = force # ignore/add/remove/force/not_defined # Add or remove space before the close parenthesis of the new operator, # as in 'new(foo) BAR'. # # Overrides sp_inside_newop_paren. -sp_inside_newop_paren_close = force # ignore/add/remove/force +sp_inside_newop_paren_close = force # ignore/add/remove/force/not_defined -# Add or remove space before a trailing or embedded comment. -sp_before_tr_emb_cmt = ignore # ignore/add/remove/force +# Add or remove space before a trailing comment. +sp_before_tr_cmt = ignore # ignore/add/remove/force/not_defined -# Number of spaces before a trailing or embedded comment. -sp_num_before_tr_emb_cmt = 0 # unsigned number +# Number of spaces before a trailing comment. +sp_num_before_tr_cmt = 0 # unsigned number + +# Add or remove space before an embedded comment. +# +# Default: force +sp_before_emb_cmt = force # ignore/add/remove/force/not_defined + +# Number of spaces before an embedded comment. +# +# Default: 1 +sp_num_before_emb_cmt = 1 # unsigned number + +# Add or remove space after an embedded comment. +# +# Default: force +sp_after_emb_cmt = force # ignore/add/remove/force/not_defined + +# Number of spaces after an embedded comment. +# +# Default: 1 +sp_num_after_emb_cmt = 1 # unsigned number # (Java) Add or remove space between an annotation and the open parenthesis. -sp_annotation_paren = ignore # ignore/add/remove/force +sp_annotation_paren = ignore # ignore/add/remove/force/not_defined # If true, vbrace tokens are dropped to the previous token and skipped. sp_skip_vbrace_tokens = false # true/false # Add or remove space after 'noexcept'. -sp_after_noexcept = force # ignore/add/remove/force +sp_after_noexcept = force # ignore/add/remove/force/not_defined + +# Add or remove space after '_'. +sp_vala_after_translation = ignore # ignore/add/remove/force/not_defined # If true, a is inserted after #define. force_tab_after_define = false # true/false @@ -748,9 +1042,9 @@ force_tab_after_define = false # true/false # Default: 8 indent_columns = 4 # unsigned number -# The continuation indent. If non-zero, this overrides the indent of '(' and -# '=' continuation indents. Negative values are OK; negative value is absolute -# and not increased for each '(' level. +# The continuation indent. If non-zero, this overrides the indent of '(', '[' +# and '=' continuation indents. Negative values are OK; negative value is +# absolute and not increased for each '(' or '[' level. # # For FreeBSD, this is set to 4. indent_continue = 4 # number @@ -803,13 +1097,20 @@ indent_braces_no_class = false # true/false indent_braces_no_struct = false # true/false # Whether to indent based on the size of the brace parent, -# i.e. 'if' → 3 spaces, 'for' → 4 spaces, etc. +# i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. indent_brace_parent = false # true/false # Whether to indent based on the open parenthesis instead of the open brace # in '({\n'. indent_paren_open_brace = false # true/false +# (C#) Whether to indent the brace of a C# delegate by another level. +indent_cs_delegate_brace = false # true/false + +# (C#) Whether to indent a C# delegate (to handle delegates with no brace) by +# another level. +indent_cs_delegate_body = false # true/false + # Whether to indent the body of a 'namespace'. indent_namespace = true # true/false @@ -818,6 +1119,7 @@ indent_namespace = true # true/false indent_namespace_single_indent = false # true/false # The number of spaces to indent a namespace block. +# If set to zero, use the value indent_columns indent_namespace_level = 0 # unsigned number # If the body of the namespace is longer than this number, it won't be @@ -830,6 +1132,12 @@ indent_extern = true # true/false # Whether the 'class' body is indented. indent_class = true # true/false +# Additional indent before the leading base class colon. +# Negative values decrease indent down to the first column. +# Requires a newline break before colon (see pos_class_colon +# and nl_class_colon) +indent_before_class_colon = 0 # number + # Whether to indent the stuff after a leading base class colon. indent_class_colon = false # true/false @@ -840,11 +1148,16 @@ indent_class_on_colon = false # true/false # Whether to indent the stuff after a leading class initializer colon. indent_constr_colon = false # true/false -# Virtual indent from the ':' for member initializers. +# Virtual indent from the ':' for leading member initializers. # # Default: 2 indent_ctor_init_leading = 2 # unsigned number +# Virtual indent from the ':' for following member initializers. +# +# Default: 2 +indent_ctor_init_following = 2 # unsigned number + # Additional indent for constructor initializer list. # Negative values decrease indent down to the first column. indent_ctor_init = 0 # number @@ -855,8 +1168,8 @@ indent_else_if = false # true/false # Amount to indent variable declarations after a open brace. # -# <0: Relative -# ≥0: Absolute +# <0: Relative +# >=0: Absolute indent_var_def_blk = 0 # number # Whether to indent continued variable declarations instead of aligning. @@ -873,19 +1186,30 @@ indent_func_def_force_col1 = false # true/false # rather than aligning parameters under the open parenthesis. indent_func_call_param = true # true/false -# Same as indent_func_call_param, but for function definitions. +# Whether to indent continued function definition parameters one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_def_param = true # true/false -# Same as indent_func_call_param, but for function prototypes. +# for function definitions, only if indent_func_def_param is false +# Allows to align params when appropriate and indent them when not +# behave as if it was true if paren position is more than this value +# if paren position is more than the option value +indent_func_def_param_paren_pos_threshold = 0 # unsigned number + +# Whether to indent continued function call prototype one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_proto_param = true # true/false -# Same as indent_func_call_param, but for class declarations. +# Whether to indent continued function call declaration one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_class_param = true # true/false -# Same as indent_func_call_param, but for class variable constructors. +# Whether to indent continued class variable constructors one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_ctor_var_param = true # true/false -# Same as indent_func_call_param, but for template parameter lists. +# Whether to indent continued template parameter list one indent level, +# rather than aligning parameters under the open parenthesis. indent_template_param = true # true/false # Double the indent for indent_func_xxx_param options. @@ -900,6 +1224,16 @@ indent_func_const = 0 # unsigned number # prototype. indent_func_throw = 0 # unsigned number +# How to indent within a macro followed by a brace on the same line +# This allows reducing the indent in macros that have (for example) +# `do { ... } while (0)` blocks bracketing them. +# +# true: add an indent for the brace on the same line as the macro +# false: do not add an indent for the brace on the same line as the macro +# +# Default: true +indent_macro_brace = true # true/false + # The number of spaces to indent a continued '->' or '.'. # Usually set to 0, 1, or indent_columns. indent_member = 4 # unsigned number @@ -909,15 +1243,35 @@ indent_member = 4 # unsigned number indent_member_single = true # true/false # Spaces to indent single line ('//') comments on lines before code. -indent_sing_line_comments = 0 # unsigned number +indent_single_line_comments_before = 0 # unsigned number + +# Spaces to indent single line ('//') comments on lines after code. +indent_single_line_comments_after = 0 # unsigned number + +# When opening a paren for a control statement (if, for, while, etc), increase +# the indent level by this value. Negative values decrease the indent level. +indent_sparen_extra = 0 # number # Whether to indent trailing single line ('//') comments relative to the code # instead of trying to keep the same absolute column. indent_relative_single_line_comments = false # true/false # Spaces to indent 'case' from 'switch'. Usually 0 or indent_columns. +# It might be wise to choose the same value for the option indent_case_brace. indent_switch_case = 4 # unsigned number +# Spaces to indent the body of a 'switch' before any 'case'. +# Usually the same as indent_columns or indent_switch_case. +indent_switch_body = 0 # unsigned number + +# Spaces to indent '{' from 'case'. By default, the brace will appear under +# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. +# It might be wise to choose the same value for the option indent_switch_case. +indent_case_brace = 0 # number + +# indent 'break' with 'case' from 'switch'. +indent_switch_break_with_case = false # true/false + # Whether to indent preprocessor statements inside of switch statements. # # Default: true @@ -927,24 +1281,44 @@ indent_switch_pp = true # true/false # Usually 0. indent_case_shift = 0 # unsigned number -# Spaces to indent '{' from 'case'. By default, the brace will appear under -# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. -indent_case_brace = 0 # number +# Whether to align comments before 'case' with the 'case'. +# +# Default: true +indent_case_comment = true # true/false + +# Whether to indent comments not found in first column. +# +# Default: true +indent_comment = true # true/false # Whether to indent comments found in first column. indent_col1_comment = false # true/false -# How to indent goto labels. +# Whether to indent multi string literal in first column. +indent_col1_multi_string_literal = false # true/false + +# Align comments on adjacent lines that are this many columns apart or less. # -# >0: Absolute column where 1 is the leftmost column -# ≤0: Subtract from brace indent +# Default: 3 +indent_comment_align_thresh = 3 # unsigned number + +# Whether to ignore indent for goto labels. +indent_ignore_label = false # true/false + +# How to indent goto labels. Requires indent_ignore_label=false. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent # # Default: 1 indent_label = 1 # number -# Same as indent_label, but for access specifiers that are followed by a +# How to indent access specifiers that are followed by a # colon. # +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# # Default: 1 indent_access_spec = -2 # number @@ -975,6 +1349,10 @@ indent_paren_after_func_decl = false # true/false # if the parenthesis is on its own line. indent_paren_after_func_call = false # true/false +# Whether to indent a comma when inside a brace. +# If true, aligns under the open brace. +indent_comma_brace = false # true/false + # Whether to indent a comma when inside a parenthesis. # If true, aligns under the open parenthesis. indent_comma_paren = false # true/false @@ -1008,18 +1386,66 @@ indent_preserve_sql = false # true/false # Default: true indent_align_assign = false # true/false -# Whether to align continued statements at the '('. If false or the '(' is not +# If true, the indentation of the chunks after a '=' sequence will be set at +# LHS token indentation column before '='. +indent_off_after_assign = false # true/false + +# Whether to align continued statements at the '('. If false or the '(' is # followed by a newline, the next line indent is one tab. # # Default: true indent_align_paren = true # true/false +# (OC) Whether to indent Objective-C code inside message selectors. +indent_oc_inside_msg_sel = false # true/false + +# (OC) Whether to indent Objective-C blocks at brace level instead of usual +# rules. +indent_oc_block = false # true/false + +# (OC) Indent for Objective-C blocks in a message relative to the parameter +# name. +# +# =0: Use indent_oc_block rules +# >0: Use specified number of spaces to indent +indent_oc_block_msg = 0 # unsigned number + +# (OC) Minimum indent for subsequent parameters +indent_oc_msg_colon = 0 # unsigned number + +# (OC) Whether to prioritize aligning with initial colon (and stripping spaces +# from lines, if necessary). +# +# Default: true +indent_oc_msg_prioritize_first_colon = true # true/false + +# (OC) Whether to indent blocks the way that Xcode does by default +# (from the keyword if the parameter is on its own line; otherwise, from the +# previous indentation level). Requires indent_oc_block_msg=true. +indent_oc_block_msg_xcode_style = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a +# message keyword. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_keyword = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a message +# colon. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_colon = false # true/false + +# (OC) Whether to indent blocks from where the block caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_caret = false # true/false + +# (OC) Whether to indent blocks from where the brace caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_brace = false # true/false + # When indenting after virtual brace open and newline add further spaces to # reach this minimum indent. indent_min_vbrace_open = 0 # unsigned number # Whether to add further spaces after regular indent to reach next tabstop -# when identing after virtual brace open and newline. +# when indenting after virtual brace open and newline. indent_vbrace_open_on_tabstop = false # true/false # How to indent after a brace followed by another token (not a newline). @@ -1032,6 +1458,20 @@ indent_token_after_brace = true # true/false # Whether to indent the body of a C++11 lambda. indent_cpp_lambda_body = false # true/false +# How to indent compound literals that are being returned. +# true: add both the indent from return & the compound literal open brace +# (i.e. 2 indent levels) +# false: only indent 1 level, don't add the indent for the open brace, only +# add the indent for the return. +# +# Default: true +indent_compound_literal_return = true # true/false + +# (C#) Whether to indent a 'using' block if no braces are used. +# +# Default: true +indent_using_block = true # true/false + # How to indent the continuation of ternary operator. # # 0: Off (default) @@ -1039,6 +1479,12 @@ indent_cpp_lambda_body = false # true/false # 2: When the `:` is a continuation, indent it under `?` indent_ternary_operator = 0 # unsigned number +# Whether to indent the statements inside ternary operator. +indent_inside_ternary_operator = false # true/false + +# If true, the indentation of the chunks after a `return` sequence will be set at return indentation column. +indent_off_after_return = false # true/false + # If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. indent_off_after_return_new = false # true/false @@ -1049,11 +1495,16 @@ indent_single_after_return = false # true/false # have their own indentation). indent_ignore_asm_block = false # true/false +# Don't indent the close parenthesis of a function definition, +# if the parenthesis is on its own line. +donot_indent_func_def_close_paren = false # true/false + # # Newline adding and removing options # # Whether to collapse empty blocks between '{' and '}'. +# If true, overrides nl_inside_empty_func nl_collapse_empty_body = false # true/false # Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. @@ -1068,7 +1519,11 @@ nl_enum_leave_one_liners = true # true/false # Don't split one-line get or set functions. nl_getset_leave_one_liners = true # true/false +# (C#) Don't split one-line property get or set functions. +nl_cs_property_leave_one_liners = true # true/false + # Don't split one-line function definitions, as in 'int foo() { return 0; }'. +# might modify nl_func_type_name nl_func_leave_one_liners = true # true/false # Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. @@ -1080,176 +1535,176 @@ nl_if_leave_one_liners = false # true/false # Don't split one-line while statements, as in 'while(...) b++;'. nl_while_leave_one_liners = false # true/false +# Don't split one-line do statements, as in 'do { b++; } while(...);'. +nl_do_leave_one_liners = true # true/false + # Don't split one-line for statements, as in 'for(...) b++;'. nl_for_leave_one_liners = true # true/false +# (OC) Don't split one-line Objective-C messages. +nl_oc_msg_leave_one_liner = false # true/false + +# (OC) Add or remove newline between method declaration and '{'. +nl_oc_mdef_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between Objective-C block signature and '{'. +nl_oc_block_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@interface' statement. +nl_oc_before_interface = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@implementation' statement. +nl_oc_before_implementation = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@end' statement. +nl_oc_before_end = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '@interface' and '{'. +nl_oc_interface_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '@implementation' and '{'. +nl_oc_implementation_brace = ignore # ignore/add/remove/force/not_defined + # Add or remove newlines at the start of the file. -nl_start_of_file = ignore # ignore/add/remove/force +nl_start_of_file = ignore # ignore/add/remove/force/not_defined # The minimum number of newlines at the start of the file (only used if # nl_start_of_file is 'add' or 'force'). nl_start_of_file_min = 0 # unsigned number # Add or remove newline at the end of the file. -nl_end_of_file = ignore # ignore/add/remove/force +nl_end_of_file = ignore # ignore/add/remove/force/not_defined # The minimum number of newlines at the end of the file (only used if # nl_end_of_file is 'add' or 'force'). nl_end_of_file_min = 0 # unsigned number # Add or remove newline between '=' and '{'. -nl_assign_brace = ignore # ignore/add/remove/force +nl_assign_brace = ignore # ignore/add/remove/force/not_defined # (D) Add or remove newline between '=' and '['. -nl_assign_square = ignore # ignore/add/remove/force +nl_assign_square = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '[]' and '{'. -nl_tsquare_brace = force # ignore/add/remove/force +nl_tsquare_brace = force # ignore/add/remove/force/not_defined # (D) Add or remove newline after '= ['. Will also affect the newline before # the ']'. -nl_after_square_assign = ignore # ignore/add/remove/force - -# The number of blank lines after a block of variable definitions at the top -# of a function body. -# -# 0 = No change (default). -nl_func_var_def_blk = 0 # unsigned number - -# The number of newlines before a block of typedefs. If nl_after_access_spec -# is non-zero, that option takes precedence. -# -# 0 = No change (default). -nl_typedef_blk_start = 0 # unsigned number - -# The number of newlines after a block of typedefs. -# -# 0 = No change (default). -nl_typedef_blk_end = 0 # unsigned number - -# The maximum number of consecutive newlines within a block of typedefs. -# -# 0 = No change (default). -nl_typedef_blk_in = 0 # unsigned number - -# The number of newlines before a block of variable definitions not at the top -# of a function body. If nl_after_access_spec is non-zero, that option takes -# precedence. -# -# 0 = No change (default). -nl_var_def_blk_start = 0 # unsigned number - -# The number of newlines after a block of variable definitions not at the top -# of a function body. -# -# 0 = No change (default). -nl_var_def_blk_end = 0 # unsigned number - -# The maximum number of consecutive newlines within a block of variable -# definitions. -# -# 0 = No change (default). -nl_var_def_blk_in = 0 # unsigned number +nl_after_square_assign = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function call's ')' and '{', as in # 'list_for_each(item, &list) { }'. -nl_fcall_brace = ignore # ignore/add/remove/force +nl_fcall_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'enum' and '{'. -nl_enum_brace = add # ignore/add/remove/force +nl_enum_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'enum' and 'class'. -nl_enum_class = remove # ignore/add/remove/force +nl_enum_class = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'enum class' and the identifier. -nl_enum_class_identifier = remove # ignore/add/remove/force +nl_enum_class_identifier = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'enum class' type and ':'. -nl_enum_identifier_colon = remove # ignore/add/remove/force +nl_enum_identifier_colon = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'enum class identifier :' and type. -nl_enum_colon_type = remove # ignore/add/remove/force +nl_enum_colon_type = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'struct and '{'. -nl_struct_brace = add # ignore/add/remove/force +nl_struct_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'union' and '{'. -nl_union_brace = add # ignore/add/remove/force +nl_union_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'if' and '{'. -nl_if_brace = add # ignore/add/remove/force +nl_if_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'else'. -nl_brace_else = add # ignore/add/remove/force +nl_brace_else = add # ignore/add/remove/force/not_defined # Add or remove newline between 'else if' and '{'. If set to ignore, # nl_if_brace is used instead. -nl_elseif_brace = add # ignore/add/remove/force +nl_elseif_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'else' and '{'. -nl_else_brace = add # ignore/add/remove/force +nl_else_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'else' and 'if'. -nl_else_if = ignore # ignore/add/remove/force +nl_else_if = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline before '{' opening brace +nl_before_opening_brace_func_class_def = add # ignore/add/remove/force/not_defined # Add or remove newline before 'if'/'else if' closing parenthesis. -nl_before_if_closing_paren = ignore # ignore/add/remove/force +nl_before_if_closing_paren = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'finally'. -nl_brace_finally = add # ignore/add/remove/force +nl_brace_finally = add # ignore/add/remove/force/not_defined # Add or remove newline between 'finally' and '{'. -nl_finally_brace = add # ignore/add/remove/force +nl_finally_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'try' and '{'. -nl_try_brace = add # ignore/add/remove/force +nl_try_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between get/set and '{'. -nl_getset_brace = add # ignore/add/remove/force +nl_getset_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'for' and '{'. -nl_for_brace = add # ignore/add/remove/force +nl_for_brace = add # ignore/add/remove/force/not_defined # Add or remove newline before the '{' of a 'catch' statement, as in # 'catch (decl) {'. -nl_catch_brace = add # ignore/add/remove/force +nl_catch_brace = add # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline before the '{' of a '@catch' statement, as in +# '@catch (decl) {'. If set to ignore, nl_catch_brace is used. +nl_oc_catch_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'catch'. -nl_brace_catch = add # ignore/add/remove/force +nl_brace_catch = add # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '}' and '@catch'. If set to ignore, +# nl_brace_catch is used. +nl_oc_brace_catch = add # ignore/add/remove/force/not_defined # Add or remove newline between '}' and ']'. -nl_brace_square = ignore # ignore/add/remove/force +nl_brace_square = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '}' and ')' in a function invocation. -nl_brace_fparen = ignore # ignore/add/remove/force +nl_brace_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'while' and '{'. -nl_while_brace = ignore # ignore/add/remove/force +nl_while_brace = ignore # ignore/add/remove/force/not_defined # (D) Add or remove newline between 'scope (x)' and '{'. -nl_scope_brace = add # ignore/add/remove/force +nl_scope_brace = add # ignore/add/remove/force/not_defined # (D) Add or remove newline between 'unittest' and '{'. -nl_unittest_brace = ignore # ignore/add/remove/force +nl_unittest_brace = ignore # ignore/add/remove/force/not_defined # (D) Add or remove newline between 'version (x)' and '{'. -nl_version_brace = ignore # ignore/add/remove/force +nl_version_brace = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove newline between 'using' and '{'. +nl_using_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between two open or close braces. Due to general # newline/brace handling, REMOVE may not work. -nl_brace_brace = ignore # ignore/add/remove/force +nl_brace_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'do' and '{'. -nl_do_brace = ignore # ignore/add/remove/force +nl_do_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'while' of 'do' statement. -nl_brace_while = ignore # ignore/add/remove/force +nl_brace_while = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'switch' and '{'. -nl_switch_brace = ignore # ignore/add/remove/force +nl_switch_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'synchronized' and '{'. -nl_synchronized_brace = ignore # ignore/add/remove/force +nl_synchronized_brace = ignore # ignore/add/remove/force/not_defined # Add a newline between ')' and '{' if the ')' is on a different line than the # if/for/etc. @@ -1258,6 +1713,14 @@ nl_synchronized_brace = ignore # ignore/add/remove/force # nl_catch_brace. nl_multi_line_cond = false # true/false +# Add a newline after '(' if an if/for/while/switch condition spans multiple +# lines +nl_multi_line_sparen_open = ignore # ignore/add/remove/force/not_defined + +# Add a newline before ')' if an if/for/while/switch condition spans multiple +# lines. Overrides nl_before_if_closing_paren if both are specified. +nl_multi_line_sparen_close = ignore # ignore/add/remove/force/not_defined + # Force a newline in a define after the macro name for multi-line defines. nl_multi_line_define = false # true/false @@ -1271,86 +1734,141 @@ nl_after_case = false # true/false # Add or remove newline between a case ':' and '{'. # # Overrides nl_after_case. -nl_case_colon_brace = ignore # ignore/add/remove/force +nl_case_colon_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between ')' and 'throw'. -nl_before_throw = ignore # ignore/add/remove/force +nl_before_throw = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'namespace' and '{'. -nl_namespace_brace = ignore # ignore/add/remove/force +nl_namespace_brace = ignore # ignore/add/remove/force/not_defined -# Add or remove newline between 'template<>' and whatever follows. -nl_template_class = ignore # ignore/add/remove/force +# Add or remove newline after 'template<...>' of a template class. +nl_template_class = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class declaration. +# +# Overrides nl_template_class. +nl_template_class_decl = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized class declaration. +# +# Overrides nl_template_class_decl. +nl_template_class_decl_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class definition. +# +# Overrides nl_template_class. +nl_template_class_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized class definition. +# +# Overrides nl_template_class_def. +nl_template_class_def_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function. +nl_template_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function +# declaration. +# +# Overrides nl_template_func. +nl_template_func_decl = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized function +# declaration. +# +# Overrides nl_template_func_decl. +nl_template_func_decl_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function +# definition. +# +# Overrides nl_template_func. +nl_template_func_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized function +# definition. +# +# Overrides nl_template_func_def. +nl_template_func_def_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template variable. +nl_template_var = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'template<...>' and 'using' of a templated +# type alias. +nl_template_using = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'class' and '{'. -nl_class_brace = ignore # ignore/add/remove/force +nl_class_brace = ignore # ignore/add/remove/force/not_defined -# Add or remove newline before or after (depending on pos_class_comma) each -# ',' in the base class list. -nl_class_init_args = ignore # ignore/add/remove/force +# Add or remove newline before or after (depending on pos_class_comma, +# may not be IGNORE) each',' in the base class list. +nl_class_init_args = ignore # ignore/add/remove/force/not_defined # Add or remove newline after each ',' in the constructor member # initialization. Related to nl_constr_colon, pos_constr_colon and # pos_constr_comma. -nl_constr_init_args = force # ignore/add/remove/force +nl_constr_init_args = force # ignore/add/remove/force/not_defined # Add or remove newline before first element, after comma, and after last # element, in 'enum'. -nl_enum_own_lines = ignore # ignore/add/remove/force +nl_enum_own_lines = ignore # ignore/add/remove/force/not_defined # Add or remove newline between return type and function name in a function # definition. -nl_func_type_name = ignore # ignore/add/remove/force +# might be modified by nl_func_leave_one_liners +nl_func_type_name = ignore # ignore/add/remove/force/not_defined # Add or remove newline between return type and function name inside a class # definition. If set to ignore, nl_func_type_name or nl_func_proto_type_name # is used instead. -nl_func_type_name_class = ignore # ignore/add/remove/force +nl_func_type_name_class = ignore # ignore/add/remove/force/not_defined # Add or remove newline between class specification and '::' # in 'void A::f() { }'. Only appears in separate member implementation (does # not appear with in-line implementation). -nl_func_class_scope = ignore # ignore/add/remove/force +nl_func_class_scope = ignore # ignore/add/remove/force/not_defined # Add or remove newline between function scope and name, as in # 'void A :: f() { }'. -nl_func_scope_name = ignore # ignore/add/remove/force +nl_func_scope_name = ignore # ignore/add/remove/force/not_defined # Add or remove newline between return type and function name in a prototype. -nl_func_proto_type_name = ignore # ignore/add/remove/force +nl_func_proto_type_name = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function name and the opening '(' in the # declaration. -nl_func_paren = ignore # ignore/add/remove/force +nl_func_paren = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_paren for functions with no parameters. -nl_func_paren_empty = ignore # ignore/add/remove/force +nl_func_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function name and the opening '(' in the # definition. -nl_func_def_paren = ignore # ignore/add/remove/force +nl_func_def_paren = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_def_paren for functions with no parameters. -nl_func_def_paren_empty = ignore # ignore/add/remove/force +nl_func_def_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function name and the opening '(' in the # call. -nl_func_call_paren = remove # ignore/add/remove/force +nl_func_call_paren = remove # ignore/add/remove/force/not_defined # Overrides nl_func_call_paren for functions with no parameters. -nl_func_call_paren_empty = remove # ignore/add/remove/force +nl_func_call_paren_empty = remove # ignore/add/remove/force/not_defined # Add or remove newline after '(' in a function declaration. -nl_func_decl_start = ignore # ignore/add/remove/force +nl_func_decl_start = ignore # ignore/add/remove/force/not_defined # Add or remove newline after '(' in a function definition. -nl_func_def_start = ignore # ignore/add/remove/force +nl_func_def_start = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_decl_start when there is only one parameter. -nl_func_decl_start_single = ignore # ignore/add/remove/force +nl_func_decl_start_single = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_def_start when there is only one parameter. -nl_func_def_start_single = ignore # ignore/add/remove/force +nl_func_def_start_single = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after '(' in a function declaration if '(' and ')' # are in different lines. If false, nl_func_decl_start is used instead. @@ -1361,10 +1879,13 @@ nl_func_decl_start_multi_line = false # true/false nl_func_def_start_multi_line = false # true/false # Add or remove newline after each ',' in a function declaration. -nl_func_decl_args = ignore # ignore/add/remove/force +nl_func_decl_args = ignore # ignore/add/remove/force/not_defined # Add or remove newline after each ',' in a function definition. -nl_func_def_args = ignore # ignore/add/remove/force +nl_func_def_args = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after each ',' in a function call. +nl_func_call_args = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after each ',' in a function declaration if '(' # and ')' are in different lines. If false, nl_func_decl_args is used instead. @@ -1375,16 +1896,16 @@ nl_func_decl_args_multi_line = false # true/false nl_func_def_args_multi_line = false # true/false # Add or remove newline before the ')' in a function declaration. -nl_func_decl_end = ignore # ignore/add/remove/force +nl_func_decl_end = ignore # ignore/add/remove/force/not_defined # Add or remove newline before the ')' in a function definition. -nl_func_def_end = ignore # ignore/add/remove/force +nl_func_def_end = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_decl_end when there is only one parameter. -nl_func_decl_end_single = ignore # ignore/add/remove/force +nl_func_decl_end_single = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_def_end when there is only one parameter. -nl_func_def_end_single = ignore # ignore/add/remove/force +nl_func_def_end_single = ignore # ignore/add/remove/force/not_defined # Whether to add a newline before ')' in a function declaration if '(' and ')' # are in different lines. If false, nl_func_decl_end is used instead. @@ -1395,13 +1916,20 @@ nl_func_decl_end_multi_line = false # true/false nl_func_def_end_multi_line = false # true/false # Add or remove newline between '()' in a function declaration. -nl_func_decl_empty = ignore # ignore/add/remove/force +nl_func_decl_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '()' in a function definition. -nl_func_def_empty = ignore # ignore/add/remove/force +nl_func_def_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '()' in a function call. -nl_func_call_empty = remove # ignore/add/remove/force +nl_func_call_empty = remove # ignore/add/remove/force/not_defined + +# Whether to add a newline after '(' in a function call, +# has preference over nl_func_call_start_multi_line. +nl_func_call_start = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline before ')' in a function call. +nl_func_call_end = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after '(' in a function call if '(' and ')' are in # different lines. @@ -1415,36 +1943,58 @@ nl_func_call_args_multi_line = false # true/false # different lines. nl_func_call_end_multi_line = false # true/false +# Whether to respect nl_func_call_XXX option in case of closure args. +nl_func_call_args_multi_line_ignore_closures = false # true/false + +# Whether to add a newline after '<' of a template parameter list. +nl_template_start = false # true/false + +# Whether to add a newline after each ',' in a template parameter list. +nl_template_args = false # true/false + +# Whether to add a newline before '>' of a template parameter list. +nl_template_end = false # true/false + +# (OC) Whether to put each Objective-C message parameter on a separate line. +# See nl_oc_msg_leave_one_liner. +nl_oc_msg_args = false # true/false + # Add or remove newline between function signature and '{'. -nl_fdef_brace = ignore # ignore/add/remove/force +nl_fdef_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between function signature and '{', +# if signature ends with ')'. Overrides nl_fdef_brace. +nl_fdef_brace_cond = ignore # ignore/add/remove/force/not_defined # Add or remove newline between C++11 lambda signature and '{'. -nl_cpp_ldef_brace = ignore # ignore/add/remove/force +nl_cpp_ldef_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'return' and the return expression. -nl_return_expr = ignore # ignore/add/remove/force +nl_return_expr = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after semicolons, except in 'for' statements. nl_after_semicolon = false # true/false # (Java) Add or remove newline between the ')' and '{{' of the double brace # initializer. -nl_paren_dbrace_open = ignore # ignore/add/remove/force +nl_paren_dbrace_open = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after the type in an unnamed temporary # direct-list-initialization. -nl_type_brace_init_lst = ignore # ignore/add/remove/force +nl_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after the open brace in an unnamed temporary # direct-list-initialization. -nl_type_brace_init_lst_open = ignore # ignore/add/remove/force +nl_type_brace_init_lst_open = ignore # ignore/add/remove/force/not_defined # Whether to add a newline before the close brace in an unnamed temporary # direct-list-initialization. -nl_type_brace_init_lst_close = ignore # ignore/add/remove/force +nl_type_brace_init_lst_close = ignore # ignore/add/remove/force/not_defined -# Whether to add a newline after '{'. This also adds a newline before the -# matching '}'. +# Whether to add a newline before '{'. +nl_before_brace_open = false # true/false + +# Whether to add a newline after '{'. nl_after_brace_open = false # true/false # Whether to add a newline between the open brace and a trailing single-line @@ -1470,7 +2020,7 @@ nl_after_vbrace_close = false # true/false # Add or remove newline between the close brace and identifier, # as in 'struct { int a; } b;'. Affects enumerations, unions and # structures. If set to ignore, uses nl_after_brace_close. -nl_brace_struct_var = ignore # ignore/add/remove/force +nl_brace_struct_var = ignore # ignore/add/remove/force/not_defined # Whether to alter newlines in '#define' macros. nl_define_macro = false # true/false @@ -1488,41 +2038,61 @@ nl_squeeze_ifdef = false # true/false nl_squeeze_ifdef_top_level = false # true/false # Add or remove blank line before 'if'. -nl_before_if = ignore # ignore/add/remove/force +nl_before_if = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'if' statement. Add/Force work only if the # next token is not a closing brace. -nl_after_if = ignore # ignore/add/remove/force +nl_after_if = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'for'. -nl_before_for = ignore # ignore/add/remove/force +nl_before_for = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'for' statement. -nl_after_for = ignore # ignore/add/remove/force +nl_after_for = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'while'. -nl_before_while = ignore # ignore/add/remove/force +nl_before_while = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'while' statement. -nl_after_while = ignore # ignore/add/remove/force +nl_after_while = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'switch'. -nl_before_switch = ignore # ignore/add/remove/force +nl_before_switch = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'switch' statement. -nl_after_switch = ignore # ignore/add/remove/force +nl_after_switch = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'synchronized'. -nl_before_synchronized = ignore # ignore/add/remove/force +nl_before_synchronized = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'synchronized' statement. -nl_after_synchronized = ignore # ignore/add/remove/force +nl_after_synchronized = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'do'. -nl_before_do = ignore # ignore/add/remove/force +nl_before_do = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'do/while' statement. -nl_after_do = ignore # ignore/add/remove/force +nl_after_do = ignore # ignore/add/remove/force/not_defined + +# Ignore nl_before_{if,for,switch,do,synchronized} if the control +# statement is immediately after a case statement. +# if nl_before_{if,for,switch,do} is set to remove, this option +# does nothing. +nl_before_ignore_after_case = false # true/false + +# Whether to put a blank line before 'return' statements, unless after an open +# brace. +nl_before_return = false # true/false + +# Whether to put a blank line after 'return' statements, unless followed by a +# close brace. +nl_after_return = false # true/false + +# Whether to put a blank line before a member '.' or '->' operators. +nl_before_member = ignore # ignore/add/remove/force/not_defined + +# (Java) Whether to put a blank line after a member '.' or '->' operators. +nl_after_member = ignore # ignore/add/remove/force/not_defined # Whether to double-space commented-entries in 'struct'/'union'/'enum'. nl_ds_struct_enum_cmt = false # true/false @@ -1533,27 +2103,27 @@ nl_ds_struct_enum_close_brace = false # true/false # Add or remove newline before or after (depending on pos_class_colon) a class # colon, as in 'class Foo : public Bar'. -nl_class_colon = ignore # ignore/add/remove/force +nl_class_colon = ignore # ignore/add/remove/force/not_defined # Add or remove newline around a class constructor colon. The exact position # depends on nl_constr_init_args, pos_constr_colon and pos_constr_comma. -nl_constr_colon = ignore # ignore/add/remove/force +nl_constr_colon = ignore # ignore/add/remove/force/not_defined # Whether to collapse a two-line namespace, like 'namespace foo\n{ decl; }' # into a single line. If true, prevents other brace newline rules from turning -# such code into four lines. +# such code into four lines. If true, it also preserves one-liner namespaces. nl_namespace_two_to_one_liner = false # true/false # Whether to remove a newline in simple unbraced if statements, turning them -# into one-liners, as in 'if(b)\n i++;' → 'if(b) i++;'. +# into one-liners, as in 'if(b)\n i++;' => 'if(b) i++;'. nl_create_if_one_liner = false # true/false # Whether to remove a newline in simple unbraced for statements, turning them -# into one-liners, as in 'for (...)\n stmt;' → 'for (...) stmt;'. +# into one-liners, as in 'for (...)\n stmt;' => 'for (...) stmt;'. nl_create_for_one_liner = false # true/false # Whether to remove a newline in simple unbraced while statements, turning -# them into one-liners, as in 'while (expr)\n stmt;' → 'while (expr) stmt;'. +# them into one-liners, as in 'while (expr)\n stmt;' => 'while (expr) stmt;'. nl_create_while_one_liner = false # true/false # Whether to collapse a function definition whose body (not counting braces) @@ -1561,6 +2131,10 @@ nl_create_while_one_liner = false # true/false # a single line. nl_create_func_def_one_liner = false # true/false +# Whether to split one-line simple list definitions into three lines by +# adding newlines, as in 'int a[12] = { 0 };'. +nl_create_list_one_liner = false # true/false + # Whether to split one-line simple unbraced if statements into two lines by # adding a newline, as in 'if(b) i++;'. nl_split_if_one_liner = false # true/false @@ -1573,6 +2147,10 @@ nl_split_for_one_liner = false # true/false # adding a newline, as in 'while (expr) stmt;'. nl_split_while_one_liner = false # true/false +# Don't add a newline before a cpp-comment in a parameter list of a function +# call. +donot_add_nl_before_cpp_comment = false # true/false + # # Blank line options # @@ -1583,10 +2161,17 @@ nl_max = 0 # unsigned number # The maximum number of consecutive newlines in a function. nl_max_blank_in_func = 0 # unsigned number +# The number of newlines inside an empty function body. +# This option overrides eat_blanks_after_open_brace and +# eat_blanks_before_close_brace, but is ignored when +# nl_collapse_empty_body=true +nl_inside_empty_func = 0 # unsigned number + # The number of newlines before a function prototype. nl_before_func_body_proto = 0 # unsigned number -# The number of newlines before a multi-line function definition. +# The number of newlines before a multi-line function definition. Where +# applicable, this option is overridden with eat_blanks_after_open_brace=true nl_before_func_body_def = 0 # unsigned number # The number of newlines before a class constructor/destructor prototype. @@ -1631,6 +2216,47 @@ nl_after_func_body_class = 0 # unsigned number # Overrides nl_after_func_body and nl_after_func_body_class. nl_after_func_body_one_liner = 0 # unsigned number +# The number of blank lines after a block of variable definitions at the top +# of a function body. +# +# 0: No change (default). +nl_func_var_def_blk = 0 # unsigned number + +# The number of newlines before a block of typedefs. If nl_after_access_spec +# is non-zero, that option takes precedence. +# +# 0: No change (default). +nl_typedef_blk_start = 0 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 0 # unsigned number + +# The number of newlines before a block of variable definitions not at the top +# of a function body. If nl_after_access_spec is non-zero, that option takes +# precedence. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The number of newlines after a block of variable definitions not at the top +# of a function body. +# +# 0: No change (default). +nl_var_def_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of variable +# definitions. +# +# 0: No change (default). +nl_var_def_blk_in = 0 # unsigned number + # The minimum number of newlines before a multi-line comment. # Doesn't apply if after a brace open or another multi-line comment. nl_before_block_comment = 0 # unsigned number @@ -1649,6 +2275,9 @@ nl_after_multiline_comment = false # true/false # Whether to force a newline after a label's colon. nl_after_label_colon = false # true/false +# The number of newlines before a struct definition. +nl_before_struct = 0 # unsigned number + # The number of newlines after '}' or ';' of a struct/enum/union definition. nl_after_struct = 0 # unsigned number @@ -1658,18 +2287,33 @@ nl_before_class = 0 # unsigned number # The number of newlines after '}' or ';' of a class definition. nl_after_class = 0 # unsigned number +# The number of newlines before a namespace. +nl_before_namespace = 0 # unsigned number + +# The number of newlines after '{' of a namespace. This also adds newlines +# before the matching '}'. +# +# 0: Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if +# applicable, otherwise no change. +# +# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. +nl_inside_namespace = 0 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 0 # unsigned number + # The number of newlines before an access specifier label. This also includes # the Qt-specific 'signals:' and 'slots:'. Will not change the newline count # if after a brace open. # -# 0 = No change (default). +# 0: No change (default). nl_before_access_spec = 0 # unsigned number # The number of newlines after an access specifier label. This also includes # the Qt-specific 'signals:' and 'slots:'. Will not change the newline count # if after a brace open. # -# 0 = No change (default). +# 0: No change (default). # # Overrides nl_typedef_blk_start and nl_var_def_blk_start. nl_after_access_spec = 0 # unsigned number @@ -1677,23 +2321,28 @@ nl_after_access_spec = 0 # unsigned number # The number of newlines between a function definition and the function # comment, as in '// comment\n void foo() {...}'. # -# 0 = No change (default). +# 0: No change (default). nl_comment_func_def = 0 # unsigned number # The number of newlines after a try-catch-finally block that isn't followed # by a brace close. # -# 0 = No change (default). +# 0: No change (default). nl_after_try_catch_finally = 0 # unsigned number -# The number of newlines after '{' of a namespace. This also adds newlines -# before the matching '}'. +# (C#) The number of newlines before and after a property, indexer or event +# declaration. # -# 0 = Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if -# applicable, otherwise no change. +# 0: No change (default). +nl_around_cs_property = 0 # unsigned number + +# (C#) The number of newlines between the get/set/add/remove handlers. # -# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. -nl_inside_namespace = 0 # unsigned number +# 0: No change (default). +nl_between_get_set = 0 # unsigned number + +# (C#) Add or remove newline between property and the '{'. +nl_property_brace = ignore # ignore/add/remove/force/not_defined # Whether to remove blank lines after '{'. eat_blanks_after_open_brace = false # true/false @@ -1708,20 +2357,32 @@ eat_blanks_before_close_brace = false # true/false # 2: Remove all newlines and reformat completely by config nl_remove_extra_newlines = 0 # unsigned number -# Whether to put a blank line before 'return' statements, unless after an open -# brace. -nl_before_return = false # true/false - -# Whether to put a blank line after 'return' statements, unless followed by a -# close brace. -nl_after_return = false # true/false - # (Java) Add or remove newline after an annotation statement. Only affects # annotations that are after a newline. -nl_after_annotation = ignore # ignore/add/remove/force +nl_after_annotation = ignore # ignore/add/remove/force/not_defined # (Java) Add or remove newline between two annotations. -nl_between_annotation = ignore # ignore/add/remove/force +nl_between_annotation = ignore # ignore/add/remove/force/not_defined + +# The number of newlines before a whole-file #ifdef. +# +# 0: No change (default). +nl_before_whole_file_ifdef = 0 # unsigned number + +# The number of newlines after a whole-file #ifdef. +# +# 0: No change (default). +nl_after_whole_file_ifdef = 0 # unsigned number + +# The number of newlines before a whole-file #endif. +# +# 0: No change (default). +nl_before_whole_file_endif = 0 # unsigned number + +# The number of newlines after a whole-file #endif. +# +# 0: No change (default). +nl_after_whole_file_endif = 0 # unsigned number # # Positioning options @@ -1766,21 +2427,26 @@ pos_class_colon = ignore # ignore/break/force/lead/trail/join/ # Related to nl_constr_colon, nl_constr_init_args and pos_constr_comma. pos_constr_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +# The position of shift operators in wrapped expressions. +pos_shift = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + # # Line splitting options # # Try to limit code width to N columns. -code_width = 0 # unsigned number +code_width = 100 # unsigned number # Whether to fully split long 'for' statements at semi-colons. ls_for_split_full = false # true/false # Whether to fully split long function prototypes/calls at commas. +# The option ls_code_width has priority over the option ls_func_split_full. ls_func_split_full = false # true/false # Whether to split lines as close to code_width as possible and ignore some # groupings. +# The option ls_code_width has priority over the option ls_func_split_full. ls_code_width = false # true/false # @@ -1807,55 +2473,74 @@ align_func_params = false # true/false # The span for aligning parameter definitions in function on parameter name. # -# 0 = Don't align (default). +# 0: Don't align (default). align_func_params_span = 0 # unsigned number # The threshold for aligning function parameter definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_func_params_thresh = 0 # unsigned number +# 0: No limit (default). +align_func_params_thresh = 0 # number # The gap for aligning function parameter definitions. align_func_params_gap = 0 # unsigned number +# The span for aligning constructor value. +# +# 0: Don't align (default). +align_constr_value_span = 0 # unsigned number + +# The threshold for aligning constructor value. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_constr_value_thresh = 0 # number + +# The gap for aligning constructor value. +align_constr_value_gap = 0 # unsigned number + # Whether to align parameters in single-line functions that have the same # name. The function names must already be aligned with each other. align_same_func_call_params = false # true/false # The span for aligning function-call parameters for single line functions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_same_func_call_params_span = 0 # unsigned number # The threshold for aligning function-call parameters for single line # functions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_same_func_call_params_thresh = 0 # unsigned number +# 0: No limit (default). +align_same_func_call_params_thresh = 0 # number # The span for aligning variable definitions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_var_def_span = 0 # unsigned number -# How to align the '*' in variable definitions. +# How to consider (or treat) the '*' in the alignment of variable definitions. # # 0: Part of the type 'void * foo;' (default) # 1: Part of the variable 'void *foo;' # 2: Dangling 'void *foo;' +# Dangling: the '*' will not be taken into account when aligning. align_var_def_star_style = 0 # unsigned number -# How to align the '&' in variable definitions. +# How to consider (or treat) the '&' in the alignment of variable definitions. # # 0: Part of the type 'long & foo;' (default) # 1: Part of the variable 'long &foo;' # 2: Dangling 'long &foo;' +# Dangling: the '&' will not be taken into account when aligning. align_var_def_amp_style = 0 # unsigned number # The threshold for aligning variable definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_var_def_thresh = 0 # unsigned number +# 0: No limit (default). +align_var_def_thresh = 0 # number # The gap for aligning variable definitions. align_var_def_gap = 0 # unsigned number @@ -1874,13 +2559,19 @@ align_var_def_inline = false # true/false # The span for aligning on '=' in assignments. # -# 0 = Don't align (default). +# 0: Don't align (default). align_assign_span = 0 # unsigned number -# The threshold for aligning on '=' in assignments. +# The span for aligning on '=' in function prototype modifier. # -# 0 = No limit (default). -align_assign_thresh = 0 # unsigned number +# 0: Don't align (default). +align_assign_func_proto_span = 0 # unsigned number + +# The threshold for aligning on '=' in assignments. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_assign_thresh = 0 # number # How to apply align_assign_span to function declaration "assignments", i.e. # 'virtual void foo() = 0' or '~foo() = {default|delete}'. @@ -1892,53 +2583,56 @@ align_assign_decl_func = 0 # unsigned number # The span for aligning on '=' in enums. # -# 0 = Don't align (default). +# 0: Don't align (default). align_enum_equ_span = 0 # unsigned number # The threshold for aligning on '=' in enums. +# Use a negative number for absolute thresholds. # -# 0 = no limit (default). -align_enum_equ_thresh = 0 # unsigned number +# 0: no limit (default). +align_enum_equ_thresh = 0 # number # The span for aligning class member definitions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_var_class_span = 0 # unsigned number # The threshold for aligning class member definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_var_class_thresh = 0 # unsigned number +# 0: No limit (default). +align_var_class_thresh = 0 # number # The gap for aligning class member definitions. align_var_class_gap = 0 # unsigned number # The span for aligning struct/union member definitions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_var_struct_span = 0 # unsigned number # The threshold for aligning struct/union member definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_var_struct_thresh = 0 # unsigned number +# 0: No limit (default). +align_var_struct_thresh = 0 # number # The gap for aligning struct/union member definitions. align_var_struct_gap = 0 # unsigned number # The span for aligning struct initializer values. # -# 0 = Don't align (default). +# 0: Don't align (default). align_struct_init_span = 0 # unsigned number -# The minimum space between the type and the synonym of a typedef. -align_typedef_gap = 0 # unsigned number - # The span for aligning single-line typedefs. # -# 0 = Don't align (default). +# 0: Don't align (default). align_typedef_span = 0 # unsigned number +# The minimum space between the type and the synonym of a typedef. +align_typedef_gap = 0 # unsigned number + # How to align typedef'd functions with other typedefs. # # 0: Don't mix them at all (default) @@ -1946,25 +2640,32 @@ align_typedef_span = 0 # unsigned number # 2: Align the function type name with the other type names align_typedef_func = 0 # unsigned number -# How to align the '*' in typedefs. +# How to consider (or treat) the '*' in the alignment of typedefs. # -# 0: Align on typedef type, ignore '*' (default) -# 1: The '*' is part of type name: 'typedef int *pint;' -# 2: The '*' is part of the type, but dangling: 'typedef int *pint;' +# 0: Part of the typedef type, 'typedef int * pint;' (default) +# 1: Part of type name: 'typedef int *pint;' +# 2: Dangling: 'typedef int *pint;' +# Dangling: the '*' will not be taken into account when aligning. align_typedef_star_style = 0 # unsigned number -# How to align the '&' in typedefs. +# How to consider (or treat) the '&' in the alignment of typedefs. # -# 0: Align on typedef type, ignore '&' (default) -# 1: The '&' is part of type name: 'typedef int &pint;' -# 2: The '&' is part of the type, but dangling: 'typedef int &pint;' +# 0: Part of the typedef type, 'typedef int & intref;' (default) +# 1: Part of type name: 'typedef int &intref;' +# 2: Dangling: 'typedef int &intref;' +# Dangling: the '&' will not be taken into account when aligning. align_typedef_amp_style = 0 # unsigned number # The span for aligning comments that end lines. # -# 0 = Don't align (default). +# 0: Don't align (default). align_right_cmt_span = 0 # unsigned number +# Minimum number of columns between preceding text and a trailing comment in +# order for the comment to qualify for being aligned. Must be non-zero to have +# an effect. +align_right_cmt_gap = 0 # unsigned number + # If aligning comments, whether to mix with comments after '}' and #endif with # less than three spaces before the comment. align_right_cmt_mix = false # true/false @@ -1972,23 +2673,40 @@ align_right_cmt_mix = false # true/false # Whether to only align trailing comments that are at the same brace level. align_right_cmt_same_level = false # true/false -# Minimum number of columns between preceding text and a trailing comment in -# order for the comment to qualify for being aligned. Must be non-zero to have -# an effect. -align_right_cmt_gap = 0 # unsigned number - # Minimum column at which to align trailing comments. Comments which are # aligned beyond this column, but which can be aligned in a lesser column, # may be "pulled in". # -# 0 = Ignore (default). +# 0: Ignore (default). align_right_cmt_at_col = 0 # unsigned number # The span for aligning function prototypes. # -# 0 = Don't align (default). +# 0: Don't align (default). align_func_proto_span = 0 # unsigned number +# How to consider (or treat) the '*' in the alignment of function prototypes. +# +# 0: Part of the type 'void * foo();' (default) +# 1: Part of the function 'void *foo();' +# 2: Dangling 'void *foo();' +# Dangling: the '*' will not be taken into account when aligning. +align_func_proto_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of function prototypes. +# +# 0: Part of the type 'long & foo();' (default) +# 1: Part of the function 'long &foo();' +# 2: Dangling 'long &foo();' +# Dangling: the '&' will not be taken into account when aligning. +align_func_proto_amp_style = 0 # unsigned number + +# The threshold for aligning function prototypes. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_func_proto_thresh = 0 # number + # Minimum gap between the return type and the function name. align_func_proto_gap = 0 # unsigned number @@ -2011,6 +2729,11 @@ align_single_line_brace = false # true/false # Gap for align_single_line_brace. align_single_line_brace_gap = 0 # unsigned number +# (OC) The span for aligning Objective-C message specifications. +# +# 0: Don't align (default). +align_oc_msg_spec_span = 0 # unsigned number + # Whether to align macros wrapped with a backslash and a newline. This will # not work right if the macro contains a multi-line comment. align_nl_cont = false # true/false @@ -2018,23 +2741,46 @@ align_nl_cont = false # true/false # Whether to align macro functions and variables together. align_pp_define_together = false # true/false -# The minimum space between label and value of a preprocessor define. -align_pp_define_gap = 0 # unsigned number - # The span for aligning on '#define' bodies. # # =0: Don't align (default) # >0: Number of lines (including comments) between blocks align_pp_define_span = 0 # unsigned number +# The minimum space between label and value of a preprocessor define. +align_pp_define_gap = 0 # unsigned number + # Whether to align lines that start with '<<' with previous '<<'. # # Default: true align_left_shift = true # true/false +# Whether to align comma-separated statements following '<<' (as used to +# initialize Eigen matrices). +align_eigen_comma_init = false # true/false + # Whether to align text after 'asm volatile ()' colons. align_asm_colon = false # true/false +# (OC) Span for aligning parameters in an Objective-C message call +# on the ':'. +# +# 0: Don't align. +align_oc_msg_colon_span = 0 # unsigned number + +# (OC) Whether to always align with the first parameter, even if it is too +# short. +align_oc_msg_colon_first = false # true/false + +# (OC) Whether to align parameters in an Objective-C '+' or '-' declaration +# on the ':'. +align_oc_decl_colon = false # true/false + +# (OC) Whether to not align parameters in an Objectve-C message call if first +# colon is not on next line of the message call (the same way Xcode does +# aligment) +align_oc_msg_colon_xcode_like = false # true/false + # # Comment modification options # @@ -2046,9 +2792,44 @@ cmt_width = 0 # unsigned number # # 0: No reflowing (apart from the line wrapping due to cmt_width) (default) # 1: No touching at all -# 2: Full reflow +# 2: Full reflow (enable cmt_indent_multi for indent with line wrapping due to cmt_width) cmt_reflow_mode = 0 # unsigned number +# Path to a file that contains regular expressions describing patterns for +# which the end of one line and the beginning of the next will be folded into +# the same sentence or paragraph during full comment reflow. The regular +# expressions are described using ECMAScript syntax. The syntax for this +# specification is as follows, where "..." indicates the custom regular +# expression and "n" indicates the nth end_of_prev_line_regex and +# beg_of_next_line_regex regular expression pair: +# +# end_of_prev_line_regex[1] = "...$" +# beg_of_next_line_regex[1] = "^..." +# end_of_prev_line_regex[2] = "...$" +# beg_of_next_line_regex[2] = "^..." +# . +# . +# . +# end_of_prev_line_regex[n] = "...$" +# beg_of_next_line_regex[n] = "^..." +# +# Note that use of this option overrides the default reflow fold regular +# expressions, which are internally defined as follows: +# +# end_of_prev_line_regex[1] = "[\w,\]\)]$" +# beg_of_next_line_regex[1] = "^[\w,\[\(]" +# end_of_prev_line_regex[2] = "\.$" +# beg_of_next_line_regex[2] = "^[A-Z]" +cmt_reflow_fold_regex_file = "" # string + +# Whether to indent wrapped lines to the start of the encompassing paragraph +# during full comment reflow (cmt_reflow_mode = 2). Overrides the value +# specified by cmt_sp_after_star_cont. +# +# Note that cmt_align_doxygen_javadoc_tags overrides this option for +# paragraphs associated with javadoc tags +cmt_reflow_indent_to_paragraph_start = false # true/false + # Whether to convert all tabs to spaces in comments. If false, tabs in # comments are left alone, unless used for indenting. cmt_convert_tab_to_spaces = true # true/false @@ -2059,6 +2840,25 @@ cmt_convert_tab_to_spaces = true # true/false # Default: true cmt_indent_multi = true # true/false +# Whether to align doxygen javadoc-style tags ('@param', '@return', etc.) +# and corresponding fields such that groups of consecutive block tags, +# parameter names, and descriptions align with one another. Overrides that +# which is specified by the cmt_sp_after_star_cont. If cmt_width > 0, it may +# be necessary to enable cmt_indent_multi and set cmt_reflow_mode = 2 +# in order to achieve the desired alignment for line-wrapping. +cmt_align_doxygen_javadoc_tags = false # true/false + +# The number of spaces to insert after the star and before doxygen +# javadoc-style tags (@param, @return, etc). Requires enabling +# cmt_align_doxygen_javadoc_tags. Overrides that which is specified by the +# cmt_sp_after_star_cont. +# +# Default: 1 +cmt_sp_before_doxygen_javadoc_tags = 1 # unsigned number + +# Whether to change trailing, single-line c-comments into cpp-comments. +cmt_trailing_single_line_c_to_cpp = false # true/false + # Whether to group c-comments that look like they are in a block. cmt_c_group = false # true/false @@ -2132,10 +2932,17 @@ cmt_insert_func_header = "" # string # that will be replaced with the class name. cmt_insert_class_header = "" # string +# Path to a file that contains text to insert before an Objective-C message +# specification, if the method isn't preceded by a C/C++ comment. If the +# inserted text contains '$(message)' or '$(javaparam)', these will be +# replaced with, respectively, the name of the function, or the javadoc +# '@param' and '@return' stuff. +cmt_insert_oc_msg_header = "" # string + # Whether a comment should be inserted if a preprocessor is encountered when # stepping backwards from a function name. # -# Applies to cmt_insert_func_header and +# Applies to cmt_insert_oc_msg_header, cmt_insert_func_header and # cmt_insert_class_header. cmt_insert_before_preproc = false # true/false @@ -2158,17 +2965,17 @@ cmt_insert_before_ctor_dtor = false # true/false # # Add or remove braces on a single-line 'do' statement. -mod_full_brace_do = ignore # ignore/add/remove/force +mod_full_brace_do = ignore # ignore/add/remove/force/not_defined # Add or remove braces on a single-line 'for' statement. -mod_full_brace_for = ignore # ignore/add/remove/force +mod_full_brace_for = ignore # ignore/add/remove/force/not_defined # (Pawn) Add or remove braces on a single-line function definition. -mod_full_brace_function = ignore # ignore/add/remove/force +mod_full_brace_function = ignore # ignore/add/remove/force/not_defined # Add or remove braces on a single-line 'if' statement. Braces will not be # removed if the braced statement contains an 'else'. -mod_full_brace_if = ignore # ignore/add/remove/force +mod_full_brace_if = ignore # ignore/add/remove/force/not_defined # Whether to enforce that all blocks of an 'if'/'else if'/'else' chain either # have, or do not have, braces. If true, braces will be added if any block @@ -2184,10 +2991,10 @@ mod_full_brace_if_chain = false # true/false mod_full_brace_if_chain_only = false # true/false # Add or remove braces on single-line 'while' statement. -mod_full_brace_while = ignore # ignore/add/remove/force +mod_full_brace_while = ignore # ignore/add/remove/force/not_defined # Add or remove braces on single-line 'using ()' statement. -mod_full_brace_using = ignore # ignore/add/remove/force +mod_full_brace_using = ignore # ignore/add/remove/force/not_defined # Don't remove braces around statements that span N newlines mod_full_brace_nl = 0 # unsigned number @@ -2209,18 +3016,21 @@ mod_full_brace_nl = 0 # unsigned number mod_full_brace_nl_block_rem_mlcond = false # true/false # Add or remove unnecessary parenthesis on 'return' statement. -mod_paren_on_return = ignore # ignore/add/remove/force +mod_paren_on_return = ignore # ignore/add/remove/force/not_defined # (Pawn) Whether to change optional semicolons to real semicolons. mod_pawn_semicolon = false # true/false # Whether to fully parenthesize Boolean expressions in 'while' and 'if' -# statement, as in 'if (a && b > c)' → 'if (a && (b > c))'. +# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'. mod_full_paren_if_bool = false # true/false # Whether to remove superfluous semicolons. mod_remove_extra_semicolon = false # true/false +# Whether to remove duplicate include. +mod_remove_duplicate_include = true # true/false + # If a function body exceeds the specified number of newlines and doesn't have # a comment after the close brace, a comment will be added. mod_add_long_function_closebrace_comment = 0 # unsigned number @@ -2245,28 +3055,80 @@ mod_add_long_ifdef_endif_comment = 0 # unsigned number # doesn't have a comment after the #else, a comment will be added. mod_add_long_ifdef_else_comment = 0 # unsigned number +# Whether to take care of the case by the mod_sort_xx options. +mod_sort_case_sensitive = false # true/false + # Whether to sort consecutive single-line 'import' statements. mod_sort_import = false # true/false +# (C#) Whether to sort consecutive single-line 'using' statements. +mod_sort_using = false # true/false + # Whether to sort consecutive single-line '#include' statements (C/C++) and # '#import' statements (Objective-C). Be aware that this has the potential to # break your code if your includes/imports have ordering dependencies. mod_sort_include = false # true/false +# Whether to prioritize '#include' and '#import' statements that contain +# filename without extension when sorting is enabled. +mod_sort_incl_import_prioritize_filename = false # true/false + +# Whether to prioritize '#include' and '#import' statements that does not +# contain extensions when sorting is enabled. +mod_sort_incl_import_prioritize_extensionless = false # true/false + +# Whether to prioritize '#include' and '#import' statements that contain +# angle over quotes when sorting is enabled. +mod_sort_incl_import_prioritize_angle_over_quotes = false # true/false + +# Whether to ignore file extension in '#include' and '#import' statements +# for sorting comparison. +mod_sort_incl_import_ignore_extension = false # true/false + +# Whether to group '#include' and '#import' statements when sorting is enabled. +mod_sort_incl_import_grouping_enabled = false # true/false + # Whether to move a 'break' that appears after a fully braced 'case' before -# the close brace, as in 'case X: { ... } break;' → 'case X: { ... break; }'. +# the close brace, as in 'case X: { ... } break;' => 'case X: { ... break; }'. mod_move_case_break = false # true/false # Add or remove braces around a fully braced case statement. Will only remove # braces if there are no variable declarations in the block. -mod_case_brace = ignore # ignore/add/remove/force +mod_case_brace = ignore # ignore/add/remove/force/not_defined # Whether to remove a void 'return;' that appears as the last statement in a # function. mod_remove_empty_return = false # true/false # Add or remove the comma after the last value of an enumeration. -mod_enum_last_comma = ignore # ignore/add/remove/force +mod_enum_last_comma = ignore # ignore/add/remove/force/not_defined + +# (OC) Whether to organize the properties. If true, properties will be +# rearranged according to the mod_sort_oc_property_*_weight factors. +mod_sort_oc_properties = false # true/false + +# (OC) Weight of a class property modifier. +mod_sort_oc_property_class_weight = 0 # number + +# (OC) Weight of 'atomic' and 'nonatomic'. +mod_sort_oc_property_thread_safe_weight = 0 # number + +# (OC) Weight of 'readwrite' when organizing properties. +mod_sort_oc_property_readwrite_weight = 0 # number + +# (OC) Weight of a reference type specifier ('retain', 'copy', 'assign', +# 'weak', 'strong') when organizing properties. +mod_sort_oc_property_reference_weight = 0 # number + +# (OC) Weight of getter type ('getter=') when organizing properties. +mod_sort_oc_property_getter_weight = 0 # number + +# (OC) Weight of setter type ('setter=') when organizing properties. +mod_sort_oc_property_setter_weight = 0 # number + +# (OC) Weight of nullability type ('nullable', 'nonnull', 'null_unspecified', +# 'null_resettable') when organizing properties. +mod_sort_oc_property_nullability_weight = 0 # number # # Preprocessor options @@ -2274,7 +3136,7 @@ mod_enum_last_comma = ignore # ignore/add/remove/force # Add or remove indentation of preprocessor directives inside #if blocks # at brace level 0 (file-level). -pp_indent = ignore # ignore/add/remove/force +pp_indent = ignore # ignore/add/remove/force/not_defined # Whether to indent #if/#else/#endif at the brace level. If false, these are # indented from column 1. @@ -2289,7 +3151,7 @@ pp_indent_at_level = false # true/false pp_indent_count = 1 # unsigned number # Add or remove space after # based on pp_level of #if blocks. -pp_space = ignore # ignore/add/remove/force +pp_space = ignore # ignore/add/remove/force/not_defined # Sets the number of spaces per level added with pp_space. pp_space_count = 0 # unsigned number @@ -2311,10 +3173,16 @@ pp_indent_if = 0 # number # Whether to indent the code between #if, #else and #endif. pp_if_indent_code = false # true/false +# Whether to indent the body of an #if that encompasses all the code in the file. +pp_indent_in_guard = false # true/false + # Whether to indent '#define' at the brace level. If false, these are # indented from column 1. pp_define_at_level = false # true/false +# Whether to indent '#include' at the brace level. +pp_include_at_level = false # true/false + # Whether to ignore the '#define' body while formatting. pp_ignore_define_body = false # true/false @@ -2396,6 +3264,11 @@ use_indent_continue_only_once = false # true/false # false: indentation will be used every time (default) indent_cpp_lambda_only_once = false # true/false +# Whether sp_after_angle takes precedence over sp_inside_fparen. This was the +# historic behavior, but is probably not the desired behavior, so this is off +# by default. +use_sp_after_angle_always = false # true/false + # Whether to apply special formatting for Qt SIGNAL/SLOT macros. Essentially, # this tries to format these so that they match Qt's normalized form (i.e. the # result of QMetaObject::normalizedSignature), which can slightly improve the @@ -2407,10 +3280,39 @@ indent_cpp_lambda_only_once = false # true/false # Default: true use_options_overriding_for_qt_macros = true # true/false +# If true: the form feed character is removed from the list of whitespace +# characters. See https://en.cppreference.com/w/cpp/string/byte/isspace. +use_form_feed_no_more_as_whitespace_character = false # true/false + # # Warn levels - 1: error, 2: warning (default), 3: note # +# (C#) Warning is given if doing tab-to-\t replacement and we have found one +# in a C# verbatim string literal. +# +# Default: 2 +warn_level_tabs_found_in_verbatim_string_literals = 2 # unsigned number + +# Limit the number of loops. +# Used by uncrustify.cpp to exit from infinite loop. +# 0: no limit. +debug_max_number_of_loops = 0 # number + +# Set the number of the line to protocol; +# Used in the function prot_the_line if the 2. parameter is zero. +# 0: nothing protocol. +debug_line_number_to_protocol = 0 # number + +# Set the number of second(s) before terminating formatting the current file, +# 0: no timeout. +# only for linux +debug_timeout = 0 # number + +# Set the number of characters to be printed if the text is too long, +# 0: do not truncate. +debug_truncate = 0 # unsigned number + # Meaning of the settings: # Ignore - do not do any changes # Add - makes sure there is 1 or more space/brace/newline/etc @@ -2426,7 +3328,7 @@ use_options_overriding_for_qt_macros = true # true/false # `set BOOL __AND__ __OR__` # # tokenTypes are defined in src/token_enum.h, use them without the -# 'CT_' prefix: 'CT_BOOL' → 'BOOL' +# 'CT_' prefix: 'CT_BOOL' => 'BOOL' # # # - Token(s) can be treated as type(s) with the 'type' option. @@ -2450,7 +3352,7 @@ use_options_overriding_for_qt_macros = true # true/false # `file_ext CPP .ch .cxx .cpp.in` # # langTypes are defined in uncrusify_types.h in the lang_flag_e enum, use -# them without the 'LANG_' prefix: 'LANG_CPP' → 'CPP' +# them without the 'LANG_' prefix: 'LANG_CPP' => 'CPP' # # # - Custom macro-based indentation can be set up using 'macro-open', @@ -2465,3 +3367,6 @@ use_options_overriding_for_qt_macros = true # true/false # # option(s) with 'not default' value: 0 # + +type QWindow +type QQuickItem diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 4e5d278c..58e52f7a 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -33,7 +33,7 @@ namespace connect( this, &QskTabView::currentIndexChanged, this, &TabView::updateViewPanel ); - } + } protected: void aboutToShow() override @@ -48,7 +48,7 @@ namespace We should have a better way to set individual colors for each tab page background */ - + if ( auto page = dynamic_cast< const ::Page* >( currentItem() ) ) setGradientHint( QskTabView::Page, page->gradient() ); } diff --git a/examples/iotdashboard/LightDisplay.cpp b/examples/iotdashboard/LightDisplay.cpp index 0e349197..7c345a11 100644 --- a/examples/iotdashboard/LightDisplay.cpp +++ b/examples/iotdashboard/LightDisplay.cpp @@ -165,14 +165,15 @@ bool LightDisplay::arcContainsPoint( const QRectF& rect, const QPointF& point ) const int tolerance = 20; // 1. check angle - QPointF circlePos( point.x() - rect.center().x(), - rect.center().y() - point.y() ); + QPointF circlePos( + point.x() - rect.center().x(), + rect.center().y() - point.y() ); const qreal angle = angleFromPoint( rect, point ); const bool angleWithinRange = angleInRange( metrics, angle ) - || angleDiff( angle, metrics.startAngle() ) <= tolerance - || angleDiff( angle, metrics.endAngle() ) <= tolerance; + || angleDiff( angle, metrics.startAngle() ) <= tolerance + || angleDiff( angle, metrics.endAngle() ) <= tolerance; // 2. check whether point is on arc const qreal radiusMax = rect.width() / 2; @@ -181,7 +182,7 @@ bool LightDisplay::arcContainsPoint( const QRectF& rect, const QPointF& point ) const qreal polarRadius = qSqrt( qPow( circlePos.x(), 2 ) + qPow( circlePos.y(), 2 ) ); const bool pointOnArc = ( polarRadius + tolerance ) > radiusMin - && ( polarRadius - tolerance ) < radiusMax; + && ( polarRadius - tolerance ) < radiusMax; bool ret = angleWithinRange && pointOnArc; diff --git a/examples/iotdashboard/LightDisplaySkinlet.cpp b/examples/iotdashboard/LightDisplaySkinlet.cpp index 0219985c..887dee62 100644 --- a/examples/iotdashboard/LightDisplaySkinlet.cpp +++ b/examples/iotdashboard/LightDisplaySkinlet.cpp @@ -33,15 +33,15 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable, QRectF rect = contentsRect; const qreal ticksSpacing = 4; // space between the ticks and the arc - if( subControl == LightDisplay::Groove - || subControl == LightDisplay::Panel ) + if( subControl == LightDisplay::Groove || subControl == LightDisplay::Panel ) { QSizeF textSize = textLabelsSize( display ); QskArcMetrics arcMetrics = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ); const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing; 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 h = contentsRect.height() - 2 * ( arcMetrics.width() + ticksWidth ); @@ -52,24 +52,24 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable, } else if( subControl == LightDisplay::ColdAndWarmArc ) { - const QRectF panelRect = subControlRect( skinnable, contentsRect, - LightDisplay::Panel ); + const QRectF panelRect = subControlRect( skinnable, contentsRect, LightDisplay::Panel ); auto barWidth = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ).width(); auto rect = panelRect.marginsAdded( { barWidth, barWidth, barWidth, barWidth } ); return rect; } else if( subControl == LightDisplay::Tickmarks ) { - const QRectF arcRect = subControlRect( skinnable, contentsRect, - LightDisplay::ColdAndWarmArc ); - const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing; - const QRectF rect = arcRect.marginsAdded( { ticksWidth, ticksWidth, ticksWidth, ticksWidth } ); + const QRectF arcRect = subControlRect( + skinnable, contentsRect, LightDisplay::ColdAndWarmArc ); + const qreal ticksWidth = display->arcMetricsHint( + LightDisplay::Tickmarks ).width() + ticksSpacing; + const QRectF rect = + arcRect.marginsAdded( { ticksWidth, ticksWidth, ticksWidth, ticksWidth } ); return rect; } else if( subControl == LightDisplay::ValueText ) { - QRectF valueTextRect = subControlRect( skinnable, contentsRect, - LightDisplay::Panel ); + QRectF valueTextRect = subControlRect( skinnable, contentsRect, LightDisplay::Panel ); const QFontMetricsF fm( skinnable->effectiveFont( subControl ) ); const qreal fontWidth = fm.width( QStringLiteral( "100 %" ) ); const QPointF center = valueTextRect.center(); @@ -175,7 +175,7 @@ QSGNode* LightDisplaySkinlet::updateSubNode( int tickLineWidth = display->metric( LightDisplay::Tickmarks ); ticksNode->update( color, ticksRect, arcMetrics, boundaries, - tickmarks, tickLineWidth, Qt::Horizontal ); + tickmarks, tickLineWidth, Qt::Horizontal ); return ticksNode; } diff --git a/examples/iotdashboard/ShadowedBox.cpp b/examples/iotdashboard/ShadowedBox.cpp index 1422d087..92f2f2d7 100644 --- a/examples/iotdashboard/ShadowedBox.cpp +++ b/examples/iotdashboard/ShadowedBox.cpp @@ -125,7 +125,7 @@ QColor ShadowedBox::shadowColor() const return m_shadowColor; } -QRectF ShadowedBox::layoutRectForSize( const QSizeF &size ) const +QRectF ShadowedBox::layoutRectForSize( const QSizeF& size ) const { auto padding = paddingHint( Panel ); return { padding.left() / 2, padding.top() / 2, diff --git a/examples/iotdashboard/nodes/BoxShadowNode.cpp b/examples/iotdashboard/nodes/BoxShadowNode.cpp index dee3da36..db9ea9fd 100644 --- a/examples/iotdashboard/nodes/BoxShadowNode.cpp +++ b/examples/iotdashboard/nodes/BoxShadowNode.cpp @@ -46,9 +46,9 @@ namespace 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; - 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; }; diff --git a/playground/grids/main.cpp b/playground/grids/main.cpp index b16c5fd0..40dd8a8a 100644 --- a/playground/grids/main.cpp +++ b/playground/grids/main.cpp @@ -391,7 +391,7 @@ int main( int argc, char** argv ) #if 1 /* - we don't need the fonts, but by calling something from + we don't need the fonts, but by calling something from the support library initializations regarding the skins are loaded. TODO ... */ diff --git a/playground/shadows/BoxShadowNode.cpp b/playground/shadows/BoxShadowNode.cpp index f1a5ef1a..5cd25712 100644 --- a/playground/shadows/BoxShadowNode.cpp +++ b/playground/shadows/BoxShadowNode.cpp @@ -46,9 +46,9 @@ namespace 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; - 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; }; diff --git a/src/common/QskArcMetrics.h b/src/common/QskArcMetrics.h index 2ff493ee..f1bee7eb 100644 --- a/src/common/QskArcMetrics.h +++ b/src/common/QskArcMetrics.h @@ -24,7 +24,7 @@ class QSK_EXPORT QskArcMetrics public: constexpr QskArcMetrics() noexcept; constexpr QskArcMetrics( qreal width, qreal startAngle, qreal spanAngle, - Qt::SizeMode = Qt::AbsoluteSize ) noexcept; + Qt::SizeMode = Qt::AbsoluteSize ) noexcept; bool operator==( const QskArcMetrics& ) const noexcept; bool operator!=( const QskArcMetrics& ) const noexcept; diff --git a/src/common/QskBoxHints.cpp b/src/common/QskBoxHints.cpp index a2f4db05..9f18e9f7 100644 --- a/src/common/QskBoxHints.cpp +++ b/src/common/QskBoxHints.cpp @@ -36,17 +36,17 @@ QskBoxHints QskBoxHints::interpolated( } #ifndef QT_NO_DEBUG_STREAM - + #include QDebug operator<<( QDebug debug, const QskBoxHints& hints ) -{ +{ debug << hints.shape << hints.borderMetrics << hints.borderColors << hints.gradient; return debug; } - + #endif #include "moc_QskBoxHints.cpp" diff --git a/src/common/QskFunctions.cpp b/src/common/QskFunctions.cpp index ded47fa5..d61ab688 100644 --- a/src/common/QskFunctions.cpp +++ b/src/common/QskFunctions.cpp @@ -122,7 +122,7 @@ QRectF qskValidOrEmptyInnerRect( const QRectF& rect, const QMarginsF& margins ) 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 ) return from; @@ -138,7 +138,7 @@ QRectF qskInterpolatedRect( const QRectF &from, const QRectF &to, qreal progress 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 ) return from; diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 247369cb..5ac0554f 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -70,7 +70,7 @@ static inline bool qskIsVisible( const QskGradientStops& stops ) const auto& c = stop.color(); if ( c.isValid() && c.alpha() > 0 ) return true; - } + } return false; } @@ -182,7 +182,7 @@ static inline QskGradientStops qskExtractedStops( static inline QskGradientStops qskGradientStops( const QGradientStops& qtStops ) { QskGradientStops stops; - + for ( const auto& s : qtStops ) stops += QskGradientStop( s.first, s.second ); diff --git a/src/controls/QskEvent.cpp b/src/controls/QskEvent.cpp index e349e619..fb09bca5 100644 --- a/src/controls/QskEvent.cpp +++ b/src/controls/QskEvent.cpp @@ -92,7 +92,7 @@ qreal qskWheelSteps( const QWheelEvent* event ) const auto angleDelta = event->angleDelta(); const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); - return delta / QWheelEvent::DefaultDeltasPerStep; + return delta / QWheelEvent::DefaultDeltasPerStep; } qreal qskWheelIncrement( const QWheelEvent* event ) @@ -109,7 +109,7 @@ qreal qskWheelIncrement( const QWheelEvent* event ) angleDelta.setY( -angleDelta.y() ); const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); - return delta / QWheelEvent::DefaultDeltasPerStep; + return delta / QWheelEvent::DefaultDeltasPerStep; } #endif @@ -119,7 +119,7 @@ bool qskIsStandardKeyInput( const QKeyEvent* event, QKeySequence::StandardKey ke #if 1 return event->matches( key ); #else - constexpr auto mask = ~(Qt::KeypadModifier | Qt::GroupSwitchModifier); + constexpr auto mask = ~( Qt::KeypadModifier | Qt::GroupSwitchModifier ); // We should route this call through the skin. TODO const auto theme = QGuiApplicationPrivate::platformTheme(); diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index e6ae839d..7e61f9a7 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -278,14 +278,14 @@ void QskMenu::traverse( int steps ) if ( hasAnimationHint( Cursor | QskAspect::Position | QskAspect::Metric ) ) { - // when cycling we want slide in + // when cycling we want slide in if ( index < 0 ) setPositionHint( Cursor, count() ); if ( index >= count() ) setPositionHint( Cursor, -1 ); - + movePositionHint( Cursor, newIndex ); } diff --git a/src/controls/QskMenuSkinlet.cpp b/src/controls/QskMenuSkinlet.cpp index cd29b528..ee8c0565 100644 --- a/src/controls/QskMenuSkinlet.cpp +++ b/src/controls/QskMenuSkinlet.cpp @@ -52,7 +52,8 @@ class QskMenuSkinlet::PrivateData { m_data->enableCache( false ); } - private: + + private: PrivateData* m_data; }; diff --git a/src/controls/QskPageIndicator.cpp b/src/controls/QskPageIndicator.cpp index 50ff5b82..0b7f89f0 100644 --- a/src/controls/QskPageIndicator.cpp +++ b/src/controls/QskPageIndicator.cpp @@ -29,10 +29,10 @@ static int qskKeyIncrement( if ( key == Qt::Key_Left ) return mirrored ? 1 : -1; - + if ( key == Qt::Key_Right ) return mirrored ? -1 : 1; - } + } else { if ( key == Qt::Key_Up ) @@ -40,10 +40,10 @@ static int qskKeyIncrement( if ( key == Qt::Key_Down ) return 1; - } - + } + return 0; -} +} class QskPageIndicator::PrivateData @@ -145,8 +145,8 @@ qreal QskPageIndicator::valueRatioAt( int index ) const const qreal diff = 1.0 - std::abs( pos - index ); return std::max( diff, 0.0 ); - } - + } + return 0.0; } @@ -205,7 +205,7 @@ void QskPageIndicator::mouseReleaseEvent( QMouseEvent* event ) if ( indexAtPosition( pos ) == index ) Q_EMIT pageRequested( index ); } - + return; } diff --git a/src/controls/QskPageIndicatorSkinlet.cpp b/src/controls/QskPageIndicatorSkinlet.cpp index adc4b715..90a7b52c 100644 --- a/src/controls/QskPageIndicatorSkinlet.cpp +++ b/src/controls/QskPageIndicatorSkinlet.cpp @@ -44,7 +44,7 @@ static QRectF qskBulletRect( const QskPageIndicator* indicator, { const auto maxWidth = n * size.width() + ( n - 1 ) * spacing; const auto r = qskAlignedRectF( rect, maxWidth, size.height(), alignment ); - + x = r.x() + index * ( size.width() + spacing ); y = r.y(); } @@ -52,7 +52,7 @@ static QRectF qskBulletRect( const QskPageIndicator* indicator, { const auto maxHeight = n * size.height() + ( n - 1 ) * spacing; const auto r = qskAlignedRectF( rect, maxHeight, size.height(), alignment ); - + x = r.x(); y = r.y() + index * ( size.height() + spacing );; } diff --git a/src/controls/QskPopup.cpp b/src/controls/QskPopup.cpp index 0c06b00e..49533dbd 100644 --- a/src/controls/QskPopup.cpp +++ b/src/controls/QskPopup.cpp @@ -382,7 +382,7 @@ bool QskPopup::hasFaderEffect() const void QskPopup::setPopupFlags( PopupFlags flags ) { - if ( static_cast(flags) != m_data->flags ) + if ( static_cast< int >( flags ) != m_data->flags ) { m_data->flags = flags; updateInputGrabber(); @@ -654,7 +654,7 @@ int QskPopup::execPopup() if ( popup->isOpen() || popup->isFading() ) return; } - + QEventLoop::exit( 0 ); } }; @@ -679,10 +679,10 @@ int QskPopup::execPopup() } if ( auto mouseGrabber = window()->mouseGrabberItem() ) - { + { // when being called from QQuickWindow::mouseReleaseEvent // the mouse grabber has not yet been released. - + if( !qskIsAncestorOf( this, mouseGrabber ) ) qskUngrabMouse( mouseGrabber ); } diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 9c9d8726..5c4cc850 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -209,8 +209,7 @@ static inline QskAspect qskSubstitutedAspect( if ( aspect.hasStates() ) { qWarning() << "QskSkinnable::(re)setSkinHint: setting hints with states " - "is discouraged - use QskSkinTableEditor if you are " - "sure, that you need this."; + "is discouraged - use QskSkinTableEditor if you are sure, that you need this."; qWarning() << "QskAspect:" << aspect.stateless() << skinnable->skinStatesAsPrintable( aspect.states() ); diff --git a/src/dialogs/QskDialogButtonBox.cpp b/src/dialogs/QskDialogButtonBox.cpp index f15bcc6f..c54ab6e8 100644 --- a/src/dialogs/QskDialogButtonBox.cpp +++ b/src/dialogs/QskDialogButtonBox.cpp @@ -572,8 +572,8 @@ bool QskDialogButtonBox::isDefaultButtonKeyEvent( const QKeyEvent* event ) } else { - return ( event->key() == Qt::Key_Enter ) || - ( event->key() == Qt::Key_Return ); + return ( event->key() == Qt::Key_Enter ) + || ( event->key() == Qt::Key_Return ); } } diff --git a/src/inputpanel/QskHunspellTextPredictor.cpp b/src/inputpanel/QskHunspellTextPredictor.cpp index 5e7e920b..ecea9a9c 100644 --- a/src/inputpanel/QskHunspellTextPredictor.cpp +++ b/src/inputpanel/QskHunspellTextPredictor.cpp @@ -19,7 +19,8 @@ class QskHunspellTextPredictor::PrivateData QLocale locale; }; -QskHunspellTextPredictor::QskHunspellTextPredictor( const QLocale &locale, QObject* object ) +QskHunspellTextPredictor::QskHunspellTextPredictor( + const QLocale& locale, QObject* object ) : Inherited( object ) , m_data( new PrivateData() ) { @@ -43,7 +44,8 @@ void QskHunspellTextPredictor::reset() } } -QPair< QString, QString > QskHunspellTextPredictor::affAndDicFile( const QString& path, const QLocale& locale ) +QPair< QString, QString > QskHunspellTextPredictor::affAndDicFile( + const QString& path, const QLocale& locale ) { QString prefix = QStringLiteral( "%1/%2" ).arg( path, locale.name() ); QString affFile = prefix + QStringLiteral( ".aff" ); @@ -63,7 +65,7 @@ void QskHunspellTextPredictor::loadDictionaries() { QString userPaths = QString::fromUtf8( qgetenv( "QSK_HUNSPELL_PATH" ) ); -#if defined(Q_OS_WIN32) +#if defined( Q_OS_WIN32 ) QChar separator( ';' ); QStringList defaultPaths; #else @@ -106,7 +108,7 @@ void QskHunspellTextPredictor::request( const QString& text ) char** suggestions; - QTextCodec *codec = QTextCodec::codecForName( m_data->hunspellEncoding ); + const auto codec = QTextCodec::codecForName( m_data->hunspellEncoding ); const QByteArray word = codec ? codec->fromUnicode( text ) : text.toUtf8(); const int count = Hunspell_suggest( diff --git a/src/inputpanel/QskInputContext.cpp b/src/inputpanel/QskInputContext.cpp index 2087eb28..98b5eaf6 100644 --- a/src/inputpanel/QskInputContext.cpp +++ b/src/inputpanel/QskInputContext.cpp @@ -318,7 +318,7 @@ QskInputContextFactory* QskInputContext::factory() const return m_data->factory; } -std::shared_ptr QskInputContext::textPredictor( const QLocale& locale ) +std::shared_ptr< QskTextPredictor > QskInputContext::textPredictor( const QLocale& locale ) { if ( m_data->factory ) return m_data->factory->setupPredictor( locale ); @@ -550,12 +550,12 @@ std::shared_ptr< QskTextPredictor > QskInputContextFactory::setupPredictor( cons QskTextPredictor* QskInputContextFactory::createPredictor( const QLocale& locale ) { #if HUNSPELL - return new QskHunspellTextPredictor( locale ); + return new QskHunspellTextPredictor( locale ); #else Q_UNUSED( locale ); #endif - return nullptr; + return nullptr; } QskInputPanel* QskInputContextFactory::createPanel() const diff --git a/src/inputpanel/QskInputPanel.cpp b/src/inputpanel/QskInputPanel.cpp index bcad0e63..be5c4268 100644 --- a/src/inputpanel/QskInputPanel.cpp +++ b/src/inputpanel/QskInputPanel.cpp @@ -369,10 +369,7 @@ QskInputPanel::QskInputPanel( QQuickItem* parent ) this, &QskInputPanel::updateLocale ); connect( &m_data->keyProcessor, &KeyProcessor::keyProcessingFinished, - this, [this]( const Result& result ) - { - m_data->handleKeyProcessingFinished( result ); - } ); + this, [this]( const Result& result ) { m_data->handleKeyProcessingFinished( result ); } ); updateLocale( locale() ); } @@ -489,9 +486,9 @@ void QskInputPanel::resetPredictor( const QLocale& locale ) { // text predictor lives in another thread, so these will all be QueuedConnections: connect( this, &QskInputPanel::predictionReset, - predictor.get(), &QskTextPredictor::reset ); + predictor.get(), &QskTextPredictor::reset ); connect( this, &QskInputPanel::predictionRequested, - predictor.get(), &QskTextPredictor::request ); + predictor.get(), &QskTextPredictor::request ); connect( predictor.get(), &QskTextPredictor::predictionChanged, this, &QskInputPanel::updatePrediction ); diff --git a/src/inputpanel/QskInputPanel.h b/src/inputpanel/QskInputPanel.h index 66bd74c8..71381bc0 100644 --- a/src/inputpanel/QskInputPanel.h +++ b/src/inputpanel/QskInputPanel.h @@ -53,7 +53,7 @@ class QSK_EXPORT QskInputPanel : public QskControl virtual void attachItem( QQuickItem* ) = 0; private: - void updatePrediction( const QString &text, const QStringList &candidates ); + void updatePrediction( const QString&, const QStringList& candidates ); void resetPredictor( const QLocale& ); void updateLocale( const QLocale& ); diff --git a/src/nodes/QskBoxNode.cpp b/src/nodes/QskBoxNode.cpp index 586157ba..4e9847c6 100644 --- a/src/nodes/QskBoxNode.cpp +++ b/src/nodes/QskBoxNode.cpp @@ -118,7 +118,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( isFillMonochrome && isBorderMonochrome ) { if ( borderColors.gradient( Qsk::Left ).startColor() - == fillGradient.startColor() ) + == fillGradient.startColor() ) { // we can draw border and background in one hasBorder = false; diff --git a/src/nodes/QskBoxRendererEllipse.cpp b/src/nodes/QskBoxRendererEllipse.cpp index 2877e30e..a5dd34f9 100644 --- a/src/nodes/QskBoxRendererEllipse.cpp +++ b/src/nodes/QskBoxRendererEllipse.cpp @@ -561,9 +561,10 @@ namespace { } - void addAdditionalLines( float x11, float y11, float x12, float y12, // start line - float x21,float y21, float x22, float y22, // end line - const QskGradient& gradient, Line* lines ) + void addAdditionalLines( + float x11, float y11, float x12, float y12, // start line + float x21, float y21, float x22, float y22, // end line + const QskGradient& gradient, Line* lines ) { int additionalStopCount = additionalGradientStops( gradient ); @@ -712,35 +713,37 @@ namespace if( additionalGradientStops( borderMapTR.gradient() ) > 0 ) { float x1TR = c[ TopRight ].centerX + v.dx1( TopRight ), - y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), - x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), - y2TR = c[ TopRight ].centerY - v.dy2( TopRight ), + y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), + x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), + y2TR = c[ TopRight ].centerY - v.dy2( TopRight ), - x1TL = c[ TopLeft ].centerX - v.dx1( TopLeft ), - y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), - x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), - y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ); + x1TL = c[ TopLeft ].centerX - v.dx1( TopLeft ), + y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), + x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), + y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ); - addAdditionalLines( x1TR, y1TR, x2TR, y2TR, - x1TL, y1TL, x2TL, y2TL, - borderMapTR.gradient(), linesTR + k ); + addAdditionalLines( + x1TR, y1TR, x2TR, y2TR, + x1TL, y1TL, x2TL, y2TL, + borderMapTR.gradient(), linesTR + k ); } if( additionalGradientStops( borderMapBL.gradient() ) > 0 ) { float x1BL = c[ BottomLeft ].centerX - v.dx1( BottomLeft ), - y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), - x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), - y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ), + y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), + x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), + y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ), - x1BR = c[ BottomRight ].centerX + v.dx1( BottomRight ), - y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), - x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), - y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ); + x1BR = c[ BottomRight ].centerX + v.dx1( BottomRight ), + y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), + x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), + y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ); - addAdditionalLines( x1BL, y1BL, x2BL, y2BL, - x1BR, y1BR, x2BR, y2BR, - borderMapBL.gradient(), linesBL + k ); + addAdditionalLines( + x1BL, y1BL, x2BL, y2BL, + x1BR, y1BR, x2BR, y2BR, + borderMapBL.gradient(), linesBL + k ); } } @@ -749,35 +752,37 @@ namespace if( additionalGradientStops( borderMapTL.gradient() ) > 0 ) { float x1TL = c[ TopLeft ].centerX - v.dx1( TopLeft ), - y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), - x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), - y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ), + y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), + x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), + y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ), - x1BL = c[ BottomLeft ].centerX - v.dx1( BottomLeft ), - y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), - x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), - y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ); + x1BL = c[ BottomLeft ].centerX - v.dx1( BottomLeft ), + y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), + x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), + y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ); - addAdditionalLines( x1TL, y1TL, x2TL, y2TL, - x1BL, y1BL, x2BL, y2BL, - borderMapTL.gradient(), linesTL + j ); + addAdditionalLines( + x1TL, y1TL, x2TL, y2TL, + x1BL, y1BL, x2BL, y2BL, + borderMapTL.gradient(), linesTL + j ); } if( additionalGradientStops( borderMapBR.gradient() ) > 0 ) { float x1BR = c[ BottomRight ].centerX + v.dx1( BottomRight ), - y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), - x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), - y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ), + y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), + x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), + y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ), - x1TR = c[ TopRight ].centerX + v.dx1( TopRight ), - y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), - x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), - y2TR = c[ TopRight ].centerY - v.dy2( TopRight ); + x1TR = c[ TopRight ].centerX + v.dx1( TopRight ), + y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), + x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), + y2TR = c[ TopRight ].centerY - v.dy2( TopRight ); - addAdditionalLines( x1BR, y1BR, x2BR, y2BR, - x1TR, y1TR, x2TR, y2TR, - borderMapBR.gradient(), linesBR + j ); + addAdditionalLines( + x1BR, y1BR, x2BR, y2BR, + x1TR, y1TR, x2TR, y2TR, + borderMapBR.gradient(), linesBR + j ); } } } @@ -1011,17 +1016,13 @@ static inline void qskRenderBorder( const QskBoxRenderer::Metrics& metrics, const int stepCount = metrics.corner[ 0 ].stepCount; auto left = c.gradient( Qsk::Left ), top = c.gradient( Qsk::Top ), - right = c.gradient( Qsk::Right ), bottom = c.gradient( Qsk::Bottom ); + right = c.gradient( Qsk::Right ), bottom = c.gradient( Qsk::Bottom ); qskRenderBorderLines( metrics, orientation, line, - BorderMapGradient( stepCount, qskRgbGradientStart( top ), - qskRgbGradientEnd( left ), left ), - BorderMapGradient( stepCount, qskRgbGradientStart( right ), - qskRgbGradientEnd( top ), top ), - BorderMapGradient( stepCount, qskRgbGradientStart( left ), - qskRgbGradientEnd( bottom ), bottom ), - BorderMapGradient( stepCount, qskRgbGradientStart( bottom ), - qskRgbGradientEnd( right ), right ) ); + BorderMapGradient( stepCount, qskRgbGradientStart( top ), qskRgbGradientEnd( left ), left ), + BorderMapGradient( stepCount, qskRgbGradientStart( right ), qskRgbGradientEnd( top ), top ), + BorderMapGradient( stepCount, qskRgbGradientStart( left ), qskRgbGradientEnd( bottom ), bottom ), + BorderMapGradient( stepCount, qskRgbGradientStart( bottom ), qskRgbGradientEnd( right ), right ) ); } } @@ -1071,16 +1072,12 @@ static inline void qskRenderBoxRandom( const int n = metrics.corner[ 0 ].stepCount; auto left = bc.gradient( Qsk::Left ), top = bc.gradient( Qsk::Top ), - right = bc.gradient( Qsk::Right ), bottom = bc.gradient( Qsk::Bottom ); + right = bc.gradient( Qsk::Right ), bottom = bc.gradient( Qsk::Bottom ); - const BorderMapGradient tl( n, qskRgbGradientStart( top.startColor() ), - qskRgbGradientEnd( left.endColor() ), left ); - const BorderMapGradient tr( n, qskRgbGradientStart( right ), - qskRgbGradientEnd( top ), top ); - const BorderMapGradient bl( n, qskRgbGradientStart( left ), - qskRgbGradientEnd( bottom ), bottom ); - const BorderMapGradient br( n, qskRgbGradientStart( bottom ), - qskRgbGradientEnd( right ), right ); + const BorderMapGradient tl( n, qskRgbGradientStart( top.startColor() ), qskRgbGradientEnd( left.endColor() ), left ); + const BorderMapGradient tr( n, qskRgbGradientStart( right ), qskRgbGradientEnd( top ), top ); + const BorderMapGradient bl( n, qskRgbGradientStart( left ), qskRgbGradientEnd( bottom ), bottom ); + const BorderMapGradient br( n, qskRgbGradientStart( bottom ), qskRgbGradientEnd( right ), right ); if ( gradient.isMonochrome() ) { diff --git a/src/nodes/QskBoxRendererRect.cpp b/src/nodes/QskBoxRendererRect.cpp index fd4d6706..13d22cd8 100644 --- a/src/nodes/QskBoxRendererRect.cpp +++ b/src/nodes/QskBoxRendererRect.cpp @@ -623,9 +623,14 @@ void QskBoxRenderer::renderRect( auto fillLines = line + fillLineCount; if ( bc.isMonochrome() ) - qskCreateBorderMonochrome( rect, in, bc.gradient( Qsk::Left ).startColor().rgba(), fillLines ); + { + const auto rgb = bc.gradient( Qsk::Left ).startColor().rgba(); + qskCreateBorderMonochrome( rect, in, rgb, fillLines ); + } else + { qskCreateBorder( rect, in, bc, fillLines ); + } } } From 9be4562d8f138f8d7d2bac5dbfcaf3baf37064a8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 23 Mar 2022 14:43:05 +0100 Subject: [PATCH 016/107] compiler errors for Qt6 fixed --- src/inputpanel/QskHunspellTextPredictor.cpp | 126 ++++++++++++++++---- src/inputpanel/QskHunspellTextPredictor.h | 3 +- 2 files changed, 103 insertions(+), 26 deletions(-) diff --git a/src/inputpanel/QskHunspellTextPredictor.cpp b/src/inputpanel/QskHunspellTextPredictor.cpp index ecea9a9c..77099176 100644 --- a/src/inputpanel/QskHunspellTextPredictor.cpp +++ b/src/inputpanel/QskHunspellTextPredictor.cpp @@ -1,15 +1,91 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + #include "QskHunspellTextPredictor.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + +#include + +namespace +{ + class StringConverter + { + public: + StringConverter( const QByteArray& encoding ) + : m_codec( QTextCodec::codecForName( encoding ) ) + { + } + + inline QString fromHunspell( const char* text ) const + { + if ( m_codec ) + return m_codec->toUnicode( text ); + + return QString::fromUtf8( text ); + } + + inline QByteArray toHunspell( const QString& text ) const + { + if ( m_codec ) + return m_codec->fromUnicode( text ); + + return text.toUtf8(); + } + private: + QTextCodec* m_codec; + }; +} + +#else + +#include + +namespace +{ + class StringConverter + { + public: + StringConverter( const QByteArray& encoding ) + : m_decoder( encoding ) + , m_encoder( encoding ) + { + } + + inline QString fromHunspell( const char* text ) const + { + if ( m_decoder.isValid() ) + return m_decoder.decode( text ); + + return QString::fromUtf8( text ); + } + + inline QByteArray toHunspell( const QString& text ) const + { + if ( m_encoder.isValid() ) + return m_encoder.encode( text ); + + return text.toUtf8(); + } + + private: + mutable QStringDecoder m_decoder; + mutable QStringEncoder m_encoder; + }; +} + +#endif + class QskHunspellTextPredictor::PrivateData { public: @@ -63,19 +139,21 @@ QPair< QString, QString > QskHunspellTextPredictor::affAndDicFile( void QskHunspellTextPredictor::loadDictionaries() { - QString userPaths = QString::fromUtf8( qgetenv( "QSK_HUNSPELL_PATH" ) ); - -#if defined( Q_OS_WIN32 ) - QChar separator( ';' ); - QStringList defaultPaths; + const auto splitBehavior = +#if QT_VERSION >= QT_VERSION_CHECK( 5, 14, 0 ) + Qt::SkipEmptyParts; #else - QChar separator( ':' ); - QStringList defaultPaths = { QStringLiteral( "/usr/share/hunspell" ), - QStringLiteral( "/usr/share/myspell/dicts" ) }; + QString::SkipEmptyParts; #endif - QStringList paths = userPaths.split( separator, QString::SkipEmptyParts ); - paths.append( defaultPaths ); + const auto userPaths = QString::fromUtf8( qgetenv( "QSK_HUNSPELL_PATH" ) ); + + auto paths = userPaths.split( QDir::listSeparator(), splitBehavior ); + +#if !defined( Q_OS_WIN32 ) + paths += QStringLiteral( "/usr/share/hunspell" ); + paths += QStringLiteral( "/usr/share/myspell/dicts" ); +#endif for( const auto& path : paths ) { @@ -106,21 +184,19 @@ void QskHunspellTextPredictor::request( const QString& text ) return; } + StringConverter converter( m_data->hunspellEncoding ); + char** suggestions; - const auto codec = QTextCodec::codecForName( m_data->hunspellEncoding ); - const QByteArray word = codec ? codec->fromUnicode( text ) : text.toUtf8(); - - const int count = Hunspell_suggest( - m_data->hunspellHandle, &suggestions, word.constData() ); + const int count = Hunspell_suggest( m_data->hunspellHandle, + &suggestions, converter.toHunspell( text ).constData() ); QStringList candidates; candidates.reserve( count ); for ( int i = 0; i < count; i++ ) { - const QString suggestion = codec ? codec->toUnicode( suggestions[ i ] ) - : QString::fromUtf8( suggestions [ i ] ); + const auto suggestion = converter.fromHunspell( suggestions[ i ] ); if ( suggestion.startsWith( text ) ) candidates.prepend( suggestion ); @@ -133,3 +209,5 @@ void QskHunspellTextPredictor::request( const QString& text ) m_data->candidates = candidates; Q_EMIT predictionChanged( text, m_data->candidates ); } + +#include "moc_QskHunspellTextPredictor.cpp" diff --git a/src/inputpanel/QskHunspellTextPredictor.h b/src/inputpanel/QskHunspellTextPredictor.h index 610f83e7..e2dab1d9 100644 --- a/src/inputpanel/QskHunspellTextPredictor.h +++ b/src/inputpanel/QskHunspellTextPredictor.h @@ -8,8 +8,7 @@ #include "QskTextPredictor.h" -#include - +#include #include class QSK_EXPORT QskHunspellTextPredictor : public QskTextPredictor From f44208213c3956a803fab648ecef3e297a304955 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 23 Mar 2022 15:39:17 +0100 Subject: [PATCH 017/107] Squashed commit of the following: commit 547927f937a3260d5b23068f06cd181de9b7c763 Author: Uwe Rathmann Date: Wed Mar 23 15:38:40 2022 +0100 wip commit ca06b1da4bf9c5b30ef2857f0b6c1e4fb137a64e Author: Uwe Rathmann Date: Wed Mar 23 15:30:31 2022 +0100 using private classes commit 4977b0afa481039f22b64e7f55262be8053a26c2 Author: Uwe Rathmann Date: Wed Mar 23 15:18:20 2022 +0100 avoid using private Qt headers in examples --- examples/iotdashboard/LightDisplaySkinlet.cpp | 26 +++---- .../nodes/RadialTickmarksNode.cpp | 68 ++++++------------- .../iotdashboard/nodes/RadialTickmarksNode.h | 18 +++-- src/nodes/QskBoxNode.cpp | 59 +++++++++++----- src/nodes/QskBoxNode.h | 7 +- 5 files changed, 89 insertions(+), 89 deletions(-) diff --git a/examples/iotdashboard/LightDisplaySkinlet.cpp b/examples/iotdashboard/LightDisplaySkinlet.cpp index 887dee62..fd560cf8 100644 --- a/examples/iotdashboard/LightDisplaySkinlet.cpp +++ b/examples/iotdashboard/LightDisplaySkinlet.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -125,8 +126,7 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable, QSGNode* LightDisplaySkinlet::updateSubNode( 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 ) { @@ -166,16 +166,16 @@ QSGNode* LightDisplaySkinlet::updateSubNode( if ( ticksNode == nullptr ) ticksNode = new RadialTickmarksNode(); - QColor color = display->color( LightDisplay::Tickmarks ); - QRectF ticksRect = display->subControlRect( LightDisplay::Tickmarks ); - QskArcMetrics 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 ); + const auto color = display->color( LightDisplay::Tickmarks ); + const auto ticksRect = display->subControlRect( LightDisplay::Tickmarks ); + const auto arcMetrics = display->arcMetricsHint( LightDisplay::Tickmarks ); - ticksNode->update( color, ticksRect, arcMetrics, boundaries, - tickmarks, tickLineWidth, Qt::Horizontal ); + QskScaleTickmarks tickmarks; + 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; } @@ -207,11 +207,11 @@ QSGNode* LightDisplaySkinlet::updateSubNode( QSizeF LightDisplaySkinlet::textLabelsSize( const LightDisplay* display ) const { - QFont font = display->effectiveFont( LightDisplay::LeftLabel ); - QFontMetricsF fm( font ); + const QFontMetricsF fm( display->effectiveFont( LightDisplay::LeftLabel ) ); qreal w = fm.width( QStringLiteral( " 100" ) ); qreal h = fm.height(); + return { w, h }; } diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp index cb5d7449..b148bc60 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp @@ -5,78 +5,50 @@ #include "RadialTickmarksNode.h" -#include +#include +#include #include -QSK_QT_PRIVATE_BEGIN -#include -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 ) - { - geometry.setDrawingMode( QSGGeometry::DrawLines ); - geometry.setVertexDataPattern( QSGGeometry::StaticPattern ); - } - - QSGGeometry geometry; - QSGFlatColorMaterial material; - - QskIntervalF boundaries; - QskScaleTickmarks tickmarks; - - QRectF rect; - int lineWidth = 0; - - uint hash = 0; -}; - RadialTickmarksNode::RadialTickmarksNode() - : QSGGeometryNode( *new RadialTickmarksNodePrivate ) + : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) { - Q_D( RadialTickmarksNode ); + m_geometry.setDrawingMode( QSGGeometry::DrawLines ); + m_geometry.setVertexDataPattern( QSGGeometry::StaticPattern ); - setGeometry( &d->geometry ); - setMaterial( &d->material ); + setGeometry( &m_geometry ); + setMaterial( &m_material ); } RadialTickmarksNode::~RadialTickmarksNode() { } -void RadialTickmarksNode::update(const QColor& color, const QRectF& rect, - const QskArcMetrics& arcMetrics, const QskIntervalF& /*boundaries*/, - const QskScaleTickmarks& tickmarks, int lineWidth, - Qt::Orientation /*orientation*/ ) +void RadialTickmarksNode::update( const QColor& color, const QRectF& rect, + const QskArcMetrics& arcMetrics, const QskScaleTickmarks& tickmarks, int lineWidth ) { - Q_D( RadialTickmarksNode ); - - if( lineWidth != d->lineWidth ) + if( lineWidth != m_lineWidth ) { - d->lineWidth = lineWidth; - d->geometry.setLineWidth( lineWidth ); + m_lineWidth = lineWidth; + m_geometry.setLineWidth( lineWidth ); markDirty( QSGNode::DirtyGeometry ); } const uint hash = tickmarks.hash( 17435 ); - if( ( hash != d->hash ) || ( rect != d->rect ) ) + if( ( hash != m_hash ) || ( rect != m_rect ) ) { - d->hash = hash; - d->rect = rect; + m_hash = hash; + m_rect = rect; - d->geometry.allocate( tickmarks.tickCount() * 2 ); - auto vertexData = d->geometry.vertexDataAsPoint2D(); + m_geometry.allocate( tickmarks.tickCount() * 2 ); + auto vertexData = m_geometry.vertexDataAsPoint2D(); const auto center = rect.center(); const auto radius = 0.5 * rect.width(); @@ -113,13 +85,13 @@ void RadialTickmarksNode::update(const QColor& color, const QRectF& rect, } } - d->geometry.markVertexDataDirty(); + m_geometry.markVertexDataDirty(); markDirty( QSGNode::DirtyGeometry ); } - if ( color != d->material.color() ) + if ( color != m_material.color() ) { - d->material.setColor( color ); + m_material.setColor( color ); markDirty( QSGNode::DirtyMaterial ); } } diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.h b/examples/iotdashboard/nodes/RadialTickmarksNode.h index 27fc82a9..2244cdd9 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.h +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.h @@ -5,13 +5,13 @@ #pragma once -#include #include -#include #include +#include -class RadialTickmarksNodePrivate; +class QskArcMetrics; +class QskScaleTickmarks; class RadialTickmarksNode : public QSGGeometryNode { @@ -19,9 +19,15 @@ class RadialTickmarksNode : public QSGGeometryNode RadialTickmarksNode(); ~RadialTickmarksNode() override; - void update( const QColor&, const QRectF&, const QskArcMetrics&, - const QskIntervalF&, const QskScaleTickmarks&, int, Qt::Orientation ); + void update( const QColor&, const QRectF&, + const QskArcMetrics&, const QskScaleTickmarks&, int lineWidth ); private: - Q_DECLARE_PRIVATE( RadialTickmarksNode ) + QSGGeometry m_geometry; + QSGFlatColorMaterial m_material; + + QRectF m_rect; + int m_lineWidth = 0; + + uint m_hash = 0; }; diff --git a/src/nodes/QskBoxNode.cpp b/src/nodes/QskBoxNode.cpp index 4e9847c6..59ac1343 100644 --- a/src/nodes/QskBoxNode.cpp +++ b/src/nodes/QskBoxNode.cpp @@ -14,6 +14,10 @@ #include #include +QSK_QT_PRIVATE_BEGIN +#include +QSK_QT_PRIVATE_END + Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialVertex ) static inline uint qskMetricsHash( @@ -33,13 +37,28 @@ static inline uint qskColorsHash( return fillGradient.hash( hash ); } -QskBoxNode::QskBoxNode() - : m_metricsHash( 0 ) - , m_colorsHash( 0 ) - , m_geometry( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ) +class QskBoxNodePrivate final : public QSGGeometryNodePrivate { + public: + QskBoxNodePrivate() + : geometry( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ) + { + } + + uint metricsHash = 0; + uint colorsHash = 0; + QRectF rect; + + QSGGeometry geometry; +}; + +QskBoxNode::QskBoxNode() + : QSGGeometryNode( *new QskBoxNodePrivate ) +{ + Q_D( QskBoxNode ); + setMaterial( qskMaterialVertex ); - setGeometry( &m_geometry ); + setGeometry( &d->geometry ); } QskBoxNode::~QskBoxNode() @@ -58,6 +77,8 @@ void QskBoxNode::setBoxData( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, const QskBoxBorderColors& borderColors, const QskGradient& gradient ) { + Q_D( QskBoxNode ); + QskGradient fillGradient = gradient; #if 1 // Renderer is buggy for monochrome gradients with stops. TODO ... @@ -71,15 +92,15 @@ void QskBoxNode::setBoxData( const QRectF& rect, const uint metricsHash = qskMetricsHash( shape, borderMetrics ); const uint colorsHash = qskColorsHash( borderColors, fillGradient ); - if ( ( metricsHash == m_metricsHash ) && - ( colorsHash == m_colorsHash ) && ( rect == m_rect ) ) + if ( ( metricsHash == d->metricsHash ) && + ( colorsHash == d->colorsHash ) && ( rect == d->rect ) ) { return; } - m_metricsHash = metricsHash; - m_colorsHash = colorsHash; - m_rect = rect; + d->metricsHash = metricsHash; + d->colorsHash = colorsHash; + d->rect = rect; markDirty( QSGNode::DirtyMaterial ); markDirty( QSGNode::DirtyGeometry ); @@ -87,7 +108,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( rect.isEmpty() ) { - m_geometry.allocate( 0 ); + d->geometry.allocate( 0 ); return; } @@ -106,7 +127,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( !hasBorder && !hasFill ) { - m_geometry.allocate( 0 ); + d->geometry.allocate( 0 ); return; } @@ -155,7 +176,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, { setMonochrome( false ); - renderer.renderBox( m_rect, shape, borderMetrics, + renderer.renderBox( d->rect, shape, borderMetrics, borderColors, fillGradient, *geometry() ); } else @@ -168,12 +189,12 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( hasFill ) { flatMaterial->setColor( fillGradient.startColor() ); - renderer.renderFill( m_rect, shape, QskBoxBorderMetrics(), *geometry() ); + renderer.renderFill( d->rect, shape, QskBoxBorderMetrics(), *geometry() ); } else { flatMaterial->setColor( borderColors.gradient( Qsk::Left ).startColor().rgba() ); - renderer.renderBorder( m_rect, shape, borderMetrics, *geometry() ); + renderer.renderBorder( d->rect, shape, borderMetrics, *geometry() ); } } } @@ -185,14 +206,16 @@ void QskBoxNode::setMonochrome( bool on ) if ( on == ( material != qskMaterialVertex ) ) return; - m_geometry.allocate( 0 ); + Q_D( QskBoxNode ); + + d->geometry.allocate( 0 ); if ( on ) { setMaterial( new QSGFlatColorMaterial() ); const QSGGeometry g( QSGGeometry::defaultAttributes_Point2D(), 0 ); - memcpy( ( void* ) &m_geometry, ( void* ) &g, sizeof( QSGGeometry ) ); + memcpy( ( void* ) &d->geometry, ( void* ) &g, sizeof( QSGGeometry ) ); } else { @@ -200,6 +223,6 @@ void QskBoxNode::setMonochrome( bool on ) delete material; const QSGGeometry g( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ); - memcpy( ( void* ) &m_geometry, ( void* ) &g, sizeof( QSGGeometry ) ); + memcpy( ( void* ) &d->geometry, ( void* ) &g, sizeof( QSGGeometry ) ); } } diff --git a/src/nodes/QskBoxNode.h b/src/nodes/QskBoxNode.h index 77ae0b82..5aa9bab4 100644 --- a/src/nodes/QskBoxNode.h +++ b/src/nodes/QskBoxNode.h @@ -14,6 +14,8 @@ class QskBoxBorderMetrics; class QskBoxBorderColors; class QskGradient; +class QskBoxNodePrivate; + class QSK_EXPORT QskBoxNode : public QSGGeometryNode { public: @@ -29,11 +31,8 @@ class QSK_EXPORT QskBoxNode : public QSGGeometryNode private: void setMonochrome( bool on ); - uint m_metricsHash; - uint m_colorsHash; - QRectF m_rect; + Q_DECLARE_PRIVATE( QskBoxNode ) - QSGGeometry m_geometry; }; #endif From 24e8c28d9ec94ffa5ef329351b81feb163b3215a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 07:59:02 +0100 Subject: [PATCH 018/107] unused code removed --- src/controls/QskPageIndicatorSkinlet.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/controls/QskPageIndicatorSkinlet.cpp b/src/controls/QskPageIndicatorSkinlet.cpp index 90a7b52c..6b57eda2 100644 --- a/src/controls/QskPageIndicatorSkinlet.cpp +++ b/src/controls/QskPageIndicatorSkinlet.cpp @@ -10,15 +10,6 @@ #include "QskSGNode.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, const QRectF& rect, int index ) { From 63a9eb1a6a84746d6b99067b6563ea4d947b68fe Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 07:59:28 +0100 Subject: [PATCH 019/107] rong return statement removed --- src/layouts/QskIndexedLayoutBox.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/QskIndexedLayoutBox.cpp b/src/layouts/QskIndexedLayoutBox.cpp index bf6e23f9..b7a81f4f 100644 --- a/src/layouts/QskIndexedLayoutBox.cpp +++ b/src/layouts/QskIndexedLayoutBox.cpp @@ -83,7 +83,7 @@ void QskIndexedLayoutBox::itemChange( } } - return Inherited::itemChange( change, value ); + Inherited::itemChange( change, value ); } void QskIndexedLayoutBox::reparentItem( QQuickItem* item ) From 12a3476e7171f1e6b14c5207bbeb9a8269e0a80a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:01:52 +0100 Subject: [PATCH 020/107] return code for all remove operations --- src/controls/QskSkinHintTableEditor.cpp | 34 ++++++++++---------- src/controls/QskSkinHintTableEditor.h | 42 ++++++++++++------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/controls/QskSkinHintTableEditor.cpp b/src/controls/QskSkinHintTableEditor.cpp index ea88434a..91fc8f78 100644 --- a/src/controls/QskSkinHintTableEditor.cpp +++ b/src/controls/QskSkinHintTableEditor.cpp @@ -244,10 +244,10 @@ void QskSkinHintTableEditor::setPosition( setMetricHint( aspectPosition( aspect ), position, combination ); } -void QskSkinHintTableEditor::removePosition( +bool QskSkinHintTableEditor::removePosition( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectPosition( aspect ), combination ); + return removeMetricHint( aspectPosition( aspect ), combination ); } qreal QskSkinHintTableEditor::position( QskAspect aspect ) const @@ -268,10 +268,10 @@ void QskSkinHintTableEditor::setStrutSize( QSizeF( width, height ), combination ); } -void QskSkinHintTableEditor::removeStrutSize( +bool QskSkinHintTableEditor::removeStrutSize( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectStrutSize( aspect ), combination ); + return removeMetricHint( aspectStrutSize( aspect ), combination ); } QSizeF QskSkinHintTableEditor::strutSize( QskAspect aspect ) const @@ -293,10 +293,10 @@ void QskSkinHintTableEditor::setMargin( QskAspect aspect, setMetricHint( aspectMargin( aspect ), margins, combination ); } -void QskSkinHintTableEditor::removeMargin( +bool QskSkinHintTableEditor::removeMargin( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectMargin( aspect ), combination ); + return removeMetricHint( aspectMargin( aspect ), combination ); } QskMargins QskSkinHintTableEditor::margin( QskAspect aspect ) const @@ -319,10 +319,10 @@ void QskSkinHintTableEditor::setPadding( QskAspect aspect, setMetricHint( aspectPadding( aspect ), padding, combination ); } -void QskSkinHintTableEditor::removePadding( +bool QskSkinHintTableEditor::removePadding( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectPadding( aspect ), combination ); + return removeMetricHint( aspectPadding( aspect ), combination ); } QskMargins QskSkinHintTableEditor::padding( QskAspect aspect ) const @@ -336,10 +336,10 @@ void QskSkinHintTableEditor::setSpacing( setMetricHint( aspectSpacing( aspect ), spacing, combination ); } -void QskSkinHintTableEditor::removeSpacing( +bool QskSkinHintTableEditor::removeSpacing( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectSpacing( aspect ), combination ); + return removeMetricHint( aspectSpacing( aspect ), combination ); } qreal QskSkinHintTableEditor::spacing( QskAspect aspect ) const @@ -354,7 +354,7 @@ void QskSkinHintTableEditor::setAlignment( static_cast< int >( alignment ), combination ); } -void QskSkinHintTableEditor::removeAlignment( +bool QskSkinHintTableEditor::removeAlignment( QskAspect aspect, QskStateCombination combination ) { return removeFlagHint( aspectAlignment( aspect ), combination ); @@ -371,7 +371,7 @@ void QskSkinHintTableEditor::setFontRole( setFlagHint( aspectFontRole( aspect ), fontRole, combination ); } -void QskSkinHintTableEditor::removeFontRole( +bool QskSkinHintTableEditor::removeFontRole( QskAspect aspect, QskStateCombination combination ) { return removeFlagHint( aspectFontRole( aspect ), combination ); @@ -388,7 +388,7 @@ void QskSkinHintTableEditor::setGraphicRole( setFlagHint( aspectGraphicRole( aspect ), graphicRole, combination ); } -void QskSkinHintTableEditor::removeGraphicRole( +bool QskSkinHintTableEditor::removeGraphicRole( QskAspect aspect, QskStateCombination combination ) { return removeFlagHint( aspectGraphicRole( aspect ), combination ); @@ -421,7 +421,7 @@ void QskSkinHintTableEditor::setBoxShape( setMetricHint( aspectShape( aspect ), shape, combination ); } -void QskSkinHintTableEditor::removeBoxShape( +bool QskSkinHintTableEditor::removeBoxShape( QskAspect aspect, QskStateCombination combination ) { return removeMetricHint( aspectShape( aspect ), combination ); @@ -453,7 +453,7 @@ void QskSkinHintTableEditor::setBoxBorderMetrics( setMetricHint( aspectBorder( aspect ), borderMetrics, combination ); } -void QskSkinHintTableEditor::removeBoxBorderMetric( +bool QskSkinHintTableEditor::removeBoxBorderMetric( QskAspect aspect, QskStateCombination combination ) { return removeMetricHint( aspectBorder( aspect ), combination ); @@ -480,7 +480,7 @@ void QskSkinHintTableEditor::setBoxBorderColors(QskAspect aspect, combination ); } -void QskSkinHintTableEditor::removeBoxBorderColors( +bool QskSkinHintTableEditor::removeBoxBorderColors( QskAspect aspect, QskStateCombination combination ) { return removeColorHint( aspectBorder( aspect ), combination ); @@ -504,7 +504,7 @@ void QskSkinHintTableEditor::setArcMetrics( QskAspect aspect, setMetricHint( aspectShape( aspect ), arcMetrics, combination ); } -void QskSkinHintTableEditor::removeArcMetrics( QskAspect aspect, +bool QskSkinHintTableEditor::removeArcMetrics( QskAspect aspect, QskStateCombination combination ) { return removeMetricHint( aspectShape( aspect ), combination ); diff --git a/src/controls/QskSkinHintTableEditor.h b/src/controls/QskSkinHintTableEditor.h index a6845d35..ce1b25cc 100644 --- a/src/controls/QskSkinHintTableEditor.h +++ b/src/controls/QskSkinHintTableEditor.h @@ -63,7 +63,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > void setFlagHint( QskAspect, const T&, QskStateCombination = QskStateCombination() ); - void removeFlagHint( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeFlagHint( QskAspect, QskStateCombination = QskStateCombination() ); QVariant flagHint( QskAspect ) const; template< typename T > T flagHint( QskAspect ) const; @@ -76,7 +76,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > void setMetricHint( QskAspect, const T&, QskStateCombination = QskStateCombination() ); - void removeMetricHint( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeMetricHint( QskAspect, QskStateCombination = QskStateCombination() ); QVariant metricHint( QskAspect ) const; template< typename T > T metricHint( QskAspect ) const; @@ -89,7 +89,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > void setColorHint( QskAspect, const T&, QskStateCombination = QskStateCombination() ); - void removeColorHint( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeColorHint( QskAspect, QskStateCombination = QskStateCombination() ); QVariant colorHint( QskAspect ) const; template< typename T > T colorHint( QskAspect ) const; @@ -126,7 +126,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setPosition( QskAspect, qreal, QskStateCombination = QskStateCombination() ); - void removePosition( QskAspect, QskStateCombination = QskStateCombination() ); + bool removePosition( QskAspect, QskStateCombination = QskStateCombination() ); qreal position( QskAspect ) const; @@ -138,7 +138,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setStrutSize( QskAspect, qreal width, qreal height, QskStateCombination = QskStateCombination() ); - void removeStrutSize( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeStrutSize( QskAspect, QskStateCombination = QskStateCombination() ); QSizeF strutSize( QskAspect ) const; @@ -151,7 +151,7 @@ class QSK_EXPORT QskSkinHintTableEditor qreal left, qreal top, qreal right, qreal bottom, QskStateCombination = QskStateCombination() ); - void removeMargin( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeMargin( QskAspect, QskStateCombination = QskStateCombination() ); QskMargins margin( QskAspect ) const; @@ -164,32 +164,32 @@ class QSK_EXPORT QskSkinHintTableEditor qreal left, qreal top, qreal right, qreal bottom, QskStateCombination = QskStateCombination() ); - void removePadding( QskAspect, QskStateCombination = QskStateCombination() ); + bool removePadding( QskAspect, QskStateCombination = QskStateCombination() ); QskMargins padding( QskAspect ) const; // spacing void setSpacing( QskAspect, qreal, QskStateCombination = QskStateCombination() ); - void removeSpacing( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeSpacing( QskAspect, QskStateCombination = QskStateCombination() ); qreal spacing( QskAspect ) const; // alignment void setAlignment( QskAspect, Qt::Alignment, QskStateCombination = QskStateCombination() ); - void removeAlignment( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeAlignment( QskAspect, QskStateCombination = QskStateCombination() ); Qt::Alignment alignment( QskAspect ) const; // fontRole void setFontRole( QskAspect, int, QskStateCombination = QskStateCombination() ); - void removeFontRole( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeFontRole( QskAspect, QskStateCombination = QskStateCombination() ); int fontRole( QskAspect ) const; // graphicRole void setGraphicRole( QskAspect, int, QskStateCombination = QskStateCombination() ); - void removeGraphicRole( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeGraphicRole( QskAspect, QskStateCombination = QskStateCombination() ); int graphicRole( QskAspect ) const; // boxShape @@ -202,7 +202,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setBoxShape( QskAspect, const QskBoxShapeMetrics&, QskStateCombination = QskStateCombination() ); - void removeBoxShape( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeBoxShape( QskAspect, QskStateCombination = QskStateCombination() ); QskBoxShapeMetrics boxShape( QskAspect ) const; @@ -217,7 +217,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setBoxBorderMetrics( QskAspect, const QskBoxBorderMetrics&, QskStateCombination = QskStateCombination() ); - void removeBoxBorderMetric( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeBoxBorderMetric( QskAspect, QskStateCombination = QskStateCombination() ); QskBoxBorderMetrics boxBorderMetrics( QskAspect ) const; @@ -231,7 +231,7 @@ class QSK_EXPORT QskSkinHintTableEditor const QskGradient& right, const QskGradient& bottom, QskStateCombination = QskStateCombination() ); - void removeBoxBorderColors( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeBoxBorderColors( QskAspect, QskStateCombination = QskStateCombination() ); QskBoxBorderColors boxBorderColors( QskAspect ) const; // arcMetrics @@ -241,7 +241,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setArcMetrics( QskAspect, const QskArcMetrics&, QskStateCombination = QskStateCombination() ); - void removeArcMetrics( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeArcMetrics( QskAspect, QskStateCombination = QskStateCombination() ); QskArcMetrics arcMetrics( QskAspect ) const; @@ -294,10 +294,10 @@ inline void QskSkinHintTableEditor::setFlagHint( setHint( aspect | QskAspect::Flag, hint, combination ); } -inline void QskSkinHintTableEditor::removeFlagHint( +inline bool QskSkinHintTableEditor::removeFlagHint( QskAspect aspect, QskStateCombination combination ) { - removeHint( aspect | QskAspect::Flag, combination ); + return removeHint( aspect | QskAspect::Flag, combination ); } inline QVariant QskSkinHintTableEditor::flagHint( QskAspect aspect ) const @@ -326,10 +326,10 @@ inline void QskSkinHintTableEditor::setMetricHint( setHint( aspect | QskAspect::Metric, hint, combination ); } -inline void QskSkinHintTableEditor::removeMetricHint( +inline bool QskSkinHintTableEditor::removeMetricHint( QskAspect aspect, QskStateCombination combination ) { - removeHint( aspect | QskAspect::Metric, combination ); + return removeHint( aspect | QskAspect::Metric, combination ); } inline QVariant QskSkinHintTableEditor::metricHint( QskAspect aspect ) const @@ -358,10 +358,10 @@ inline void QskSkinHintTableEditor::setColorHint( setHint( aspect | QskAspect::Color, hint, combination ); } -inline void QskSkinHintTableEditor::removeColorHint( +inline bool QskSkinHintTableEditor::removeColorHint( QskAspect aspect, QskStateCombination combination ) { - removeHint( aspect | QskAspect::Color, combination ); + return removeHint( aspect | QskAspect::Color, combination ); } inline QVariant QskSkinHintTableEditor::colorHint( QskAspect aspect ) const From 057866e7ff65663f7fcafe736214e29bf9c16015 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:08:40 +0100 Subject: [PATCH 021/107] disable copying --- src/controls/QskGesture.h | 2 ++ src/controls/QskSkinTransition.h | 2 ++ src/graphic/QskGraphicImageProvider.h | 2 ++ src/graphic/QskGraphicTextureFactory.h | 2 ++ src/nodes/QskScaleRenderer.h | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/controls/QskGesture.h b/src/controls/QskGesture.h index 008bcd5c..a10f7b3c 100644 --- a/src/controls/QskGesture.h +++ b/src/controls/QskGesture.h @@ -52,6 +52,8 @@ class QSK_EXPORT QskGesture inline State state() const { return m_state; } protected: + Q_DISABLE_COPY( QskGesture ) + QskGesture( Type type ); const Type m_type; diff --git a/src/controls/QskSkinTransition.h b/src/controls/QskSkinTransition.h index 540f4456..5174569b 100644 --- a/src/controls/QskSkinTransition.h +++ b/src/controls/QskSkinTransition.h @@ -44,6 +44,8 @@ class QSK_EXPORT QskSkinTransition virtual void updateSkin( QskSkin*, QskSkin* ); private: + Q_DISABLE_COPY( QskSkinTransition ) + QskSkin* m_skins[ 2 ]; QskAnimationHint m_animationHint; Type m_mask : 2; diff --git a/src/graphic/QskGraphicImageProvider.h b/src/graphic/QskGraphicImageProvider.h index cc7ed2e0..ce1657da 100644 --- a/src/graphic/QskGraphicImageProvider.h +++ b/src/graphic/QskGraphicImageProvider.h @@ -32,6 +32,8 @@ class QSK_EXPORT QskGraphicImageProvider : public QQuickImageProvider const QskGraphic* requestGraphic( const QString& id ) const; private: + Q_DISABLE_COPY( QskGraphicImageProvider ) + const QString m_providerId; }; diff --git a/src/graphic/QskGraphicTextureFactory.h b/src/graphic/QskGraphicTextureFactory.h index 61be41ef..0a250bfd 100644 --- a/src/graphic/QskGraphicTextureFactory.h +++ b/src/graphic/QskGraphicTextureFactory.h @@ -35,6 +35,8 @@ class QSK_EXPORT QskGraphicTextureFactory : public QQuickTextureFactory QImage image() const override; private: + Q_DISABLE_COPY( QskGraphicTextureFactory ) + QskGraphic m_graphic; QskColorFilter m_colorFilter; QSize m_size; diff --git a/src/nodes/QskScaleRenderer.h b/src/nodes/QskScaleRenderer.h index b17a9d55..3d29505b 100644 --- a/src/nodes/QskScaleRenderer.h +++ b/src/nodes/QskScaleRenderer.h @@ -52,6 +52,8 @@ class QSK_EXPORT QskScaleRenderer const QRectF& labelsRect, QSGNode* node ) const; private: + Q_DISABLE_COPY( QskScaleRenderer ) + Qt::Orientation m_orientation = Qt::Horizontal; QskIntervalF m_boundaries; From 80a42f6d56e8f0a4d09b5ad0fe30f3d00bdfb991 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:09:30 +0100 Subject: [PATCH 022/107] using reference parameters --- src/nodes/QskVertex.cpp | 6 +++--- src/nodes/QskVertex.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/nodes/QskVertex.cpp b/src/nodes/QskVertex.cpp index ff741668..7916b3e0 100644 --- a/src/nodes/QskVertex.cpp +++ b/src/nodes/QskVertex.cpp @@ -22,7 +22,7 @@ QDebug operator<<( QDebug debug, Color color ) return debug; } -QDebug operator<<( QDebug debug, ColoredLine line ) +QDebug operator<<( QDebug debug, const ColoredLine& line ) { qDebug() << qRound( line.p1.x ) << qRound( line.p1.y ) << "->" << qRound( line.p2.x ) << qRound( line.p2.y ); @@ -30,7 +30,7 @@ QDebug operator<<( QDebug debug, ColoredLine line ) return debug; } -QDebug operator<<( QDebug debug, Line line ) +QDebug operator<<( QDebug debug, const Line& line ) { qDebug() << qRound( line.p1.x ) << qRound( line.p1.y ) << "->" << qRound( line.p2.x ) << qRound( line.p2.y ); @@ -41,7 +41,7 @@ QDebug operator<<( QDebug debug, Line line ) #endif template< class Line > -static inline void qskDebugGeometry( Line* lines, int count ) +static inline void qskDebugGeometry( const Line* lines, int count ) { #ifndef QT_NO_DEBUG_STREAM for ( int i = 0; i < count; i++ ) diff --git a/src/nodes/QskVertex.h b/src/nodes/QskVertex.h index f1874bbd..0700d0ae 100644 --- a/src/nodes/QskVertex.h +++ b/src/nodes/QskVertex.h @@ -170,8 +170,8 @@ namespace QskVertex #ifndef QT_NO_DEBUG_STREAM class QDebug; QDebug operator<<( QDebug debug, QskVertex::Color ); -QDebug operator<<( QDebug debug, QskVertex::ColoredLine ); -QDebug operator<<( QDebug debug, QskVertex::Line ); +QDebug operator<<( QDebug debug, const QskVertex::ColoredLine& ); +QDebug operator<<( QDebug debug, const QskVertex::Line& ); #endif #endif From 44ca6c964f52ade0e621408f0c7c80cb7dd11f34 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:10:04 +0100 Subject: [PATCH 023/107] Q_EMIT added --- src/controls/QskMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index 7e61f9a7..06168bfc 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -114,7 +114,7 @@ void QskMenu::addOption( const QUrl& graphicSource, const QString& text ) update(); if ( isComponentComplete() ) - countChanged( count() ); + Q_EMIT countChanged( count() ); } void QskMenu::addOption( const QString& graphicSource, const QString& text ) From eaa554addcf1e32efe498313fe8c62157cf12bf9 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:10:29 +0100 Subject: [PATCH 024/107] using reference parameter --- src/controls/QskTextInput.cpp | 2 +- src/controls/QskTextInput.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controls/QskTextInput.cpp b/src/controls/QskTextInput.cpp index b16b8e7c..d355638a 100644 --- a/src/controls/QskTextInput.cpp +++ b/src/controls/QskTextInput.cpp @@ -802,7 +802,7 @@ QVariant QskTextInput::inputMethodQuery( } QVariant QskTextInput::inputMethodQuery( - Qt::InputMethodQuery query, QVariant argument ) const + Qt::InputMethodQuery query, const QVariant& argument ) const { switch ( query ) { diff --git a/src/controls/QskTextInput.h b/src/controls/QskTextInput.h index c4a798eb..e738879f 100644 --- a/src/controls/QskTextInput.h +++ b/src/controls/QskTextInput.h @@ -144,7 +144,7 @@ class QSK_EXPORT QskTextInput : public QskControl bool fixup(); 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 canRedo() const; From c963ec7deb22433e838e4c4040fe5815b937b771 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:10:57 +0100 Subject: [PATCH 025/107] beautified --- src/controls/QskWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 0be35d4a..ce84b881 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -128,6 +128,7 @@ static inline QByteArray qskVisualizationMode( const QQuickWindow* window ) return d->customRenderMode; #endif } + class QskWindowPrivate : public QQuickWindowPrivate { Q_DECLARE_PUBLIC( QskWindow ) From 95dab4301d20840d80d9b8f8c7caa6c341e56eee Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:11:29 +0100 Subject: [PATCH 026/107] using c++11 --- src/dialogs/QskDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dialogs/QskDialog.cpp b/src/dialogs/QskDialog.cpp index e8913895..f243c3fb 100644 --- a/src/dialogs/QskDialog.cpp +++ b/src/dialogs/QskDialog.cpp @@ -47,7 +47,7 @@ static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox static QskDialog::DialogCode qskExec( QskDialogWindow* dialogWindow ) { #if 1 - QskFocusIndicator* focusIndicator = new QskFocusIndicator(); + auto focusIndicator = new QskFocusIndicator(); focusIndicator->setObjectName( QStringLiteral( "DialogFocusIndicator" ) ); dialogWindow->addItem( focusIndicator ); #endif @@ -60,7 +60,7 @@ static QQuickWindow* qskSomeQuickWindow() // not the best code ever, but as it is a fallback only // maybe we should also add the stacking order - QWindowList windows = QGuiApplication::topLevelWindows(); + const auto windows = QGuiApplication::topLevelWindows(); for ( auto window : windows ) { if ( window->isVisible() ) From 9fe277122540ee6f0783a8c235d15af1176f4abe Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:18:15 +0100 Subject: [PATCH 027/107] class moved to anonymous namespace --- src/inputpanel/QskInputPanel.cpp | 318 ++++++++++++++++--------------- 1 file changed, 160 insertions(+), 158 deletions(-) diff --git a/src/inputpanel/QskInputPanel.cpp b/src/inputpanel/QskInputPanel.cpp index be5c4268..308bb484 100644 --- a/src/inputpanel/QskInputPanel.cpp +++ b/src/inputpanel/QskInputPanel.cpp @@ -106,193 +106,195 @@ static inline void qskSendKey( QQuickItem* receiver, int key ) QCoreApplication::sendEvent( receiver, &keyRelease ); } -class KeyProcessor : public QObject +namespace { - Q_OBJECT - - public: - QString preedit() const + class KeyProcessor : public QObject { - return m_preedit; - } + Q_OBJECT - void processKey( - int key, Qt::InputMethodHints inputHints, QskInputPanel* panel, - QskTextPredictor* predictor, int spaceLeft ) - { - // reset: - m_currentResult.isFinal = true; - m_currentResult.text.clear(); - m_currentResult.key = 0; - - m_predictor = predictor; - m_spaceLeft = spaceLeft; - - // First we have to handle the control keys - - switch ( key ) + public: + QString preedit() const { - case Qt::Key_Backspace: - case Qt::Key_Muhenkan: + return m_preedit; + } + + void processKey( + int key, Qt::InputMethodHints inputHints, QskInputPanel* panel, + QskTextPredictor* predictor, int spaceLeft ) + { + // reset: + m_currentResult.isFinal = true; + m_currentResult.text.clear(); + m_currentResult.key = 0; + + m_predictor = predictor; + m_spaceLeft = spaceLeft; + + // First we have to handle the control keys + + switch ( key ) { - if ( predictor && !m_preedit.isEmpty() ) + case Qt::Key_Backspace: + case Qt::Key_Muhenkan: { - m_preedit.chop( 1 ); - - m_currentResult.text = m_preedit; - m_currentResult.isFinal = false; - - Q_EMIT panel->predictionRequested( m_preedit ); - // Let the input field update right away, otherwise - // we'll get weird effects with fast backspace presses: - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - else - { - m_currentResult.key = Qt::Key_Backspace; - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - - break; - } - case Qt::Key_Return: - { - if ( predictor ) - { - if ( !m_preedit.isEmpty() ) + if ( predictor && !m_preedit.isEmpty() ) { - if ( spaceLeft ) - { - m_currentResult.text = m_preedit.left( spaceLeft ); - m_currentResult.isFinal = true; - } - - reset(); - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - } - - if ( !( inputHints & Qt::ImhMultiLine ) ) - { - m_currentResult.key = Qt::Key_Return; - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - - break; - } - case Qt::Key_Space: - { - if ( predictor ) - { - if ( !m_preedit.isEmpty() && spaceLeft ) - { - m_preedit += keyString( key ); - m_preedit = m_preedit.left( spaceLeft ); + m_preedit.chop( 1 ); m_currentResult.text = m_preedit; - m_currentResult.isFinal = true; - - reset(); + m_currentResult.isFinal = false; + Q_EMIT panel->predictionRequested( m_preedit ); + // Let the input field update right away, otherwise + // we'll get weird effects with fast backspace presses: Q_EMIT keyProcessingFinished( m_currentResult ); return; } + else + { + m_currentResult.key = Qt::Key_Backspace; + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + + break; } + case Qt::Key_Return: + { + if ( predictor ) + { + if ( !m_preedit.isEmpty() ) + { + if ( spaceLeft ) + { + m_currentResult.text = m_preedit.left( spaceLeft ); + m_currentResult.isFinal = true; + } - break; + reset(); + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + } + + if ( !( inputHints & Qt::ImhMultiLine ) ) + { + m_currentResult.key = Qt::Key_Return; + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + + break; + } + case Qt::Key_Space: + { + if ( predictor ) + { + if ( !m_preedit.isEmpty() && spaceLeft ) + { + m_preedit += keyString( key ); + m_preedit = m_preedit.left( spaceLeft ); + + m_currentResult.text = m_preedit; + m_currentResult.isFinal = true; + + reset(); + + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + } + + break; + } + case Qt::Key_Left: + case Qt::Key_Right: + case Qt::Key_Escape: + case Qt::Key_Cancel: + { + m_currentResult.key = key; + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } } - case Qt::Key_Left: - case Qt::Key_Right: - case Qt::Key_Escape: - case Qt::Key_Cancel: + + const QString text = keyString( key ); + + if ( predictor ) { - m_currentResult.key = key; - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - } - - const QString text = keyString( key ); - - if ( predictor ) - { - m_preedit += text; - Q_EMIT panel->predictionRequested( m_preedit ); - } - else - { - m_currentResult.text = text; - m_currentResult.isFinal = true; - Q_EMIT keyProcessingFinished( m_currentResult ); - } - } - - void reset() - { - m_preedit.clear(); - } - - void continueProcessingKey( const QStringList& candidates ) - { - if ( m_predictor ) - { - if ( candidates.count() > 0 ) - { - m_currentResult.text = m_preedit; - m_currentResult.isFinal = false; + m_preedit += text; + Q_EMIT panel->predictionRequested( m_preedit ); } else { - m_currentResult.text = m_preedit.left( m_spaceLeft ); + m_currentResult.text = text; m_currentResult.isFinal = true; - - m_preedit.clear(); + Q_EMIT keyProcessingFinished( m_currentResult ); } } - Q_EMIT keyProcessingFinished( m_currentResult ); - } - - Q_SIGNALS: - void keyProcessingFinished( const Result& result ); - - private: - inline QString keyString( int keyCode ) const - { - // Special case entry codes here, else default to the symbol - switch ( keyCode ) + void reset() { - case Qt::Key_Shift: - case Qt::Key_CapsLock: - case Qt::Key_Mode_switch: - case Qt::Key_Backspace: - case Qt::Key_Muhenkan: - return QString(); - - case Qt::Key_Return: - case Qt::Key_Kanji: - return QChar( QChar::CarriageReturn ); - - case Qt::Key_Space: - return QChar( QChar::Space ); - - default: - break; + m_preedit.clear(); } - return QChar( keyCode ); - } + void continueProcessingKey( const QStringList& candidates ) + { + if ( m_predictor ) + { + if ( candidates.count() > 0 ) + { + m_currentResult.text = m_preedit; + m_currentResult.isFinal = false; + } + else + { + m_currentResult.text = m_preedit.left( m_spaceLeft ); + m_currentResult.isFinal = true; - QString m_preedit; - int m_spaceLeft = -1; - QskTextPredictor* m_predictor = nullptr; - Result m_currentResult; -}; + m_preedit.clear(); + } + } + Q_EMIT keyProcessingFinished( m_currentResult ); + } + + Q_SIGNALS: + void keyProcessingFinished( const Result& ); + + private: + inline QString keyString( int keyCode ) const + { + // Special case entry codes here, else default to the symbol + switch ( keyCode ) + { + case Qt::Key_Shift: + case Qt::Key_CapsLock: + case Qt::Key_Mode_switch: + case Qt::Key_Backspace: + case Qt::Key_Muhenkan: + return QString(); + + case Qt::Key_Return: + case Qt::Key_Kanji: + return QChar( QChar::CarriageReturn ); + + case Qt::Key_Space: + return QChar( QChar::Space ); + + default: + break; + } + + return QChar( keyCode ); + } + + QString m_preedit; + int m_spaceLeft = -1; + QskTextPredictor* m_predictor = nullptr; + Result m_currentResult; + }; +} class QskInputPanel::PrivateData { From 107e121d3bfe31e6fb4c5bb7b7427e760ece3e8c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:19:24 +0100 Subject: [PATCH 028/107] using QStringLiteral --- src/inputpanel/QskInputContext.cpp | 2 +- src/inputpanel/QskInputPanelBox.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inputpanel/QskInputContext.cpp b/src/inputpanel/QskInputContext.cpp index 98b5eaf6..4d59d36e 100644 --- a/src/inputpanel/QskInputContext.cpp +++ b/src/inputpanel/QskInputContext.cpp @@ -292,7 +292,7 @@ class QskInputContext::PrivateData QskInputContext::QskInputContext() : m_data( new PrivateData() ) { - setObjectName( "InputContext" ); + setObjectName( QStringLiteral( "InputContext" ) ); } QskInputContext::~QskInputContext() diff --git a/src/inputpanel/QskInputPanelBox.cpp b/src/inputpanel/QskInputPanelBox.cpp index 7bc9f19c..54791995 100644 --- a/src/inputpanel/QskInputPanelBox.cpp +++ b/src/inputpanel/QskInputPanelBox.cpp @@ -22,7 +22,7 @@ namespace : QskTextInput( parentItem ) , m_panelBox( panelBox ) { - setObjectName( "InputBoxProxy" ); + setObjectName( QStringLiteral( "InputBoxProxy" ) ); setFocusPolicy( Qt::NoFocus ); initSizePolicy( QskSizePolicy::Ignored, QskSizePolicy::Fixed ); From e06d213365d407c65f35acada77adce538009166 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:20:05 +0100 Subject: [PATCH 029/107] using const getter --- src/graphic/QskGraphicProviderMap.cpp | 12 ++++++------ src/layouts/QskGridBox.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/graphic/QskGraphicProviderMap.cpp b/src/graphic/QskGraphicProviderMap.cpp index 25b76ba9..a7a49043 100644 --- a/src/graphic/QskGraphicProviderMap.cpp +++ b/src/graphic/QskGraphicProviderMap.cpp @@ -47,8 +47,8 @@ void QskGraphicProviderMap::insert( void QskGraphicProviderMap::remove( const QString& providerId ) { - const auto it = m_data->hashTab.find( qskKey( providerId ) ); - if ( it == m_data->hashTab.end() ) + const auto it = m_data->hashTab.constFind( qskKey( providerId ) ); + if ( it == m_data->hashTab.constEnd() ) delete it.value(); m_data->hashTab.erase( it ); @@ -58,8 +58,8 @@ QskGraphicProvider* QskGraphicProviderMap::take( const QString& providerId ) { QskGraphicProvider* provider = nullptr; - const auto it = m_data->hashTab.find( qskKey( providerId ) ); - if ( it == m_data->hashTab.end() ) + const auto it = m_data->hashTab.constFind( qskKey( providerId ) ); + if ( it == m_data->hashTab.constEnd() ) provider = it.value(); m_data->hashTab.erase( it ); @@ -69,8 +69,8 @@ QskGraphicProvider* QskGraphicProviderMap::take( const QString& providerId ) QskGraphicProvider* QskGraphicProviderMap::provider( const QString& providerId ) const { - const auto it = m_data->hashTab.find( qskKey( providerId ) ); - if ( it == m_data->hashTab.end() ) + const auto it = m_data->hashTab.constFind( qskKey( providerId ) ); + if ( it == m_data->hashTab.constEnd() ) return nullptr; if ( it.value().isNull() ) diff --git a/src/layouts/QskGridBox.cpp b/src/layouts/QskGridBox.cpp index f5d49516..40548887 100644 --- a/src/layouts/QskGridBox.cpp +++ b/src/layouts/QskGridBox.cpp @@ -79,7 +79,7 @@ static void qskUpdateFocusChain( } else { - const auto itemLast = box->childItems().last(); + const auto itemLast = box->childItems().constLast(); if ( itemLast != item ) item->stackAfter( itemLast ); } From 9d515ba68ee4d0c0402c97954a7242d4deb4933f Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:27:17 +0100 Subject: [PATCH 030/107] pointless QObject inheritance removed --- src/common/QskObjectCounter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/QskObjectCounter.cpp b/src/common/QskObjectCounter.cpp index 61d6b6ec..b6f8b585 100644 --- a/src/common/QskObjectCounter.cpp +++ b/src/common/QskObjectCounter.cpp @@ -70,7 +70,7 @@ namespace int maximum; }; - class CounterData final : public QObject + class CounterData { public: Counter counter[ 2 ]; From cc21fec43684b18add187d2f2e4fffb20e35fca8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:41:11 +0100 Subject: [PATCH 031/107] using qAsConst --- src/controls/QskQuick.cpp | 2 +- src/controls/QskSkinlet.cpp | 2 +- src/layouts/QskStackBox.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controls/QskQuick.cpp b/src/controls/QskQuick.cpp index b4dabdc4..6f71bca4 100644 --- a/src/controls/QskQuick.cpp +++ b/src/controls/QskQuick.cpp @@ -637,7 +637,7 @@ void qskItemUpdateRecursive( QQuickItem* item ) 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() ) { diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index 8dda9f18..9e2b7a35 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -263,7 +263,7 @@ void QskSkinlet::updateNode( QskSkinnable* skinnable, QSGNode* parentNode ) cons replaceChildNode( DebugRole, parentNode, oldNode, newNode ); } - for ( const auto nodeRole : m_data->nodeRoles ) + for ( const auto nodeRole : qAsConst( m_data->nodeRoles ) ) { Q_ASSERT( nodeRole < FirstReservedRole ); diff --git a/src/layouts/QskStackBox.cpp b/src/layouts/QskStackBox.cpp index 7d6a03fc..44206cb4 100644 --- a/src/layouts/QskStackBox.cpp +++ b/src/layouts/QskStackBox.cpp @@ -376,7 +376,7 @@ QSizeF QskStackBox::layoutSizeHint( qreal w = -1.0; qreal h = -1.0; - for ( const auto item : m_data->items ) + for ( const auto item : qAsConst( m_data->items ) ) { /* We ignore the retainSizeWhenVisible flag and include all From 74a09c8f7e1abbcd283baf3c25fca9ef581d34b4 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:42:54 +0100 Subject: [PATCH 032/107] using const method --- src/controls/QskTabBar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controls/QskTabBar.cpp b/src/controls/QskTabBar.cpp index 677d3acf..faac29ca 100644 --- a/src/controls/QskTabBar.cpp +++ b/src/controls/QskTabBar.cpp @@ -219,7 +219,7 @@ namespace inline QskLinearBox* buttonBox() const { - return qobject_cast< QskLinearBox* >( childItems().first() ); + return qobject_cast< QskLinearBox* >( childItems().constFirst() ); } void enableAutoTranslation( bool on ) From 5c62725cd14477333ab00ca3ab36c748d7a47e85 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:45:06 +0100 Subject: [PATCH 033/107] using reference parameters --- src/controls/QskWindow.cpp | 2 +- src/layouts/QskGridLayoutEngine.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index ce84b881..58225125 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -551,7 +551,7 @@ void QskWindow::setCustomRenderMode( const char* mode ) class RenderJob final : public QRunnable { public: - RenderJob( QQuickWindow* window, const QByteArray mode ) + RenderJob( QQuickWindow* window, const QByteArray& mode ) : m_window( window ) , m_mode( mode ) { diff --git a/src/layouts/QskGridLayoutEngine.cpp b/src/layouts/QskGridLayoutEngine.cpp index c092ddd0..f957a491 100644 --- a/src/layouts/QskGridLayoutEngine.cpp +++ b/src/layouts/QskGridLayoutEngine.cpp @@ -116,7 +116,7 @@ namespace private: inline bool setValueAt( int pos, - const std::function< bool( Setting& ) > modify ) + const std::function< bool( Setting& ) >& modify ) { if ( pos < 0 ) return false; From e0792beb5f55b31f44978cd2aa33815f7fa2a5b2 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:49:49 +0100 Subject: [PATCH 034/107] unused code removed --- examples/iotdashboard/nodes/RadialTickmarksNode.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp index b148bc60..f6826d1c 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp @@ -9,12 +9,6 @@ #include #include -static constexpr inline qreal qskTickFactor( QskScaleTickmarks::TickType type ) -{ - using TM = QskScaleTickmarks; - return type == TM::MinorTick ? 0.7 : ( type == TM::MinorTick ? 0.85 : 1.0 ); -} - RadialTickmarksNode::RadialTickmarksNode() : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) { From 34425420480e301fbc6bb0e7c5fc1fd13ad78a6b Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:50:28 +0100 Subject: [PATCH 035/107] using const methods --- playground/grids/GridQuick.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/playground/grids/GridQuick.cpp b/playground/grids/GridQuick.cpp index c92c88ef..f10d5a0b 100644 --- a/playground/grids/GridQuick.cpp +++ b/playground/grids/GridQuick.cpp @@ -59,7 +59,7 @@ GridQuick::GridQuick( QWidget* parent ) createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.1\nItem { GridLayout {} }" ); setContent( QUrl(), nullptr, contentItem ); - m_grid = contentItem->childItems().first(); + m_grid = contentItem->childItems().constFirst(); m_grid->setProperty( "rowSpacing", 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 rectangle = layout->childItems().first(); + auto rectangle = layout->childItems().constFirst(); rectangle->setParent( nullptr ); delete layout; From 28907c75d81ba6139046aad5f0df95b81920c06c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 08:50:53 +0100 Subject: [PATCH 036/107] QskStandardSymbol as namespace --- qmlexport/QskQml.cpp | 2 -- src/graphic/QskStandardSymbol.h | 11 +++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/qmlexport/QskQml.cpp b/qmlexport/QskQml.cpp index eefde44e..4cbbd7ea 100644 --- a/qmlexport/QskQml.cpp +++ b/qmlexport/QskQml.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -194,7 +193,6 @@ void QskQml::registerTypes() #endif QSK_REGISTER_GADGET( QskRgbValueQml, "RgbValue" ); - QSK_REGISTER_GADGET( QskStandardSymbol, "StandardSymbol" ); QSK_REGISTER_GADGET( QskBoxBorderMetrics, "BorderMetrics" ); QSK_REGISTER_GADGET( QskBoxShapeMetrics, "Shape" ); QSK_REGISTER_GADGET( QskShadowMetrics, "ShadowMetrics" ); diff --git a/src/graphic/QskStandardSymbol.h b/src/graphic/QskStandardSymbol.h index 32223cf2..dde16e18 100644 --- a/src/graphic/QskStandardSymbol.h +++ b/src/graphic/QskStandardSymbol.h @@ -11,11 +11,10 @@ class QskGraphic; -class QSK_EXPORT QskStandardSymbol +namespace QskStandardSymbol { - Q_GADGET + QSK_EXPORT Q_NAMESPACE - public: enum Type { NoSymbol = -1, @@ -31,9 +30,9 @@ class QSK_EXPORT QskStandardSymbol SymbolTypeCount }; - Q_ENUM( Type ) + Q_ENUM_NS( Type ) - static QskGraphic graphic( Type ); -}; + QSK_EXPORT QskGraphic graphic( Type ); +} #endif From 6455c26f8615ae23a81241ffe46d837748ea30a0 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 10:26:33 +0100 Subject: [PATCH 037/107] making QskGraphic a Q_GADGET --- qskinny.pro | 3 +++ src/graphic/QskGraphic.cpp | 2 ++ src/graphic/QskGraphic.h | 12 ++++++++++-- tools/svg2qvg/svg2qvg.pro | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/qskinny.pro b/qskinny.pro index 97705c65..8943d9f7 100644 --- a/qskinny.pro +++ b/qskinny.pro @@ -1,5 +1,7 @@ TEMPLATE = subdirs +CONFIG += ordered + SUBDIRS = \ src \ skins \ @@ -21,6 +23,7 @@ OTHER_FILES = \ qmlexport.depends = src inputcontext.depends = src skins.depends = src +tools.depends = src support.depends = src skins examples.depends = tools support skins qmlexport playground.depends = tools support skins qmlexport diff --git a/src/graphic/QskGraphic.cpp b/src/graphic/QskGraphic.cpp index ab6e6b30..97feb70d 100644 --- a/src/graphic/QskGraphic.cpp +++ b/src/graphic/QskGraphic.cpp @@ -1203,3 +1203,5 @@ QDebug operator<<( QDebug debug, const QskGraphic& graphic ) } #endif + +#include "moc_QskGraphic.cpp" diff --git a/src/graphic/QskGraphic.h b/src/graphic/QskGraphic.h index f7e5f6ef..23cceb01 100644 --- a/src/graphic/QskGraphic.h +++ b/src/graphic/QskGraphic.h @@ -26,6 +26,14 @@ class QDebug; class QSK_EXPORT QskGraphic : public QPaintDevice { + Q_GADGET + + Q_PROPERTY( qreal aspectRatio READ aspectRatio ) + Q_PROPERTY( QRectF boundingRect READ boundingRect ) + Q_PROPERTY( QRectF controlPointRect READ controlPointRect ) + Q_PROPERTY( QSizeF defaultSize READ defaultSize ) + Q_PROPERTY( quint64 modificationId READ modificationId ) + public: enum RenderHint { @@ -122,8 +130,6 @@ class QSK_EXPORT QskGraphic : public QPaintDevice uint hash( uint seed ) const; protected: - friend class QskGraphicPaintEngine; - virtual QSize sizeMetrics() const; virtual void drawPath( const QPainterPath& ); @@ -142,6 +148,8 @@ class QSK_EXPORT QskGraphic : public QPaintDevice class PrivateData; QSharedDataPointer< PrivateData > m_data; + + friend class QskGraphicPaintEngine; mutable QskGraphicPaintEngine* m_paintEngine; }; diff --git a/tools/svg2qvg/svg2qvg.pro b/tools/svg2qvg/svg2qvg.pro index e2b81f73..19a433f1 100644 --- a/tools/svg2qvg/svg2qvg.pro +++ b/tools/svg2qvg/svg2qvg.pro @@ -18,7 +18,7 @@ standalone { $${QSK_ROOT}/src/common \ $${QSK_ROOT}/src/graphic - INCLUDEPATH *= $${QSK_DIRS} + INCLUDEPATH *= $${QSK_DIRS} $${QSK_OUT_ROOT}/src/$${MOC_DIR} DEPENDPATH += $${QSK_DIRS} DEFINES += QSK_STANDALONE From b89fa86b676cdd2abfc1e0756d9710ae6e11927c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 10:39:33 +0100 Subject: [PATCH 038/107] using qAsConst --- src/common/QskGradient.cpp | 11 ++++++++++- src/common/QskGradient.h | 2 +- src/nodes/QskArcNode.cpp | 2 +- src/nodes/QskArcRenderer.cpp | 2 +- src/nodes/QskBoxRendererRect.cpp | 8 ++++---- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 5ac0554f..20f52daf 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -317,8 +317,17 @@ void QskGradient::setStops( const QskGradientStops& stops ) 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; } diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index c0544bfd..de97db9c 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -76,7 +76,7 @@ class QSK_EXPORT QskGradient Q_INVOKABLE QColor endColor() const; 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; diff --git a/src/nodes/QskArcNode.cpp b/src/nodes/QskArcNode.cpp index c57f6f40..532375a7 100644 --- a/src/nodes/QskArcNode.cpp +++ b/src/nodes/QskArcNode.cpp @@ -36,7 +36,7 @@ uint QskArcNode::hash() const { uint h = m_metrics.hash(); - for( const auto& stop : m_gradient.stops() ) + for( const auto& stop : qAsConst( m_gradient.stops() ) ) h = stop.hash( h ); return h; diff --git a/src/nodes/QskArcRenderer.cpp b/src/nodes/QskArcRenderer.cpp index 28c96580..5cc21283 100644 --- a/src/nodes/QskArcRenderer.cpp +++ b/src/nodes/QskArcRenderer.cpp @@ -18,7 +18,7 @@ void QskArcRenderer::renderArc(const QRectF& rect, QGradientStops stops; - for( const QskGradientStop& stop : gradient.stops() ) + for( const QskGradientStop& stop : qAsConst( gradient.stops() ) ) { QGradientStop s( stop.position(), stop.color() ); stops.append( s ); diff --git a/src/nodes/QskBoxRendererRect.cpp b/src/nodes/QskBoxRendererRect.cpp index 13d22cd8..63c82034 100644 --- a/src/nodes/QskBoxRendererRect.cpp +++ b/src/nodes/QskBoxRendererRect.cpp @@ -434,7 +434,7 @@ static inline void qskCreateBorder( const qreal dy1 = in.top - in.bottom; const qreal dy2 = out.top - out.bottom; - for( const auto& stop : gradientBottom.stops() ) + for( const auto& stop : qAsConst( gradientBottom.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.right - stop.position() * dx1; @@ -445,7 +445,7 @@ static inline void qskCreateBorder( ( line++ )->setLine( x1, y1, x2, y2, c ); } - for( const auto& stop : gradientLeft.stops() ) + for( const auto& stop : qAsConst( gradientLeft.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.left; @@ -456,7 +456,7 @@ static inline void qskCreateBorder( ( line++ )->setLine( x1, y1, x2, y2, c ); } - for( const auto& stop : gradientTop.stops() ) + for( const auto& stop : qAsConst( gradientTop.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.left + stop.position() * dx1; @@ -467,7 +467,7 @@ static inline void qskCreateBorder( ( line++ )->setLine( x1, y1, x2, y2, c ); } - for( const auto& stop : gradientRight.stops() ) + for( const auto& stop : qAsConst( gradientRight.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.right; From d285b7e85ccf88b5c754b4ae8f7f37ef1daaee26 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 11:12:45 +0100 Subject: [PATCH 039/107] Q_DISABLE_COPY added --- src/common/QskObjectCounter.h | 2 ++ src/controls/QskSkinlet.h | 2 ++ src/controls/QskSkinnable.h | 2 ++ src/graphic/QskGraphicProviderMap.h | 2 ++ 4 files changed, 8 insertions(+) diff --git a/src/common/QskObjectCounter.h b/src/common/QskObjectCounter.h index dafddb3e..5de71cc7 100644 --- a/src/common/QskObjectCounter.h +++ b/src/common/QskObjectCounter.h @@ -37,6 +37,8 @@ class QSK_EXPORT QskObjectCounter void dump() const; private: + Q_DISABLE_COPY( QskObjectCounter ) + class PrivateData; std::unique_ptr< PrivateData > m_data; diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index bf97a6ff..534b00f0 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -167,6 +167,8 @@ class QSK_EXPORT QskSkinlet const QSizeF& hint, const QSizeF& constraint ) const; private: + Q_DISABLE_COPY( QskSkinlet ) + class PrivateData; std::unique_ptr< PrivateData > m_data; }; diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index 21f71e7f..06bb008d 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -240,6 +240,8 @@ class QSK_EXPORT QskSkinnable const QskSkinHintTable& hintTable() const; private: + Q_DISABLE_COPY( QskSkinnable ) + void startHintTransition( QskAspect, QskAnimationHint, QVariant from, QVariant to ); diff --git a/src/graphic/QskGraphicProviderMap.h b/src/graphic/QskGraphicProviderMap.h index 6d9ec38f..119dab2c 100644 --- a/src/graphic/QskGraphicProviderMap.h +++ b/src/graphic/QskGraphicProviderMap.h @@ -30,6 +30,8 @@ class QSK_EXPORT QskGraphicProviderMap int size() const; private: + Q_DISABLE_COPY( QskGraphicProviderMap ) + class PrivateData; std::unique_ptr< PrivateData > m_data; }; From d81e8991afbc2f4d2dd19fea78db3300c2ac3ba1 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 11:14:46 +0100 Subject: [PATCH 040/107] pimpled --- src/nodes/QskScaleRenderer.cpp | 74 ++++++++++++++++++++++++---------- src/nodes/QskScaleRenderer.h | 27 +++++-------- 2 files changed, 63 insertions(+), 38 deletions(-) diff --git a/src/nodes/QskScaleRenderer.cpp b/src/nodes/QskScaleRenderer.cpp index fd097ffe..f647ad6e 100644 --- a/src/nodes/QskScaleRenderer.cpp +++ b/src/nodes/QskScaleRenderer.cpp @@ -4,14 +4,18 @@ *****************************************************************************/ #include "QskScaleRenderer.h" +#include "QskScaleTickmarks.h" #include "QskSkinlet.h" #include "QskSGNode.h" #include "QskTickmarksNode.h" #include "QskTextNode.h" #include "QskGraphicNode.h" #include "QskTextOptions.h" +#include "QskTextColors.h" #include "QskGraphic.h" +#include "QskColorFilter.h" #include "QskControl.h" +#include "QskIntervalF.h" #include "QskFunctions.h" #include @@ -45,44 +49,70 @@ static inline void qskInsertRemoveChild( QSGNode* parentNode, } } +class QskScaleRenderer::PrivateData +{ + public: + QskIntervalF boundaries; + QskScaleTickmarks tickmarks; + + QColor tickColor = Qt::black; + qreal tickWidth = 1.0; + + QFont font; + QskTextColors textColors; + + QskColorFilter colorFilter; + + Qt::Orientation orientation = Qt::Horizontal; +}; + +QskScaleRenderer::QskScaleRenderer() + : m_data( new PrivateData() ) +{ +} + +QskScaleRenderer::~QskScaleRenderer() +{ +} + void QskScaleRenderer::setOrientation( Qt::Orientation orientation ) { - m_orientation = orientation; + m_data->orientation = orientation; } void QskScaleRenderer::setBoundaries( const QskIntervalF& boundaries ) { - m_boundaries = boundaries; + m_data->boundaries = boundaries; } void QskScaleRenderer::setTickmarks( const QskScaleTickmarks& tickmarks ) { - m_tickmarks = tickmarks; + m_data->tickmarks = tickmarks; } void QskScaleRenderer::setTickColor( const QColor& color ) { - m_tickColor = color; + m_data->tickColor = color; } void QskScaleRenderer::setTickWidth( qreal width ) { - m_tickWidth = width; + m_data->tickWidth = width; } void QskScaleRenderer::setFont( const QFont& font ) { - m_font = font; + m_data->font = font; } void QskScaleRenderer::setTextColors( const QskTextColors& textColors ) { - m_textColors = textColors; + m_data->textColors = textColors; } void QskScaleRenderer::setColorFilter( const QskColorFilter& colorFilter ) { - m_colorFilter = colorFilter; + m_data->colorFilter = colorFilter; } QSGNode* QskScaleRenderer::updateScaleNode( @@ -140,8 +170,8 @@ QSGNode* QskScaleRenderer::updateTicksNode( if( ticksNode == nullptr ) ticksNode = new QskTickmarksNode; - ticksNode->update( m_tickColor, rect, m_boundaries, - m_tickmarks, m_tickWidth, m_orientation ); + ticksNode->update( m_data->tickColor, rect, m_data->boundaries, + m_data->tickmarks, m_data->tickWidth, m_data->orientation ); return ticksNode; } @@ -153,18 +183,18 @@ QSGNode* QskScaleRenderer::updateLabelsNode( if ( labelsRect.isEmpty() || tickmarksRect.isEmpty() ) return nullptr; - const auto ticks = m_tickmarks.majorTicks(); + const auto ticks = m_data->tickmarks.majorTicks(); if ( ticks.isEmpty() ) return nullptr; if( node == nullptr ) node = new QSGNode; - const QFontMetricsF fm( m_font ); + const QFontMetricsF fm( m_data->font ); - const qreal length = ( m_orientation == Qt::Horizontal ) + const qreal length = ( m_data->orientation == Qt::Horizontal ) ? tickmarksRect.width() : tickmarksRect.height(); - const qreal ratio = length / m_boundaries.width(); + const qreal ratio = length / m_data->boundaries.width(); auto nextNode = node->firstChild(); @@ -182,7 +212,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( if ( label.isNull() ) continue; - const qreal tickPos = ratio * ( tick - m_boundaries.lowerBound() ); + const qreal tickPos = ratio * ( tick - m_data->boundaries.lowerBound() ); if ( label.canConvert< QString >() ) { @@ -193,7 +223,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( QRectF r; Qt::Alignment alignment; - if( m_orientation == Qt::Horizontal ) + if( m_data->orientation == Qt::Horizontal ) { const auto w = qskHorizontalAdvance( fm, text ); @@ -261,8 +291,8 @@ QSGNode* QskScaleRenderer::updateLabelsNode( } auto textNode = static_cast< QskTextNode* >( nextNode ); - textNode->setTextData( skinnable->owningControl(), text, r, m_font, - QskTextOptions(), m_textColors, alignment, Qsk::Normal ); + textNode->setTextData( skinnable->owningControl(), text, r, m_data->font, + QskTextOptions(), m_data->textColors, alignment, Qsk::Normal ); nextNode = nextNode->nextSibling(); } @@ -277,7 +307,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( Qt::Alignment alignment; - if( m_orientation == Qt::Horizontal ) + if( m_data->orientation == Qt::Horizontal ) { auto pos = tickmarksRect.x() + tickPos - 0.5 * w; pos = qBound( labelsRect.left(), pos, labelsRect.right() - w ); @@ -310,7 +340,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( QskSkinlet::updateGraphicNode( skinnable->owningControl(), graphicNode, - graphic, m_colorFilter, labelRect, alignment ); + graphic, m_data->colorFilter, labelRect, alignment ); nextNode = nextNode->nextSibling(); } @@ -328,11 +358,11 @@ QVariant QskScaleRenderer::labelAt( qreal pos ) const QSizeF QskScaleRenderer::boundingLabelSize() const { - const auto ticks = m_tickmarks.majorTicks(); + const auto ticks = m_data->tickmarks.majorTicks(); if ( ticks.isEmpty() ) return QSizeF( 0.0, 0.0 ); - const QFontMetricsF fm( m_font ); + const QFontMetricsF fm( m_data->font ); qreal maxWidth = 0.0; const qreal h = fm.height(); diff --git a/src/nodes/QskScaleRenderer.h b/src/nodes/QskScaleRenderer.h index 3d29505b..9117a76e 100644 --- a/src/nodes/QskScaleRenderer.h +++ b/src/nodes/QskScaleRenderer.h @@ -7,16 +7,18 @@ #define QSK_SCALE_RENDERER_H #include "QskGlobal.h" -#include "QskIntervalF.h" -#include "QskScaleTickmarks.h" -#include "QskTextColors.h" -#include "QskColorFilter.h" #include #include #include +#include + class QskSkinnable; +class QskIntervalF; +class QskScaleTickmarks; +class QskTextColors; +class QskColorFilter; class QSGNode; class QVariant; @@ -25,6 +27,9 @@ class QRectF; class QSK_EXPORT QskScaleRenderer { public: + QskScaleRenderer(); + ~QskScaleRenderer(); + void setOrientation( Qt::Orientation ); void setBoundaries( const QskIntervalF& ); @@ -54,18 +59,8 @@ class QSK_EXPORT QskScaleRenderer private: Q_DISABLE_COPY( QskScaleRenderer ) - Qt::Orientation m_orientation = Qt::Horizontal; - - QskIntervalF m_boundaries; - QskScaleTickmarks m_tickmarks; - - QColor m_tickColor = Qt::black; - qreal m_tickWidth = 1.0; - - QFont m_font; - QskTextColors m_textColors; - - QskColorFilter m_colorFilter; + class PrivateData; + std::unique_ptr< PrivateData > m_data; }; #endif From a8b176aa7199a38b160b1037200f259ff65051d3 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 11:17:03 +0100 Subject: [PATCH 041/107] QskSkinTransition pimpled --- examples/mycontrols/main.cpp | 1 + src/controls/QskSkinTransition.cpp | 59 ++++++++++++++++++------------ src/controls/QskSkinTransition.h | 8 ++-- support/SkinnyShortcut.cpp | 1 + 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index 3a764814..996bcd02 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index 5e20ca9f..ef3d6ec6 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -2,6 +2,7 @@ #include "QskColorFilter.h" #include "QskControl.h" #include "QskWindow.h" +#include "QskAnimationHint.h" #include "QskHintAnimator.h" #include "QskSkin.h" #include "QskSkinHintTable.h" @@ -518,10 +519,17 @@ namespace Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator ) -QskSkinTransition::QskSkinTransition() - : m_mask( QskSkinTransition::AllTypes ) +class QskSkinTransition::PrivateData +{ + 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() @@ -530,42 +538,42 @@ QskSkinTransition::~QskSkinTransition() void QskSkinTransition::setMask( Type type ) { - m_mask = type; + m_data->mask = type; } QskSkinTransition::Type QskSkinTransition::mask() const { - return m_mask; + return m_data->mask; } void QskSkinTransition::setSourceSkin( QskSkin* skin ) { - m_skins[ 0 ] = skin; + m_data->skins[ 0 ] = skin; } QskSkin* QskSkinTransition::sourceSkin() const { - return m_skins[ 0 ]; + return m_data->skins[ 0 ]; } void QskSkinTransition::setTargetSkin( QskSkin* skin ) { - m_skins[ 1 ] = skin; + m_data->skins[ 1 ] = skin; } QskSkin* QskSkinTransition::targetSkin() const { - return m_skins[ 1 ]; + return m_data->skins[ 1 ]; } void QskSkinTransition::setAnimation( QskAnimationHint animationHint ) { - m_animationHint = animationHint; + m_data->animationHint = animationHint; } QskAnimationHint QskSkinTransition::animation() const { - return m_animationHint; + return m_data->animationHint; } void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) @@ -575,7 +583,10 @@ void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) 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 return; @@ -583,32 +594,32 @@ void QskSkinTransition::process() 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 - updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); + updateSkin( skinFrom, skinTo ); return; } QVector< AnimatorCandidate > candidates; - const auto oldFilters = m_skins[ 0 ]->graphicFilters(); + const auto oldFilters = skinFrom->graphicFilters(); { // copy out all hints before updating the skin // - would be good to have Copy on Write here - const auto oldTable = m_skins[ 0 ]->hintTable(); + const auto oldTable = skinFrom->hintTable(); // apply the changes - updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); + updateSkin( skinFrom, skinTo ); - candidates = qskAnimatorCandidates( m_mask, oldTable, oldFilters, - m_skins[ 1 ]->hintTable(), m_skins[ 1 ]->graphicFilters() ); + candidates = qskAnimatorCandidates( m_data->mask, oldTable, oldFilters, + skinTo->hintTable(), skinTo->graphicFilters() ); } if ( !candidates.isEmpty() ) { - bool doGraphicFilter = m_mask & QskSkinTransition::Color; + bool doGraphicFilter = m_data->mask & QskSkinTransition::Color; const auto windows = qGuiApp->topLevelWindows(); @@ -617,7 +628,7 @@ void QskSkinTransition::process() if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) ) { if ( !quickWindow->isVisible() || - ( qskEffectiveSkin( quickWindow ) != m_skins[ 1 ] ) ) + ( qskEffectiveSkin( quickWindow ) != skinTo ) ) { continue; } @@ -627,8 +638,8 @@ void QskSkinTransition::process() if ( doGraphicFilter ) { group->addGraphicFilterAnimators( - m_animationHint, oldFilters, - m_skins[ 1 ]->graphicFilters() ); + m_data->animationHint, oldFilters, + skinTo->graphicFilters() ); doGraphicFilter = false; } @@ -639,7 +650,7 @@ void QskSkinTransition::process() */ group->addAnimators( quickWindow->contentItem(), - m_animationHint, candidates, m_skins[ 1 ] ); + m_data->animationHint, candidates, skinTo ); qskSkinAnimator->add( group ); } diff --git a/src/controls/QskSkinTransition.h b/src/controls/QskSkinTransition.h index 5174569b..6fc13f1b 100644 --- a/src/controls/QskSkinTransition.h +++ b/src/controls/QskSkinTransition.h @@ -1,10 +1,11 @@ #ifndef QSK_SKIN_TRANSITION_H #define QSK_SKIN_TRANSITION_H -#include "QskAnimationHint.h" #include "QskAspect.h" +#include class QskSkin; +class QskAnimationHint; class QQuickWindow; class QVariant; @@ -46,9 +47,8 @@ class QSK_EXPORT QskSkinTransition private: Q_DISABLE_COPY( QskSkinTransition ) - QskSkin* m_skins[ 2 ]; - QskAnimationHint m_animationHint; - Type m_mask : 2; + class PrivateData; + std::unique_ptr< PrivateData > m_data; }; #endif diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 44a3d423..670405ca 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include From 07f9829ffa90c3e0e38344641a8e6405fd8f6dc6 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 11:44:08 +0100 Subject: [PATCH 042/107] QskDialogButtonBox::isDefaultButtonKeyEvent fixed --- src/dialogs/QskDialogButtonBox.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/dialogs/QskDialogButtonBox.cpp b/src/dialogs/QskDialogButtonBox.cpp index c54ab6e8..cf2c8cfe 100644 --- a/src/dialogs/QskDialogButtonBox.cpp +++ b/src/dialogs/QskDialogButtonBox.cpp @@ -565,16 +565,10 @@ void QskDialogButtonBox::itemChange( bool QskDialogButtonBox::isDefaultButtonKeyEvent( const QKeyEvent* event ) { - if ( event->modifiers() & Qt::KeypadModifier && event->key() == Qt::Key_Enter ) - { - return ( event->modifiers() & Qt::KeypadModifier ) - && ( event->key() == Qt::Key_Enter ); - } - else - { - return ( event->key() == Qt::Key_Enter ) - || ( event->key() == Qt::Key_Return ); - } + if ( !event->modifiers() ) + return ( event->key() == Qt::Key_Enter ) || ( event->key() == Qt::Key_Return ); + + return ( event->modifiers() & Qt::KeypadModifier ) && ( event->key() == Qt::Key_Enter ); } #include "moc_QskDialogButtonBox.cpp" From 828986de2eb867320d827dfa44705b680fce0a2b Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:10:11 +0100 Subject: [PATCH 043/107] bad return statements fixed --- src/controls/QskListView.cpp | 6 ++++-- src/controls/QskMenu.cpp | 4 ++-- src/controls/QskPageIndicator.cpp | 4 ++-- src/controls/QskTextInput.cpp | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/controls/QskListView.cpp b/src/controls/QskListView.cpp index 331f8f8b..8495cdd3 100644 --- a/src/controls/QskListView.cpp +++ b/src/controls/QskListView.cpp @@ -196,11 +196,13 @@ void QskListView::keyPressEvent( QKeyEvent* event ) case Qt::Key_PageDown: { // TODO ... - return Inherited::keyPressEvent( event ); + Inherited::keyPressEvent( event ); + return; } default: { - return Inherited::keyPressEvent( event ); + Inherited::keyPressEvent( event ); + return; } } diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index 06168bfc..0cff4321 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -308,7 +308,7 @@ void QskMenu::mousePressEvent( QMouseEvent* event ) return; } - return Inherited::mousePressEvent( event ); + Inherited::mousePressEvent( event ); } void QskMenu::mouseReleaseEvent( QMouseEvent* event ) @@ -327,7 +327,7 @@ void QskMenu::mouseReleaseEvent( QMouseEvent* event ) return; } - return Inherited::mouseReleaseEvent( event ); + Inherited::mouseReleaseEvent( event ); } void QskMenu::aboutToShow() diff --git a/src/controls/QskPageIndicator.cpp b/src/controls/QskPageIndicator.cpp index 0b7f89f0..9316d9a2 100644 --- a/src/controls/QskPageIndicator.cpp +++ b/src/controls/QskPageIndicator.cpp @@ -184,7 +184,7 @@ void QskPageIndicator::mousePressEvent( QMouseEvent* event ) return; } - return Inherited::mousePressEvent( event ); + Inherited::mousePressEvent( event ); } void QskPageIndicator::mouseUngrabEvent() @@ -209,7 +209,7 @@ void QskPageIndicator::mouseReleaseEvent( QMouseEvent* event ) return; } - return Inherited::mouseReleaseEvent( event ); + Inherited::mouseReleaseEvent( event ); } void QskPageIndicator::keyPressEvent( QKeyEvent* event ) diff --git a/src/controls/QskTextInput.cpp b/src/controls/QskTextInput.cpp index d355638a..800b6de4 100644 --- a/src/controls/QskTextInput.cpp +++ b/src/controls/QskTextInput.cpp @@ -756,12 +756,12 @@ int QskTextInput::passwordMaskDelay() const void QskTextInput::setPasswordMaskDelay( int ms ) { - return m_data->textInput->setPasswordMaskDelay( ms ); + m_data->textInput->setPasswordMaskDelay( ms ); } void QskTextInput::resetPasswordMaskDelay() { - return m_data->textInput->resetPasswordMaskDelay(); + m_data->textInput->resetPasswordMaskDelay(); } QString QskTextInput::displayText() const @@ -771,7 +771,7 @@ QString QskTextInput::displayText() 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(); } From ca36a1705db062ebf811be2a06e992031eb73c60 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:12:34 +0100 Subject: [PATCH 044/107] Q_DISABLE_COPY added --- src/nodes/QskTextureRenderer.cpp | 4 ---- src/nodes/QskTextureRenderer.h | 7 ++++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/nodes/QskTextureRenderer.cpp b/src/nodes/QskTextureRenderer.cpp index 3f46595f..d501d6f3 100644 --- a/src/nodes/QskTextureRenderer.cpp +++ b/src/nodes/QskTextureRenderer.cpp @@ -172,10 +172,6 @@ QSGTexture* QskTextureRenderer::textureFromId( return texture; } -QskTextureRenderer::PaintHelper::~PaintHelper() -{ -} - uint QskTextureRenderer::createTexture( QQuickWindow* window, RenderMode renderMode, const QSize& size, PaintHelper* helper ) diff --git a/src/nodes/QskTextureRenderer.h b/src/nodes/QskTextureRenderer.h index b69a3517..4e83b6fd 100644 --- a/src/nodes/QskTextureRenderer.h +++ b/src/nodes/QskTextureRenderer.h @@ -38,8 +38,13 @@ namespace QskTextureRenderer class QSK_EXPORT PaintHelper { public: - virtual ~PaintHelper(); + PaintHelper() = default; + virtual ~PaintHelper() = default; + virtual void paint( QPainter*, const QSize& ) = 0; + + private: + Q_DISABLE_COPY( PaintHelper ) }; QSK_EXPORT uint createTexture( From 3b683ba6d4de6baded9521d59438ade71ac20019 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:13:09 +0100 Subject: [PATCH 045/107] reserving memory in advance --- src/nodes/QskArcRenderer.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/nodes/QskArcRenderer.cpp b/src/nodes/QskArcRenderer.cpp index 5cc21283..0f89d7d6 100644 --- a/src/nodes/QskArcRenderer.cpp +++ b/src/nodes/QskArcRenderer.cpp @@ -17,12 +17,10 @@ void QskArcRenderer::renderArc(const QRectF& rect, painter->setRenderHint( QPainter::Antialiasing, true ); QGradientStops stops; + stops.reserve( gradient.stops().count() ); for( const QskGradientStop& stop : qAsConst( gradient.stops() ) ) - { - QGradientStop s( stop.position(), stop.color() ); - stops.append( s ); - } + stops += QGradientStop( stop.position(), stop.color() ); /* horizontal is interpreted as in direction of the arc, From fe372f64e4633308319a76001eac3a5139a323b3 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:13:47 +0100 Subject: [PATCH 046/107] Q_DISABLE_COPY added --- src/controls/QskObjectTree.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/controls/QskObjectTree.h b/src/controls/QskObjectTree.h index c805e5b8..1b13f732 100644 --- a/src/controls/QskObjectTree.h +++ b/src/controls/QskObjectTree.h @@ -16,10 +16,14 @@ namespace QskObjectTree class Visitor { public: + Visitor() = default; virtual ~Visitor() = default; virtual bool visitDown( QObject* object ) = 0; virtual bool visitUp( const QObject* object ) = 0; + + private: + Q_DISABLE_COPY( Visitor ) }; QSK_EXPORT QObjectList childNodes( const QObject* ); From b572c23561bf8d6576ea19db9c92adc9a2bfe9e9 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:18:27 +0100 Subject: [PATCH 047/107] using const methods --- src/controls/QskSkinManager.cpp | 4 ++-- src/graphic/QskGraphicProviderMap.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controls/QskSkinManager.cpp b/src/controls/QskSkinManager.cpp index 807753c1..a2bc7d29 100644 --- a/src/controls/QskSkinManager.cpp +++ b/src/controls/QskSkinManager.cpp @@ -292,7 +292,7 @@ namespace m_skinMap.clear(); // 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(); @@ -301,7 +301,7 @@ namespace } // 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(); if ( data.loader ) diff --git a/src/graphic/QskGraphicProviderMap.cpp b/src/graphic/QskGraphicProviderMap.cpp index a7a49043..bdd37f92 100644 --- a/src/graphic/QskGraphicProviderMap.cpp +++ b/src/graphic/QskGraphicProviderMap.cpp @@ -28,7 +28,8 @@ QskGraphicProviderMap::QskGraphicProviderMap() QskGraphicProviderMap::~QskGraphicProviderMap() { - for ( auto it = m_data->hashTab.begin(); it != m_data->hashTab.end(); ++it ) + const auto& hashTab = m_data->hashTab; + for ( auto it = hashTab.constBegin(); it != hashTab.constEnd(); ++it ) delete it.value(); } From eeb9e04b6062ad427a4df9cd9dc8a33506cddb6f Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:30:50 +0100 Subject: [PATCH 048/107] making clazy happier --- src/controls/QskWindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 58225125..7e853324 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -119,7 +119,7 @@ static inline void qskSetVisualizationMode( #endif } -static inline QByteArray qskVisualizationMode( const QQuickWindow* window ) +static inline const QByteArray& qskVisualizationMode( const QQuickWindow* window ) { auto d = QQuickWindowPrivate::get( const_cast< QQuickWindow* >( window ) ); #if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) @@ -208,7 +208,8 @@ void QskWindow::setScreen( const QString& name ) { if ( !name.isEmpty() ) { - for ( auto screen : QGuiApplication::screens() ) + const auto screens = QGuiApplication::screens(); + for ( auto screen : screens ) { if ( screen->name() == name ) { From 115141bc210bfa880e0c10f220b82ee28e38f3ad Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:33:01 +0100 Subject: [PATCH 049/107] reserving memory in advance --- src/controls/QskObjectTree.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/controls/QskObjectTree.cpp b/src/controls/QskObjectTree.cpp index 163a1c7d..9315d882 100644 --- a/src/controls/QskObjectTree.cpp +++ b/src/controls/QskObjectTree.cpp @@ -21,6 +21,8 @@ QObjectList QskObjectTree::childNodes( const QObject* object ) if ( object == nullptr ) { const auto windows = QGuiApplication::topLevelWindows(); + children.reserve( windows.count() ); + for ( auto window : windows ) children += window; } @@ -43,6 +45,7 @@ QObjectList QskObjectTree::childNodes( const QObject* object ) else if ( auto item = qobject_cast< const QQuickItem* >( object ) ) { const auto childItems = item->childItems(); + children.reserve( childItems.count() ); for ( auto child : childItems ) children += child; From 73f11cffd9cfd6d4fa14f452a8633de4f44cfeb8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 24 Mar 2022 17:33:40 +0100 Subject: [PATCH 050/107] making clazy happier --- src/controls/QskMenuSkinlet.cpp | 2 +- src/controls/QskSkinTransition.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/controls/QskMenuSkinlet.cpp b/src/controls/QskMenuSkinlet.cpp index ee8c0565..6438b2b3 100644 --- a/src/controls/QskMenuSkinlet.cpp +++ b/src/controls/QskMenuSkinlet.cpp @@ -169,7 +169,7 @@ class QskMenuSkinlet::PrivateData const auto sample = skinlet->sampleAt( menu, QskMenu::Text, i ); if ( sample.canConvert< QString >() ) { - const auto text = sample.value< QString >(); + const auto text = sample.toString(); if( !text.isEmpty() ) { const auto w = qskHorizontalAdvance( fm, text ); diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index ef3d6ec6..9b769199 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -1,3 +1,8 @@ +/****************************************************************************** + * 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 "QskColorFilter.h" #include "QskControl.h" @@ -40,7 +45,8 @@ namespace public: AnimatorCandidate() = default; - inline AnimatorCandidate( QskAspect aspect, QVariant from, QVariant to ) + inline AnimatorCandidate( QskAspect aspect, + const QVariant& from, const QVariant& to ) : aspect( aspect ) , from( from ) , to( to ) From 04ec8b52a1ac497f4748eb1d8761a8ecdb1f9ff7 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 07:46:48 +0100 Subject: [PATCH 051/107] making clazy happier --- src/controls/QskSkinnable.cpp | 25 ++++++++++++++----------- src/controls/QskSkinnable.h | 4 ++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 5c4cc850..1268fcde 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -1155,14 +1155,14 @@ bool QskSkinnable::isTransitionAccepted( QskAspect aspect ) const } void QskSkinnable::startTransition( QskAspect aspect, - QskAnimationHint animationHint, QVariant from, QVariant to ) + QskAnimationHint animationHint, const QVariant& from, const QVariant& to ) { aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) ); startHintTransition( aspect, animationHint, from, to ); } 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 ) ) return; @@ -1177,15 +1177,18 @@ void QskSkinnable::startHintTransition( QskAspect aspect, 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; } @@ -1194,8 +1197,8 @@ void QskSkinnable::startHintTransition( QskAspect aspect, { const auto skin = effectiveSkin(); - from.setValue( skin->graphicFilter( from.toInt() ) ); - to.setValue( skin->graphicFilter( to.toInt() ) ); + v1.setValue( skin->graphicFilter( v1.toInt() ) ); + v2.setValue( skin->graphicFilter( v2.toInt() ) ); } aspect.clearStates(); @@ -1208,9 +1211,9 @@ void QskSkinnable::startHintTransition( QskAspect aspect, auto animator = m_data->animators.animator( aspect ); 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 ) diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index 06bb008d..b73ea956 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -119,7 +119,7 @@ class QSK_EXPORT QskSkinnable QskSkin* effectiveSkin() const; void startTransition( QskAspect, - QskAnimationHint, QVariant from, QVariant to ); + QskAnimationHint, const QVariant& from, const QVariant& to ); QskAspect::Subcontrol effectiveSubcontrol( QskAspect::Subcontrol ) const; @@ -243,7 +243,7 @@ class QSK_EXPORT QskSkinnable Q_DISABLE_COPY( QskSkinnable ) void startHintTransition( QskAspect, - QskAnimationHint, QVariant from, QVariant to ); + QskAnimationHint, const QVariant& from, const QVariant& to ); QVariant animatedValue( QskAspect, QskSkinHintStatus* ) const; const QVariant& storedHint( QskAspect, QskSkinHintStatus* = nullptr ) const; From 55d5f995756fc49648cf360371144fa2faf3bc32 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 10:28:06 +0100 Subject: [PATCH 052/107] introducing QskHashValue to work around Qt5/6 incompatibilities --- .../iotdashboard/nodes/RadialTickmarksNode.cpp | 2 +- .../iotdashboard/nodes/RadialTickmarksNode.h | 2 +- src/common/QskArcMetrics.cpp | 4 ++-- src/common/QskArcMetrics.h | 2 +- src/common/QskBoxBorderColors.cpp | 4 ++-- src/common/QskBoxBorderColors.h | 2 +- src/common/QskBoxBorderMetrics.cpp | 4 ++-- src/common/QskBoxBorderMetrics.h | 2 +- src/common/QskBoxShapeMetrics.cpp | 4 ++-- src/common/QskBoxShapeMetrics.h | 2 +- src/common/QskGlobal.h | 6 ++++++ src/common/QskGradient.cpp | 4 ++-- src/common/QskGradient.h | 2 +- src/common/QskGradientStop.cpp | 4 ++-- src/common/QskGradientStop.h | 2 +- src/common/QskScaleTickmarks.cpp | 2 +- src/common/QskScaleTickmarks.h | 2 +- src/common/QskShadowMetrics.cpp | 4 ++-- src/common/QskShadowMetrics.h | 2 +- src/common/QskTextColors.cpp | 2 +- src/common/QskTextColors.h | 2 +- src/common/QskTextOptions.cpp | 4 ++-- src/common/QskTextOptions.h | 2 +- src/graphic/QskGraphic.cpp | 2 +- src/graphic/QskGraphic.h | 2 +- src/nodes/QskArcNode.cpp | 4 ++-- src/nodes/QskArcNode.h | 2 +- src/nodes/QskBoxClipNode.cpp | 6 +++--- src/nodes/QskBoxClipNode.h | 2 +- src/nodes/QskBoxNode.cpp | 16 ++++++++-------- src/nodes/QskGraphicNode.cpp | 4 ++-- src/nodes/QskGraphicNode.h | 2 +- src/nodes/QskPaintedNode.h | 4 ++-- src/nodes/QskTextNode.cpp | 6 +++--- src/nodes/QskTextNode.h | 2 +- src/nodes/QskTickmarksNode.cpp | 4 ++-- 36 files changed, 64 insertions(+), 58 deletions(-) diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp index f6826d1c..a751cf41 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp @@ -34,7 +34,7 @@ void RadialTickmarksNode::update( const QColor& color, const QRectF& rect, markDirty( QSGNode::DirtyGeometry ); } - const uint hash = tickmarks.hash( 17435 ); + const auto hash = tickmarks.hash( 17435 ); if( ( hash != m_hash ) || ( rect != m_rect ) ) { diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.h b/examples/iotdashboard/nodes/RadialTickmarksNode.h index 2244cdd9..188dc888 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.h +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.h @@ -29,5 +29,5 @@ class RadialTickmarksNode : public QSGGeometryNode QRectF m_rect; int m_lineWidth = 0; - uint m_hash = 0; + QskHashValue m_hash = 0; }; diff --git a/src/common/QskArcMetrics.cpp b/src/common/QskArcMetrics.cpp index 989474a6..991b075d 100644 --- a/src/common/QskArcMetrics.cpp +++ b/src/common/QskArcMetrics.cpp @@ -86,9 +86,9 @@ QskArcMetrics QskArcMetrics::toAbsolute( const QSizeF& size ) const noexcept 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_spanAngle, hash ); diff --git a/src/common/QskArcMetrics.h b/src/common/QskArcMetrics.h index f1bee7eb..7d5d6751 100644 --- a/src/common/QskArcMetrics.h +++ b/src/common/QskArcMetrics.h @@ -50,7 +50,7 @@ class QSK_EXPORT QskArcMetrics 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&, const QskArcMetrics&, qreal progress ); diff --git a/src/common/QskBoxBorderColors.cpp b/src/common/QskBoxBorderColors.cpp index dce16657..054696dd 100644 --- a/src/common/QskBoxBorderColors.cpp +++ b/src/common/QskBoxBorderColors.cpp @@ -185,9 +185,9 @@ QVariant QskBoxBorderColors::interpolate( 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[ 2 ].hash( h ); h = m_gradients[ 3 ].hash( h ); diff --git a/src/common/QskBoxBorderColors.h b/src/common/QskBoxBorderColors.h index 5a71df73..b6ca4b68 100644 --- a/src/common/QskBoxBorderColors.h +++ b/src/common/QskBoxBorderColors.h @@ -49,7 +49,7 @@ class QSK_EXPORT QskBoxBorderColors static QVariant interpolate( const QskBoxBorderColors&, const QskBoxBorderColors&, qreal ratio ); - uint hash( uint seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const; bool isMonochrome() const; bool isVisible() const; diff --git a/src/common/QskBoxBorderMetrics.cpp b/src/common/QskBoxBorderMetrics.cpp index 5f4756cc..25de9fe6 100644 --- a/src/common/QskBoxBorderMetrics.cpp +++ b/src/common/QskBoxBorderMetrics.cpp @@ -92,9 +92,9 @@ QVariant QskBoxBorderMetrics::interpolate( 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; return qHashBits( &mode, sizeof( mode ), hash ); diff --git a/src/common/QskBoxBorderMetrics.h b/src/common/QskBoxBorderMetrics.h index 1849b789..10b7961c 100644 --- a/src/common/QskBoxBorderMetrics.h +++ b/src/common/QskBoxBorderMetrics.h @@ -55,7 +55,7 @@ class QSK_EXPORT QskBoxBorderMetrics 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&, const QskBoxBorderMetrics&, qreal progress ); diff --git a/src/common/QskBoxShapeMetrics.cpp b/src/common/QskBoxShapeMetrics.cpp index 4268b51b..09e9cc70 100644 --- a/src/common/QskBoxShapeMetrics.cpp +++ b/src/common/QskBoxShapeMetrics.cpp @@ -151,9 +151,9 @@ QVariant QskBoxShapeMetrics::interpolate( 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 ); } diff --git a/src/common/QskBoxShapeMetrics.h b/src/common/QskBoxShapeMetrics.h index 2019aaa8..637400fd 100644 --- a/src/common/QskBoxShapeMetrics.h +++ b/src/common/QskBoxShapeMetrics.h @@ -93,7 +93,7 @@ class QSK_EXPORT QskBoxShapeMetrics constexpr QskBoxShapeMetrics transposed() const noexcept; - uint hash( uint seed = 0 ) const noexcept; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; static QVariant interpolate( const QskBoxShapeMetrics&, const QskBoxShapeMetrics&, qreal progress ) noexcept; diff --git a/src/common/QskGlobal.h b/src/common/QskGlobal.h index 9bb265fe..147731e5 100644 --- a/src/common/QskGlobal.h +++ b/src/common/QskGlobal.h @@ -39,4 +39,10 @@ #define QSK_QT_PRIVATE_END \ QT_WARNING_POP +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + using QskHashValue = uint; +#else + using QskHashValue = size_t; +#endif + #endif diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 20f52daf..728b8e6a 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -412,14 +412,14 @@ bool QskGradient::hasStopAt( qreal value ) const return false; } -uint QskGradient::hash( uint seed ) const +QskHashValue QskGradient::hash( QskHashValue seed ) const { if ( m_stops.isEmpty() ) return seed; const auto o = orientation(); - uint hash = qHashBits( &o, sizeof( o ), seed ); + auto hash = qHashBits( &o, sizeof( o ), seed ); for ( const auto& stop : m_stops ) hash = stop.hash( hash ); diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index de97db9c..75005926 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -96,7 +96,7 @@ class QSK_EXPORT QskGradient static QVariant interpolate( const QskGradient&, const QskGradient&, qreal progress ); - uint hash( uint seed ) const; + QskHashValue hash( QskHashValue seed ) const; Q_INVOKABLE qreal stopAt( int index ) const; Q_INVOKABLE QColor colorAt( int index ) const; diff --git a/src/common/QskGradientStop.cpp b/src/common/QskGradientStop.cpp index b4e8f341..530a2a1d 100644 --- a/src/common/QskGradientStop.cpp +++ b/src/common/QskGradientStop.cpp @@ -44,9 +44,9 @@ void QskGradientStop::setStop( qreal position, const QColor& color ) noexcept 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 ); } diff --git a/src/common/QskGradientStop.h b/src/common/QskGradientStop.h index 640352e9..926803c9 100644 --- a/src/common/QskGradientStop.h +++ b/src/common/QskGradientStop.h @@ -41,7 +41,7 @@ class QSK_EXPORT QskGradientStop static QColor interpolated( const QskGradientStop&, const QskGradientStop&, qreal position ) noexcept; - uint hash( uint seed ) const noexcept; + QskHashValue hash( QskHashValue seed ) const noexcept; private: qreal m_position; diff --git a/src/common/QskScaleTickmarks.cpp b/src/common/QskScaleTickmarks.cpp index 201bfc67..2aab1fdb 100644 --- a/src/common/QskScaleTickmarks.cpp +++ b/src/common/QskScaleTickmarks.cpp @@ -63,7 +63,7 @@ void QskScaleTickmarks::invert() std::reverse( m_ticks[ 2 ].begin(), m_ticks[ 2 ].end() ); } -uint QskScaleTickmarks::hash( uint seed ) const +QskHashValue QskScaleTickmarks::hash( QskHashValue seed ) const { seed = qHash( m_ticks[0], seed ); seed = qHash( m_ticks[1], seed ); diff --git a/src/common/QskScaleTickmarks.h b/src/common/QskScaleTickmarks.h index 07e7e26f..45ec5708 100644 --- a/src/common/QskScaleTickmarks.h +++ b/src/common/QskScaleTickmarks.h @@ -53,7 +53,7 @@ class QSK_EXPORT QskScaleTickmarks void invert(); void reset(); - uint hash( uint seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const; private: QVector< qreal > m_ticks[ 3 ]; diff --git a/src/common/QskShadowMetrics.cpp b/src/common/QskShadowMetrics.cpp index 66a25f3f..37b951b0 100644 --- a/src/common/QskShadowMetrics.cpp +++ b/src/common/QskShadowMetrics.cpp @@ -83,9 +83,9 @@ QRectF QskShadowMetrics::shadowRect( const QRectF& sourceRect ) const 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.y(), seed ); diff --git a/src/common/QskShadowMetrics.h b/src/common/QskShadowMetrics.h index 6bcc4039..8dd4a5a2 100644 --- a/src/common/QskShadowMetrics.h +++ b/src/common/QskShadowMetrics.h @@ -56,7 +56,7 @@ class QSK_EXPORT QskShadowMetrics 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&, const QskShadowMetrics&, qreal progress ); diff --git a/src/common/QskTextColors.cpp b/src/common/QskTextColors.cpp index 10378fa7..53d80878 100644 --- a/src/common/QskTextColors.cpp +++ b/src/common/QskTextColors.cpp @@ -9,7 +9,7 @@ #include #include -uint QskTextColors::hash( uint seed ) const +QskHashValue QskTextColors::hash( QskHashValue seed ) const { const QRgb rgb[] = { textColor.rgba(), styleColor.rgba(), linkColor.rgba() }; return qHashBits( rgb, sizeof( rgb ), seed ); diff --git a/src/common/QskTextColors.h b/src/common/QskTextColors.h index 291a5de8..acd334fa 100644 --- a/src/common/QskTextColors.h +++ b/src/common/QskTextColors.h @@ -25,7 +25,7 @@ class QSK_EXPORT QskTextColors static QVariant interpolate( const QskTextColors&, const QskTextColors&, qreal ratio ); - uint hash( uint seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const; QColor textColor; QColor styleColor; diff --git a/src/common/QskTextOptions.cpp b/src/common/QskTextOptions.cpp index 40ee67f9..9ab853e2 100644 --- a/src/common/QskTextOptions.cpp +++ b/src/common/QskTextOptions.cpp @@ -50,9 +50,9 @@ QskTextOptions::TextFormat QskTextOptions::effectiveFormat( const QString& text return m_format; } -uint qHash( const QskTextOptions& options, uint seed ) noexcept +QskHashValue qHash( const QskTextOptions& options, QskHashValue seed ) noexcept { - uint hash; + QskHashValue hash; hash = qHash( options.maximumLineCount(), seed ); hash = qHash( options.fontSizeMode(), hash ); diff --git a/src/common/QskTextOptions.h b/src/common/QskTextOptions.h index c585aa89..1aeff827 100644 --- a/src/common/QskTextOptions.h +++ b/src/common/QskTextOptions.h @@ -164,7 +164,7 @@ inline constexpr bool QskTextOptions::operator!=( return !( *this == other ); } -QSK_EXPORT uint qHash( const QskTextOptions&, uint seed = 0 ) noexcept; +QSK_EXPORT QskHashValue qHash( const QskTextOptions&, QskHashValue seed = 0 ) noexcept; #ifndef QT_NO_DEBUG_STREAM class QDebug; diff --git a/src/graphic/QskGraphic.cpp b/src/graphic/QskGraphic.cpp index 97feb70d..8355107b 100644 --- a/src/graphic/QskGraphic.cpp +++ b/src/graphic/QskGraphic.cpp @@ -1007,7 +1007,7 @@ quint64 QskGraphic::modificationId() const return m_data->modificationId; } -uint QskGraphic::hash( uint seed ) const +QskHashValue QskGraphic::hash( QskHashValue seed ) const { auto hash = qHash( m_data->renderHints, seed ); diff --git a/src/graphic/QskGraphic.h b/src/graphic/QskGraphic.h index 23cceb01..ff27938f 100644 --- a/src/graphic/QskGraphic.h +++ b/src/graphic/QskGraphic.h @@ -127,7 +127,7 @@ class QSK_EXPORT QskGraphic : public QPaintDevice static QskGraphic fromPixmapAsImage( const QPixmap& ); quint64 modificationId() const; - uint hash( uint seed ) const; + QskHashValue hash( QskHashValue seed ) const; protected: virtual QSize sizeMetrics() const; diff --git a/src/nodes/QskArcNode.cpp b/src/nodes/QskArcNode.cpp index 532375a7..698e8364 100644 --- a/src/nodes/QskArcNode.cpp +++ b/src/nodes/QskArcNode.cpp @@ -32,9 +32,9 @@ void QskArcNode::paint( QPainter* painter, const QSizeF& size ) renderer.renderArc( rect, m_metrics, m_gradient, painter ); } -uint QskArcNode::hash() const +QskHashValue QskArcNode::hash() const { - uint h = m_metrics.hash(); + auto h = m_metrics.hash(); for( const auto& stop : qAsConst( m_gradient.stops() ) ) h = stop.hash( h ); diff --git a/src/nodes/QskArcNode.h b/src/nodes/QskArcNode.h index 191c271b..0bf3724c 100644 --- a/src/nodes/QskArcNode.h +++ b/src/nodes/QskArcNode.h @@ -20,7 +20,7 @@ class QSK_EXPORT QskArcNode : public QskPaintedNode const QskGradient&, QQuickWindow* ); void paint( QPainter* painter, const QSizeF& size ) override; - uint hash() const override; + QskHashValue hash() const override; private: QskArcMetrics m_metrics; diff --git a/src/nodes/QskBoxClipNode.cpp b/src/nodes/QskBoxClipNode.cpp index 9408e22a..40b288e0 100644 --- a/src/nodes/QskBoxClipNode.cpp +++ b/src/nodes/QskBoxClipNode.cpp @@ -9,10 +9,10 @@ #include "QskBoxShapeMetrics.h" #include "QskFunctions.h" -static inline uint qskMetricsHash( +static inline QskHashValue qskMetricsHash( const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border ) { - uint hash = 13000; + QskHashValue hash = 13000; hash = shape.hash( hash ); return border.hash( hash ); @@ -32,7 +32,7 @@ QskBoxClipNode::~QskBoxClipNode() void QskBoxClipNode::setBox( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border ) { - const uint hash = qskMetricsHash( shape, border ); + const auto hash = qskMetricsHash( shape, border ); if ( hash == m_hash && rect == m_rect ) return; diff --git a/src/nodes/QskBoxClipNode.h b/src/nodes/QskBoxClipNode.h index 0eb6d05d..48194062 100644 --- a/src/nodes/QskBoxClipNode.h +++ b/src/nodes/QskBoxClipNode.h @@ -22,7 +22,7 @@ class QSK_EXPORT QskBoxClipNode : public QSGClipNode const QskBoxShapeMetrics&, const QskBoxBorderMetrics& ); private: - uint m_hash; + QskHashValue m_hash; QRectF m_rect; QSGGeometry m_geometry; diff --git a/src/nodes/QskBoxNode.cpp b/src/nodes/QskBoxNode.cpp index 59ac1343..a8457684 100644 --- a/src/nodes/QskBoxNode.cpp +++ b/src/nodes/QskBoxNode.cpp @@ -20,19 +20,19 @@ QSK_QT_PRIVATE_END Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialVertex ) -static inline uint qskMetricsHash( +static inline QskHashValue qskMetricsHash( const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics ) { - uint hash = 13000; + QskHashValue hash = 13000; hash = shape.hash( hash ); return borderMetrics.hash( hash ); } -static inline uint qskColorsHash( +static inline QskHashValue qskColorsHash( const QskBoxBorderColors& borderColors, const QskGradient& fillGradient ) { - uint hash = 13000; + QskHashValue hash = 13000; hash = borderColors.hash( hash ); return fillGradient.hash( hash ); } @@ -45,8 +45,8 @@ class QskBoxNodePrivate final : public QSGGeometryNodePrivate { } - uint metricsHash = 0; - uint colorsHash = 0; + QskHashValue metricsHash = 0; + QskHashValue colorsHash = 0; QRectF rect; QSGGeometry geometry; @@ -89,8 +89,8 @@ void QskBoxNode::setBoxData( const QRectF& rect, #endif #if 1 - const uint metricsHash = qskMetricsHash( shape, borderMetrics ); - const uint colorsHash = qskColorsHash( borderColors, fillGradient ); + const auto metricsHash = qskMetricsHash( shape, borderMetrics ); + const auto colorsHash = qskColorsHash( borderColors, fillGradient ); if ( ( metricsHash == d->metricsHash ) && ( colorsHash == d->colorsHash ) && ( rect == d->rect ) ) diff --git a/src/nodes/QskGraphicNode.cpp b/src/nodes/QskGraphicNode.cpp index 4c0b9943..4e3e4d79 100644 --- a/src/nodes/QskGraphicNode.cpp +++ b/src/nodes/QskGraphicNode.cpp @@ -8,11 +8,11 @@ #include "QskColorFilter.h" #include "QskPainterCommand.h" -static inline uint qskHash( +static inline QskHashValue qskHash( const QskGraphic& graphic, const QskColorFilter& colorFilter, QskTextureRenderer::RenderMode renderMode ) { - uint hash = 12000; + QskHashValue hash = 12000; const auto& substitutions = colorFilter.substitutions(); if ( substitutions.size() > 0 ) diff --git a/src/nodes/QskGraphicNode.h b/src/nodes/QskGraphicNode.h index 1e814513..3d5925b5 100644 --- a/src/nodes/QskGraphicNode.h +++ b/src/nodes/QskGraphicNode.h @@ -28,7 +28,7 @@ class QSK_EXPORT QskGraphicNode : public QskTextureNode void setTexture( QQuickWindow*, const QRectF&, uint id, Qt::Orientations ) = delete; - uint m_hash; + QskHashValue m_hash; }; #endif diff --git a/src/nodes/QskPaintedNode.h b/src/nodes/QskPaintedNode.h index cb1ccf15..6b53ab6a 100644 --- a/src/nodes/QskPaintedNode.h +++ b/src/nodes/QskPaintedNode.h @@ -22,7 +22,7 @@ class QSK_EXPORT QskPaintedNode : public QskTextureNode virtual void paint( QPainter*, const QSizeF& ) = 0; // a hash value of '0' always results in repainting - virtual uint hash() const = 0; + virtual QskHashValue hash() const = 0; private: class PaintHelper; @@ -30,7 +30,7 @@ class QSK_EXPORT QskPaintedNode : public QskTextureNode void setTexture( QQuickWindow*, const QRectF&, uint id, Qt::Orientations ) = delete; - uint m_hash; + QskHashValue m_hash; }; #endif diff --git a/src/nodes/QskTextNode.cpp b/src/nodes/QskTextNode.cpp index 67fe053d..15b211fa 100644 --- a/src/nodes/QskTextNode.cpp +++ b/src/nodes/QskTextNode.cpp @@ -11,12 +11,12 @@ #include #include -static inline uint qskHash( +static inline QskHashValue qskHash( const QString& text, const QSizeF& size, const QFont& font, const QskTextOptions& options, const QskTextColors& colors, Qt::Alignment alignment, Qsk::TextStyle textStyle ) { - uint hash = 11000; + QskHashValue hash = 11000; hash = qHash( text, hash ); hash = qHash( font, hash ); @@ -49,7 +49,7 @@ void QskTextNode::setTextData( if ( matrix != this->matrix() ) // avoid setting DirtyMatrix accidently setMatrix( matrix ); - const uint hash = qskHash( text, rect.size(), font, + const auto hash = qskHash( text, rect.size(), font, options, colors, alignment, textStyle ); if ( hash != m_hash ) diff --git a/src/nodes/QskTextNode.h b/src/nodes/QskTextNode.h index f09328ba..a5bff603 100644 --- a/src/nodes/QskTextNode.h +++ b/src/nodes/QskTextNode.h @@ -29,7 +29,7 @@ class QSK_EXPORT QskTextNode : public QSGTransformNode Qt::Alignment, Qsk::TextStyle ); private: - uint m_hash; + QskHashValue m_hash; }; #endif diff --git a/src/nodes/QskTickmarksNode.cpp b/src/nodes/QskTickmarksNode.cpp index bf06f862..b2a1df04 100644 --- a/src/nodes/QskTickmarksNode.cpp +++ b/src/nodes/QskTickmarksNode.cpp @@ -34,7 +34,7 @@ class QskTickmarksNodePrivate final : public QSGGeometryNodePrivate QRectF rect; int lineWidth = 0; - uint hash = 0; + QskHashValue hash = 0; }; QskTickmarksNode::QskTickmarksNode() @@ -65,7 +65,7 @@ void QskTickmarksNode::update( markDirty( QSGNode::DirtyGeometry ); } - const uint hash = tickmarks.hash( 17435 ); + const auto hash = tickmarks.hash( 17435 ); if( ( hash != d->hash ) || ( rect != d->rect ) ) { From f86e38ef1213417c28fc71c902a4a1b532838f4b Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 10:29:12 +0100 Subject: [PATCH 053/107] using reserve where possible --- examples/listbox/main.cpp | 7 ++++++- src/common/QskGradient.cpp | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp index 582740d8..487796aa 100644 --- a/examples/listbox/main.cpp +++ b/examples/listbox/main.cpp @@ -34,9 +34,14 @@ class ListBox : public QskSimpleListBox private: void populate() { + const int count = 10000; + const QString format( "Row %1: The quick brown fox jumps over the lazy dog" ); + QStringList entries; - for ( int i = 0; i < 10000; i++ ) + entries.reserve( count ); + + for ( int i = 0; i < count; i++ ) { entries += format.arg( i + 1 ); } diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 728b8e6a..4da8eff8 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -182,6 +182,7 @@ static inline QskGradientStops qskExtractedStops( static inline QskGradientStops qskGradientStops( const QGradientStops& qtStops ) { QskGradientStops stops; + stops.reserve( qtStops.count() ); for ( const auto& s : qtStops ) stops += QskGradientStop( s.first, s.second ); From 50ca826ff69513cb5863243699feb7a33f40db44 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 10:30:25 +0100 Subject: [PATCH 054/107] build options adjusted --- features/qskconfig.pri | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/features/qskconfig.pri b/features/qskconfig.pri index 136c76b8..1be67bbe 100644 --- a/features/qskconfig.pri +++ b/features/qskconfig.pri @@ -73,7 +73,7 @@ linux { # Qt headers do not stand pedantic checks, so it's better # to exclude them by declaring them as system includes - #CONFIG += qtassysteminclude + CONFIG += qtassysteminclude } qtassysteminclude { @@ -86,6 +86,7 @@ linux { QMAKE_CXXFLAGS += \ -isystem $$[QT_INSTALL_HEADERS]/QtCore \ + -isystem $$[QT_INSTALL_HEADERS]/QtCore/$$[QT_VERSION]/QtCore \ -isystem $$[QT_INSTALL_HEADERS]/QtGui \ -isystem $$[QT_INSTALL_HEADERS]/QtGui/$$[QT_VERSION]/QtGui \ -isystem $$[QT_INSTALL_HEADERS]/QtQuick \ @@ -116,7 +117,7 @@ pedantic { QMAKE_CXXFLAGS *= -pedantic-errors QMAKE_CXXFLAGS *= -Wextra QMAKE_CXXFLAGS *= -Werror=format-security - QMAKE_CXXFLAGS *= -Wlogical-op + #QMAKE_CXXFLAGS *= -Wlogical-op # QMAKE_CXXFLAGS *= -Wconversion # QMAKE_CXXFLAGS *= -Wfloat-equal From b1ac6fed571b4fa1b58b09a0a6c4dcdc315fb309 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 10:31:09 +0100 Subject: [PATCH 055/107] signal signature fixed --- qmlexport/QskShortcutQml.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qmlexport/QskShortcutQml.h b/qmlexport/QskShortcutQml.h index a6fb1adc..3604a198 100644 --- a/qmlexport/QskShortcutQml.h +++ b/qmlexport/QskShortcutQml.h @@ -79,7 +79,7 @@ class QskShortcutQml : public QObject, public QQmlParserStatus void activated(); void activatedAmbiguously(); - int shortcutIdChanged( int ); + void shortcutIdChanged( int ); protected: bool event( QEvent* ) override; From c3eb20ee98eccc13cc554169b637534aad4c1e11 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 10:32:14 +0100 Subject: [PATCH 056/107] using QStringLiteral --- qmlexport/QskQml.cpp | 4 ++-- skins/material/QskMaterialSkin.cpp | 2 +- skins/squiek/QskSquiekSkin.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qmlexport/QskQml.cpp b/qmlexport/QskQml.cpp index 4cbbd7ea..d247ecf4 100644 --- a/qmlexport/QskQml.cpp +++ b/qmlexport/QskQml.cpp @@ -114,8 +114,8 @@ namespace static inline QskGradientStop qskToGradientStop( const QJSValue& value ) { return QskGradientStop( - value.property( QLatin1String( "position" ) ).toNumber(), - value.property( QLatin1String( "color" ) ).toVariant().value< QColor >() + value.property( QStringLiteral( "position" ) ).toNumber(), + value.property( QStringLiteral( "color" ) ).toVariant().value< QColor >() ); } diff --git a/skins/material/QskMaterialSkin.cpp b/skins/material/QskMaterialSkin.cpp index 2bf3432d..a096179e 100644 --- a/skins/material/QskMaterialSkin.cpp +++ b/skins/material/QskMaterialSkin.cpp @@ -785,7 +785,7 @@ QskMaterialSkin::QskMaterialSkin( QObject* parent ) QskRgb::Blue500, QskRgb::White ); // Default theme colors - setupFonts( "Roboto" ); + setupFonts( QStringLiteral( "Roboto" ) ); auto buttonFont = font( QskSkin::DefaultFont ); buttonFont.setCapitalization( QFont::AllUppercase ); diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index 377141c7..f7031ae1 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -941,7 +941,7 @@ QskSquiekSkin::QskSquiekSkin( QObject* parent ) : Inherited( parent ) , m_data( new PrivateData() ) { - setupFonts( "DejaVuSans" ); + setupFonts( QStringLiteral( "DejaVuSans" ) ); Editor editor( &hintTable(), m_data->palette ); editor.setup(); From d46f63fef1f5dfddfae0e7088f33b3194f73dda9 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 11:05:36 +0100 Subject: [PATCH 057/107] LICENSE/README for Kiwi added --- playground/anchors/kiwi/LICENSE-Kiwi | 71 ++++++++++++++++++++++++++++ playground/anchors/kiwi/README-Kiwi | 17 +++++++ playground/anchors/kiwi/Solver.cpp | 9 ---- 3 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 playground/anchors/kiwi/LICENSE-Kiwi create mode 100644 playground/anchors/kiwi/README-Kiwi diff --git a/playground/anchors/kiwi/LICENSE-Kiwi b/playground/anchors/kiwi/LICENSE-Kiwi new file mode 100644 index 00000000..c34aff71 --- /dev/null +++ b/playground/anchors/kiwi/LICENSE-Kiwi @@ -0,0 +1,71 @@ +========================= + The Kiwi licensing terms +========================= +Kiwi is licensed under the terms of the Modified BSD License (also known as +New or Revised BSD), as follows: + +Copyright (c) 2013, Nucleic Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the name of the Nucleic Development Team nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +About Kiwi +---------- +Chris Colbert began the Kiwi project in December 2013 in an effort to +create a blisteringly fast UI constraint solver. Chris is still the +project lead. + +The Nucleic Development Team is the set of all contributors to the Nucleic +project and its subprojects. + +The core team that coordinates development on GitHub can be found here: +http://github.com/nucleic. The current team consists of: + +* Chris Colbert + +Our Copyright Policy +-------------------- +Nucleic uses a shared copyright model. Each contributor maintains copyright +over their contributions to Nucleic. But, it is important to note that these +contributions are typically only changes to the repositories. Thus, the Nucleic +source code, in its entirety is not the copyright of any single person or +institution. Instead, it is the collective copyright of the entire Nucleic +Development Team. If individual contributors want to maintain a record of what +changes/contributions they have specific copyright on, they should indicate +their copyright in the commit message of the change, when they commit the +change to one of the Nucleic repositories. + +With this in mind, the following banner should be used in any source code file +to indicate the copyright and license terms: + +#------------------------------------------------------------------------------ +# Copyright (c) 2013, Nucleic Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file LICENSE, distributed with this software. +#------------------------------------------------------------------------------ diff --git a/playground/anchors/kiwi/README-Kiwi b/playground/anchors/kiwi/README-Kiwi new file mode 100644 index 00000000..a06b5488 --- /dev/null +++ b/playground/anchors/kiwi/README-Kiwi @@ -0,0 +1,17 @@ +This code is a stripped down version of the implementation of the Cassowary constraint +solving algorithm of the Kiwi project: + + https://github.com/nucleic/kiwi + +All credits go to the Nucleic Development Team ! + +For the QSkinny use case the following adjustments have been made: + + - implementations moved from *.h to *.cpp files + + - replacing AssocVector from the Loki Library by yet another stupid + implementation of a "flat map" + +I forgot what version of Kiwi had been used - a migration of the code +for a more recent official version will happen soon. + diff --git a/playground/anchors/kiwi/Solver.cpp b/playground/anchors/kiwi/Solver.cpp index 3c94c567..a0a6a9b5 100644 --- a/playground/anchors/kiwi/Solver.cpp +++ b/playground/anchors/kiwi/Solver.cpp @@ -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 "Constraint.h" #include "Variable.h" From eaa5a63278b2785368a34ef69f0919219badf7f1 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 11:21:32 +0100 Subject: [PATCH 058/107] hash calls harmonized --- src/common/QskScaleTickmarks.cpp | 2 +- src/common/QskScaleTickmarks.h | 2 +- src/common/QskTextColors.cpp | 2 +- src/common/QskTextColors.h | 2 +- src/common/QskTextOptions.cpp | 14 ++++++-------- src/common/QskTextOptions.h | 4 ++-- src/nodes/QskTextNode.cpp | 2 +- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/common/QskScaleTickmarks.cpp b/src/common/QskScaleTickmarks.cpp index 2aab1fdb..836fc474 100644 --- a/src/common/QskScaleTickmarks.cpp +++ b/src/common/QskScaleTickmarks.cpp @@ -63,7 +63,7 @@ void QskScaleTickmarks::invert() std::reverse( m_ticks[ 2 ].begin(), m_ticks[ 2 ].end() ); } -QskHashValue QskScaleTickmarks::hash( QskHashValue seed ) const +QskHashValue QskScaleTickmarks::hash( QskHashValue seed ) const noexcept { seed = qHash( m_ticks[0], seed ); seed = qHash( m_ticks[1], seed ); diff --git a/src/common/QskScaleTickmarks.h b/src/common/QskScaleTickmarks.h index 45ec5708..0eb859fe 100644 --- a/src/common/QskScaleTickmarks.h +++ b/src/common/QskScaleTickmarks.h @@ -53,7 +53,7 @@ class QSK_EXPORT QskScaleTickmarks void invert(); void reset(); - QskHashValue hash( QskHashValue seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; private: QVector< qreal > m_ticks[ 3 ]; diff --git a/src/common/QskTextColors.cpp b/src/common/QskTextColors.cpp index 53d80878..787aa258 100644 --- a/src/common/QskTextColors.cpp +++ b/src/common/QskTextColors.cpp @@ -9,7 +9,7 @@ #include #include -QskHashValue QskTextColors::hash( QskHashValue seed ) const +QskHashValue QskTextColors::hash( QskHashValue seed ) const noexcept { const QRgb rgb[] = { textColor.rgba(), styleColor.rgba(), linkColor.rgba() }; return qHashBits( rgb, sizeof( rgb ), seed ); diff --git a/src/common/QskTextColors.h b/src/common/QskTextColors.h index acd334fa..45859135 100644 --- a/src/common/QskTextColors.h +++ b/src/common/QskTextColors.h @@ -25,7 +25,7 @@ class QSK_EXPORT QskTextColors static QVariant interpolate( const QskTextColors&, const QskTextColors&, qreal ratio ); - QskHashValue hash( QskHashValue seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; QColor textColor; QColor styleColor; diff --git a/src/common/QskTextOptions.cpp b/src/common/QskTextOptions.cpp index 9ab853e2..c3a3c3c1 100644 --- a/src/common/QskTextOptions.cpp +++ b/src/common/QskTextOptions.cpp @@ -50,15 +50,13 @@ QskTextOptions::TextFormat QskTextOptions::effectiveFormat( const QString& text return m_format; } -QskHashValue qHash( const QskTextOptions& options, QskHashValue seed ) noexcept +QskHashValue QskTextOptions::hash( QskHashValue seed ) const noexcept { - QskHashValue hash; - - hash = qHash( options.maximumLineCount(), seed ); - hash = qHash( options.fontSizeMode(), hash ); - hash = qHash( options.wrapMode(), hash ); - hash = qHash( options.format(), hash ); - hash = qHash( options.elideMode(), hash ); + auto hash = qHash( m_maximumLineCount, seed ); + hash = qHash( m_fontSizeMode, hash ); + hash = qHash( m_wrapMode, hash ); + hash = qHash( m_format, hash ); + hash = qHash( m_elideMode, hash ); return hash; } diff --git a/src/common/QskTextOptions.h b/src/common/QskTextOptions.h index 1aeff827..b10b20cb 100644 --- a/src/common/QskTextOptions.h +++ b/src/common/QskTextOptions.h @@ -74,6 +74,8 @@ class QSK_EXPORT QskTextOptions 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; private: @@ -164,8 +166,6 @@ inline constexpr bool QskTextOptions::operator!=( return !( *this == other ); } -QSK_EXPORT QskHashValue qHash( const QskTextOptions&, QskHashValue seed = 0 ) noexcept; - #ifndef QT_NO_DEBUG_STREAM class QDebug; diff --git a/src/nodes/QskTextNode.cpp b/src/nodes/QskTextNode.cpp index 15b211fa..75177271 100644 --- a/src/nodes/QskTextNode.cpp +++ b/src/nodes/QskTextNode.cpp @@ -20,7 +20,7 @@ static inline QskHashValue qskHash( hash = qHash( text, hash ); hash = qHash( font, hash ); - hash = qHash( options, hash ); + hash = options.hash( hash ); hash = qHash( alignment, hash ); hash = qHash( textStyle, hash ); hash = colors.hash( hash ); From 6907cd0e28207d4d162723d8ed5629e1805f9aeb Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 13:39:18 +0100 Subject: [PATCH 059/107] remove/take fixed --- src/graphic/QskGraphicProviderMap.cpp | 13 +++++-------- src/graphic/QskGraphicProviderMap.h | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/graphic/QskGraphicProviderMap.cpp b/src/graphic/QskGraphicProviderMap.cpp index bdd37f92..78e6fcae 100644 --- a/src/graphic/QskGraphicProviderMap.cpp +++ b/src/graphic/QskGraphicProviderMap.cpp @@ -48,11 +48,7 @@ void QskGraphicProviderMap::insert( void QskGraphicProviderMap::remove( const QString& providerId ) { - const auto it = m_data->hashTab.constFind( qskKey( providerId ) ); - if ( it == m_data->hashTab.constEnd() ) - delete it.value(); - - m_data->hashTab.erase( it ); + delete take( providerId ); } QskGraphicProvider* QskGraphicProviderMap::take( const QString& providerId ) @@ -60,10 +56,11 @@ QskGraphicProvider* QskGraphicProviderMap::take( const QString& providerId ) QskGraphicProvider* provider = nullptr; const auto it = m_data->hashTab.constFind( qskKey( providerId ) ); - if ( it == m_data->hashTab.constEnd() ) + if ( it != m_data->hashTab.constEnd() ) + { provider = it.value(); - - m_data->hashTab.erase( it ); + m_data->hashTab.erase( it ); + } return provider; } diff --git a/src/graphic/QskGraphicProviderMap.h b/src/graphic/QskGraphicProviderMap.h index 119dab2c..607217cf 100644 --- a/src/graphic/QskGraphicProviderMap.h +++ b/src/graphic/QskGraphicProviderMap.h @@ -12,7 +12,7 @@ class QskGraphicProvider; class QString; -class QSK_EXPORT QskGraphicProviderMap +class QskGraphicProviderMap { public: QskGraphicProviderMap(); From ff8af3b0ee0abd0b0ca079bc8f9ffb6fca0289cd Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 13:39:50 +0100 Subject: [PATCH 060/107] ordered build removed --- qskinny.pro | 2 -- 1 file changed, 2 deletions(-) diff --git a/qskinny.pro b/qskinny.pro index 8943d9f7..7a41eef1 100644 --- a/qskinny.pro +++ b/qskinny.pro @@ -1,7 +1,5 @@ TEMPLATE = subdirs -CONFIG += ordered - SUBDIRS = \ src \ skins \ From 1b94e86e4bddb936072ded83160016a627c4e8dd Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 16:22:02 +0100 Subject: [PATCH 061/107] Q_OBJECT added --- src/inputpanel/QskPinyinTextPredictor.cpp | 2 ++ src/inputpanel/QskPinyinTextPredictor.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/inputpanel/QskPinyinTextPredictor.cpp b/src/inputpanel/QskPinyinTextPredictor.cpp index 4c849ab6..b26d04d5 100644 --- a/src/inputpanel/QskPinyinTextPredictor.cpp +++ b/src/inputpanel/QskPinyinTextPredictor.cpp @@ -102,3 +102,5 @@ void QskPinyinTextPredictor::request( const QString& text ) m_data->candidates = candidates; Q_EMIT predictionChanged(); } + +#include "moc_QskPinyinTextPredictor.cpp" diff --git a/src/inputpanel/QskPinyinTextPredictor.h b/src/inputpanel/QskPinyinTextPredictor.h index 09ad51c8..fa671d2c 100644 --- a/src/inputpanel/QskPinyinTextPredictor.h +++ b/src/inputpanel/QskPinyinTextPredictor.h @@ -12,6 +12,8 @@ class QSK_INPUTCONTEXT_EXPORT QskPinyinTextPredictor : public QskTextPredictor { + Q_OBJECT + using Inherited = QskTextPredictor; public: From d6c4968d3cac10eea3648c9b31156ba5172662f8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 18:04:41 +0100 Subject: [PATCH 062/107] using QSK_EVENT_DISABLE_COPY --- src/controls/QskEvent.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/controls/QskEvent.h b/src/controls/QskEvent.h index bd5b8e90..79219abd 100644 --- a/src/controls/QskEvent.h +++ b/src/controls/QskEvent.h @@ -23,6 +23,19 @@ class QWheelEvent; class QHoverEvent; class QKeyEvent; +#ifdef Q_EVENT_DISABLE_COPY + + #define QSK_EVENT_DISABLE_COPY Q_EVENT_DISABLE_COPY; + +#else + #define QSK_EVENT_DISABLE_COPY(Class) \ + protected: \ + Class(const Class &) = default; \ + Class(Class &&) = delete; \ + Class &operator=(const Class &other) = default; \ + Class &operator=(Class &&) = delete; +#endif + class QSK_EXPORT QskEvent : public QEvent { public: @@ -53,6 +66,9 @@ class QSK_EXPORT QskEvent : public QEvent virtual QskEvent* clone() const; #endif + private: + QSK_EVENT_DISABLE_COPY( QskEvent ) + }; class QSK_EXPORT QskGeometryChangeEvent : public QskEvent @@ -69,6 +85,8 @@ class QSK_EXPORT QskGeometryChangeEvent : public QskEvent QskGeometryChangeEvent* clone() const override; private: + QSK_EVENT_DISABLE_COPY( QskGeometryChangeEvent ) + const QRectF m_rect; const QRectF m_oldRect; }; @@ -84,6 +102,8 @@ class QSK_EXPORT QskWindowChangeEvent : public QskEvent QskWindowChangeEvent* clone() const override; private: + QSK_EVENT_DISABLE_COPY( QskWindowChangeEvent ) + QQuickWindow* const m_oldWindow; QQuickWindow* const m_window; }; @@ -98,6 +118,8 @@ class QSK_EXPORT QskPopupEvent : public QskEvent QskPopupEvent* clone() const override; private: + QSK_EVENT_DISABLE_COPY( QskPopupEvent ) + QskPopup* const m_popup; }; @@ -111,6 +133,8 @@ class QSK_EXPORT QskGestureEvent : public QskEvent QskGestureEvent* clone() const override; private: + QSK_EVENT_DISABLE_COPY( QskGestureEvent ) + std::shared_ptr< const QskGesture > m_gesture; }; @@ -131,6 +155,8 @@ class QSK_EXPORT QskAnimatorEvent : public QskEvent QskAnimatorEvent* clone() const override; private: + QSK_EVENT_DISABLE_COPY( QskAnimatorEvent ) + const QskAspect m_aspect; const State m_state; }; From 28c47725e25e39e03bd217231db3dcf613a4c70a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 18:17:14 +0100 Subject: [PATCH 063/107] do not like protected keywords in macros --- src/controls/QskEvent.h | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/controls/QskEvent.h b/src/controls/QskEvent.h index 79219abd..83dd0b5f 100644 --- a/src/controls/QskEvent.h +++ b/src/controls/QskEvent.h @@ -23,18 +23,11 @@ class QWheelEvent; class QHoverEvent; class QKeyEvent; -#ifdef Q_EVENT_DISABLE_COPY - - #define QSK_EVENT_DISABLE_COPY Q_EVENT_DISABLE_COPY; - -#else - #define QSK_EVENT_DISABLE_COPY(Class) \ - protected: \ - Class(const Class &) = default; \ - Class(Class &&) = delete; \ - Class &operator=(const Class &other) = default; \ - Class &operator=(Class &&) = delete; -#endif +#define QSK_EVENT_DISABLE_COPY(Class) \ + Class(const Class &) = default; \ + Class(Class &&) = delete; \ + Class &operator=(const Class &other) = default; \ + Class &operator=(Class &&) = delete; class QSK_EXPORT QskEvent : public QEvent { @@ -66,9 +59,8 @@ class QSK_EXPORT QskEvent : public QEvent virtual QskEvent* clone() const; #endif - private: + protected: QSK_EVENT_DISABLE_COPY( QskEvent ) - }; class QSK_EXPORT QskGeometryChangeEvent : public QskEvent @@ -84,9 +76,10 @@ class QSK_EXPORT QskGeometryChangeEvent : public QskEvent QskGeometryChangeEvent* clone() const override; - private: + protected: QSK_EVENT_DISABLE_COPY( QskGeometryChangeEvent ) + private: const QRectF m_rect; const QRectF m_oldRect; }; @@ -101,9 +94,10 @@ class QSK_EXPORT QskWindowChangeEvent : public QskEvent QskWindowChangeEvent* clone() const override; - private: + protected: QSK_EVENT_DISABLE_COPY( QskWindowChangeEvent ) + private: QQuickWindow* const m_oldWindow; QQuickWindow* const m_window; }; @@ -117,9 +111,10 @@ class QSK_EXPORT QskPopupEvent : public QskEvent QskPopupEvent* clone() const override; - private: + protected: QSK_EVENT_DISABLE_COPY( QskPopupEvent ) + private: QskPopup* const m_popup; }; @@ -132,9 +127,10 @@ class QSK_EXPORT QskGestureEvent : public QskEvent QskGestureEvent* clone() const override; - private: + protected: QSK_EVENT_DISABLE_COPY( QskGestureEvent ) + private: std::shared_ptr< const QskGesture > m_gesture; }; @@ -154,9 +150,10 @@ class QSK_EXPORT QskAnimatorEvent : public QskEvent QskAnimatorEvent* clone() const override; - private: + protected: QSK_EVENT_DISABLE_COPY( QskAnimatorEvent ) + private: const QskAspect m_aspect; const State m_state; }; From 3aa320f233053ea14078bc9e050166a0f4088a0a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sat, 26 Mar 2022 16:22:47 +0100 Subject: [PATCH 064/107] accepting hover events as default --- src/controls/QskTextInput.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controls/QskTextInput.cpp b/src/controls/QskTextInput.cpp index 800b6de4..5a76f81d 100644 --- a/src/controls/QskTextInput.cpp +++ b/src/controls/QskTextInput.cpp @@ -295,6 +295,8 @@ QskTextInput::QskTextInput( QQuickItem* parent ) m_data->hasPanel = true; setPolishOnResize( true ); + + setAcceptHoverEvents( true ); setFocusPolicy( Qt::StrongFocus ); setFlag( QQuickItem::ItemAcceptsInputMethod ); From 7778baecc5f5cbc850be1dbce50a0801c45dbc98 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 27 Mar 2022 17:54:16 +0200 Subject: [PATCH 065/107] alpha -> opacity --- src/common/QskRgbValue.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/QskRgbValue.h b/src/common/QskRgbValue.h index 6fea8d95..9f7a3d9b 100644 --- a/src/common/QskRgbValue.h +++ b/src/common/QskRgbValue.h @@ -461,19 +461,19 @@ namespace QskRgb return ( rgb & ColorMask ) | ( ( static_cast< uint >( alpha ) & 0xffu ) << 24 ); } - inline QColor toTransparentF( const QColor& color, qreal alpha ) + inline QColor toTransparentF( const QColor& color, qreal opacity ) { - return toTransparent( color, qRound( alpha * 255 ) ); + return toTransparent( color, qRound( opacity * 255 ) ); } - inline QColor toTransparentF( Qt::GlobalColor color, qreal alpha ) + inline QColor toTransparentF( Qt::GlobalColor color, qreal opacity ) { - return toTransparent( QColor( color ), qRound( alpha * 255 ) ); + return toTransparent( QColor( color ), qRound( opacity * 255 ) ); } - inline constexpr QRgb toTransparentF( QRgb rgb, qreal alpha ) noexcept + inline constexpr QRgb toTransparentF( QRgb rgb, qreal opacity ) noexcept { - return toTransparent( rgb, qRound( alpha * 255 ) ); + return toTransparent( rgb, qRound( opacity * 255 ) ); } QSK_EXPORT QRgb lighter( QRgb, int factor = 150 ) noexcept; From 48a8a10b629498f10414089fdb720c1947e7cdc8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 27 Mar 2022 19:05:05 +0200 Subject: [PATCH 066/107] avoid crashes, when failing loading a skin --- support/SkinnyShortcut.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 670405ca..582827fb 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -77,30 +77,31 @@ void SkinnyShortcut::enable( Types types ) void SkinnyShortcut::rotateSkin() { - const QStringList names = qskSkinManager->skinNames(); + const auto names = qskSkinManager->skinNames(); if ( names.size() <= 1 ) return; int index = names.indexOf( qskSetup->skinName() ); index = ( index + 1 ) % names.size(); - QskSkin* oldSkin = qskSetup->skin(); + auto oldSkin = qskSetup->skin(); if ( oldSkin->parent() == qskSetup ) oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - QskSkin* newSkin = qskSetup->setSkin( names[ index ] ); + if ( auto newSkin = qskSetup->setSkin( names[ index ] ) ) + { + QskSkinTransition transition; - QskSkinTransition transition; + //transition.setMask( QskAspect::Color ); // Metrics are flickering -> TODO + transition.setSourceSkin( oldSkin ); + transition.setTargetSkin( newSkin ); + transition.setAnimation( 500 ); - //transition.setMask( QskAspect::Color ); // Metrics are flickering -> TODO - transition.setSourceSkin( oldSkin ); - transition.setTargetSkin( newSkin ); - transition.setAnimation( 500 ); + transition.process(); - transition.process(); - - if ( oldSkin->parent() == nullptr ) - delete oldSkin; + if ( oldSkin->parent() == nullptr ) + delete oldSkin; + } } void SkinnyShortcut::showBackground() From f68095a0d1796bdb71338354381814e87c5aee9d Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 27 Mar 2022 19:05:40 +0200 Subject: [PATCH 067/107] making code more readable --- src/common/QskBoxBorderColors.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common/QskBoxBorderColors.cpp b/src/common/QskBoxBorderColors.cpp index 054696dd..cbb12e5d 100644 --- a/src/common/QskBoxBorderColors.cpp +++ b/src/common/QskBoxBorderColors.cpp @@ -172,8 +172,14 @@ QskBoxBorderColors QskBoxBorderColors::interpolated( for ( size_t i = 0; i < 4; i++ ) { - colors.m_gradients[ i ] = colors.m_gradients[ i ].interpolated( - to.m_gradients[ i ], ratio ); +#if 1 + /* + When one border has a width of 0 we would prefer to ignore + the color and use always use the other color. TODO ... + */ +#endif + auto& gradient = colors.m_gradients[ i ]; + gradient = gradient.interpolated( to.m_gradients[ i ], ratio ); } return colors; From 60e27536e8f106386388df9c79f06e3b8d59280e Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 27 Mar 2022 19:06:29 +0200 Subject: [PATCH 068/107] using QString::compare --- skins/material/QskMaterialSkinFactory.cpp | 2 +- skins/squiek/QskSquiekSkinFactory.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/skins/material/QskMaterialSkinFactory.cpp b/skins/material/QskMaterialSkinFactory.cpp index 1b68a4aa..40683a6a 100644 --- a/skins/material/QskMaterialSkinFactory.cpp +++ b/skins/material/QskMaterialSkinFactory.cpp @@ -24,7 +24,7 @@ QStringList QskMaterialSkinFactory::skinNames() const QskSkin* QskMaterialSkinFactory::createSkin( const QString& skinName ) { - if ( skinName.toLower() == materialSkinName ) + if ( QString::compare( skinName, materialSkinName, Qt::CaseInsensitive ) == 0 ) return new QskMaterialSkin(); return nullptr; diff --git a/skins/squiek/QskSquiekSkinFactory.cpp b/skins/squiek/QskSquiekSkinFactory.cpp index 16c27524..39074d24 100644 --- a/skins/squiek/QskSquiekSkinFactory.cpp +++ b/skins/squiek/QskSquiekSkinFactory.cpp @@ -24,7 +24,7 @@ QStringList QskSquiekSkinFactory::skinNames() const QskSkin* QskSquiekSkinFactory::createSkin( const QString& skinName ) { - if ( skinName.toLower() == squiekSkinName ) + if ( QString::compare( skinName, squiekSkinName, Qt::CaseInsensitive ) == 0 ) return new QskSquiekSkin(); return nullptr; From 105fdec8d7f31cbddd08d651520d8501d9765586 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 28 Mar 2022 20:15:54 +0200 Subject: [PATCH 069/107] no more page backgrounds - preparation for better themeing --- examples/gallery/Page.cpp | 18 ---------------- examples/gallery/Page.h | 7 ------- examples/gallery/label/LabelPage.cpp | 1 - examples/gallery/main.cpp | 21 ------------------- .../gallery/progressbar/ProgressBarPage.cpp | 2 -- examples/gallery/slider/SliderPage.cpp | 2 -- .../gallery/switchbutton/SwitchButtonPage.cpp | 2 -- 7 files changed, 53 deletions(-) diff --git a/examples/gallery/Page.cpp b/examples/gallery/Page.cpp index 0dbbfcf3..078d96b3 100644 --- a/examples/gallery/Page.cpp +++ b/examples/gallery/Page.cpp @@ -4,29 +4,11 @@ *****************************************************************************/ #include "Page.h" -#include Page::Page( Qt::Orientation orientation, QQuickItem* parent ) : QskLinearBox( orientation, parent ) - , m_gradient( QskRgb::GhostWhite ) { setMargins( 20 ); setPadding( 10 ); setSpacing( 10 ); } - -void Page::setGradient( const QskGradient& gradient ) -{ - if ( gradient != m_gradient ) - { - m_gradient = gradient; - - if ( parentItem() && isVisibleToParent() ) - parentItem()->update(); - } -} - -QskGradient Page::gradient() const -{ - return m_gradient; -} diff --git a/examples/gallery/Page.h b/examples/gallery/Page.h index f0404294..f8f8bf83 100644 --- a/examples/gallery/Page.h +++ b/examples/gallery/Page.h @@ -6,16 +6,9 @@ #pragma once #include -#include class Page : public QskLinearBox { public: Page( Qt::Orientation, QQuickItem* parent = nullptr ); - - void setGradient( const QskGradient& ); - QskGradient gradient() const; - - private: - QskGradient m_gradient; }; diff --git a/examples/gallery/label/LabelPage.cpp b/examples/gallery/label/LabelPage.cpp index 84f2c438..8e4a2813 100644 --- a/examples/gallery/label/LabelPage.cpp +++ b/examples/gallery/label/LabelPage.cpp @@ -67,7 +67,6 @@ namespace LabelPage::LabelPage( QQuickItem* parent ) : Page( Qt::Vertical, parent ) { - setGradient( QskRgb::AliceBlue ); setSpacing( 40 ); (void) new TextBox( this ); diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 58e52f7a..838d9106 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -30,27 +30,6 @@ namespace setMargins( 10 ); setTabPosition( Qsk::Left ); setAutoFitTabs( true ); - - connect( this, &QskTabView::currentIndexChanged, - this, &TabView::updateViewPanel ); - } - - protected: - void aboutToShow() override - { - updateViewPanel(); - } - - private: - void updateViewPanel() - { - /* - We should have a better way to set individual colors - for each tab page background - */ - - if ( auto page = dynamic_cast< const ::Page* >( currentItem() ) ) - setGradientHint( QskTabView::Page, page->gradient() ); } }; } diff --git a/examples/gallery/progressbar/ProgressBarPage.cpp b/examples/gallery/progressbar/ProgressBarPage.cpp index 75fad19e..18985ecf 100644 --- a/examples/gallery/progressbar/ProgressBarPage.cpp +++ b/examples/gallery/progressbar/ProgressBarPage.cpp @@ -45,9 +45,7 @@ namespace ProgressBarPage::ProgressBarPage( QQuickItem* parent ) : Page( Qt::Horizontal, parent ) { - setGradient( QskRgb::AliceBlue ); setSpacing( 40 ); - populate(); } diff --git a/examples/gallery/slider/SliderPage.cpp b/examples/gallery/slider/SliderPage.cpp index 4de7c647..8e164a5c 100644 --- a/examples/gallery/slider/SliderPage.cpp +++ b/examples/gallery/slider/SliderPage.cpp @@ -13,8 +13,6 @@ SliderPage::SliderPage( QQuickItem* parentItem ) : Page( Qt::Vertical, parentItem ) { - setGradient( QskRgb::PeachPuff ); - setMargins( 10 ); setSpacing( 20 ); diff --git a/examples/gallery/switchbutton/SwitchButtonPage.cpp b/examples/gallery/switchbutton/SwitchButtonPage.cpp index 169dac95..1fab35b1 100644 --- a/examples/gallery/switchbutton/SwitchButtonPage.cpp +++ b/examples/gallery/switchbutton/SwitchButtonPage.cpp @@ -15,9 +15,7 @@ SwitchButtonPage::SwitchButtonPage( QQuickItem* parent ) : Page( Qt::Horizontal, parent ) { - setGradient( QskRgb::AliceBlue ); setSpacing( 40 ); - populate(); } From 5dae58fc44d12dd408ecb52db51df5e4a67a923a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 28 Mar 2022 20:17:56 +0200 Subject: [PATCH 070/107] making code slightly more readable --- src/controls/QskSkinTransition.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index 9b769199..04c38e4e 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -315,7 +315,9 @@ namespace for ( const auto& candidate : candidates ) { - if ( !candidate.aspect.isMetric() ) + const auto aspect = candidate.aspect; + + if ( !aspect.isMetric() ) { if ( !( control->flags() & QQuickItem::ItemHasContents ) ) { @@ -325,7 +327,7 @@ namespace } } - const auto subControl = candidate.aspect.subControl(); + const auto subControl = aspect.subControl(); if ( subControl != control->effectiveSubcontrol( subControl ) ) { // The control uses subcontrol redirection, so we can assume it @@ -350,7 +352,7 @@ namespace } } - auto a = candidate.aspect; + auto a = aspect; a.setStates( control->skinStates() ); const auto requestState = control->hintStatus( a ); @@ -361,30 +363,32 @@ namespace continue; } - if ( candidate.aspect != requestState.aspect ) + if ( aspect != requestState.aspect ) { // the aspect was resolved to something else continue; } - addAnimator( control->window(), candidate, animatorHint ); - storeUpdateInfo( control, candidate.aspect ); + addAnimator( control->window(), aspect, + candidate.from, candidate.to, animatorHint ); + + storeUpdateInfo( control, aspect ); } } - void addAnimator( QQuickWindow* window, - const AnimatorCandidate& candidate, QskAnimationHint animationHint ) + void addAnimator( QQuickWindow* window, const QskAspect aspect, + const QVariant& from, const QVariant& to, QskAnimationHint animationHint ) { - auto it = m_hintAnimatorMap.find( candidate.aspect ); + auto it = m_hintAnimatorMap.find( aspect ); if ( it != m_hintAnimatorMap.end() ) return; // already there - it = m_hintAnimatorMap.emplace( candidate.aspect, QskHintAnimator() ).first; + it = m_hintAnimatorMap.emplace( aspect, QskHintAnimator() ).first; auto& animator = it->second; - animator.setAspect( candidate.aspect ); - animator.setStartValue( candidate.from ); - animator.setEndValue( candidate.to ); + animator.setAspect( aspect ); + animator.setStartValue( from ); + animator.setEndValue( to ); animator.setDuration( animationHint.duration ); animator.setEasingCurve( animationHint.type ); From a38a4a101ef3654807fb0a4e4f491b6c09f35bdc Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 28 Mar 2022 20:33:42 +0200 Subject: [PATCH 071/107] more State operators --- src/common/QskAspect.h | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/common/QskAspect.h b/src/common/QskAspect.h index 94e5bd42..fc3a94d7 100644 --- a/src/common/QskAspect.h +++ b/src/common/QskAspect.h @@ -109,8 +109,18 @@ class QSK_EXPORT QskAspect constexpr QskAspect operator|( Type ) const noexcept; constexpr QskAspect operator|( Primitive ) const noexcept; constexpr QskAspect operator|( Placement ) const noexcept; + constexpr QskAspect operator|( State ) const noexcept; + QskAspect& operator|=( State ) noexcept; + + constexpr QskAspect operator&( State ) const noexcept; + QskAspect& operator&=( State ) noexcept; + constexpr QskAspect operator|( States ) const noexcept; + QskAspect& operator|=( States ) noexcept; + + constexpr QskAspect operator&( States ) const noexcept; + QskAspect& operator&=( States ) noexcept; constexpr QskAspect stateless() const noexcept; constexpr QskAspect trunk() const noexcept; @@ -283,12 +293,48 @@ inline constexpr QskAspect QskAspect::operator|( State state ) const noexcept m_bits.primitive, m_bits.placement, m_bits.states | state ); } +inline QskAspect& QskAspect::operator|=( State state ) noexcept +{ + m_bits.states |= state; + return *this; +} + +inline constexpr QskAspect QskAspect::operator&( State state ) const noexcept +{ + return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, + m_bits.primitive, m_bits.placement, m_bits.states & state ); +} + +inline QskAspect& QskAspect::operator&=( State state ) noexcept +{ + m_bits.states &= state; + return *this; +} + inline constexpr QskAspect QskAspect::operator|( States states ) const noexcept { return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, m_bits.primitive, m_bits.placement, m_bits.states | states ); } +inline QskAspect& QskAspect::operator|=( States states ) noexcept +{ + m_bits.states |= states; + return *this; +} + +inline constexpr QskAspect QskAspect::operator&( States states ) const noexcept +{ + return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, + m_bits.primitive, m_bits.placement, m_bits.states & states ); +} + +inline QskAspect& QskAspect::operator&=( States states ) noexcept +{ + m_bits.states &= states; + return *this; +} + inline constexpr QskAspect QskAspect::stateless() const noexcept { return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, From 1eae47aefac5238e9f85e9261e794721f56d1799 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 28 Mar 2022 21:28:56 +0200 Subject: [PATCH 072/107] tracking states of the aspects in a QskSkinHintTable --- src/controls/QskSkin.cpp | 17 ------------- src/controls/QskSkin.h | 3 --- src/controls/QskSkinHintTable.cpp | 31 +++++++++++------------ src/controls/QskSkinHintTable.h | 9 ++++--- src/controls/QskSkinnable.cpp | 41 ++++++------------------------- 5 files changed, 27 insertions(+), 74 deletions(-) diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index f99dc41a..85215d98 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -128,7 +128,6 @@ class QskSkin::PrivateData std::unordered_map< const QMetaObject*, SkinletData > skinletMap; QskSkinHintTable hintTable; - QskAspect::States stateMask = QskAspect::AllStates; std::unordered_map< int, QFont > fonts; std::unordered_map< int, QskColorFilter > graphicFilters; @@ -345,22 +344,6 @@ const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const return QPlatformDialogHelper::buttonLayout( orientation, policy ); } -void QskSkin::setStateMask( QskAspect::States mask ) -{ - for ( auto state : { QskControl::Disabled, QskControl::Hovered, QskControl::Focused } ) - { - if ( mask & state ) - m_data->stateMask |= state; - else - m_data->stateMask &= ~state; - } -} - -QskAspect::States QskSkin::stateMask() const -{ - return m_data->stateMask; -} - QskSkinlet* QskSkin::skinlet( const QMetaObject* metaObject ) { while ( metaObject ) diff --git a/src/controls/QskSkin.h b/src/controls/QskSkin.h index adeb2c54..723b0115 100644 --- a/src/controls/QskSkin.h +++ b/src/controls/QskSkin.h @@ -77,9 +77,6 @@ class QSK_EXPORT QskSkin : public QObject virtual const int* dialogButtonLayout( Qt::Orientation ) const; virtual QString dialogButtonText( int button ) const; - void setStateMask( QskAspect::States ); - QskAspect::States stateMask() const; - QskSkinlet* skinlet( const QMetaObject* ); const QskSkinHintTable& hintTable() const; diff --git a/src/controls/QskSkinHintTable.cpp b/src/controls/QskSkinHintTable.cpp index 9bac96f0..d43a4434 100644 --- a/src/controls/QskSkinHintTable.cpp +++ b/src/controls/QskSkinHintTable.cpp @@ -67,7 +67,7 @@ QskSkinHintTable::QskSkinHintTable() QskSkinHintTable::QskSkinHintTable( const QskSkinHintTable& other ) : m_hints( nullptr ) , m_animatorCount( other.m_animatorCount ) - , m_statefulCount( other.m_statefulCount ) + , m_states( other.m_states ) { if ( other.m_hints ) m_hints = new HintMap( *( other.m_hints ) ); @@ -81,7 +81,7 @@ QskSkinHintTable::~QskSkinHintTable() QskSkinHintTable& QskSkinHintTable::operator=( const QskSkinHintTable& other ) { m_animatorCount = other.m_animatorCount; - m_statefulCount = other.m_statefulCount; + m_states = other.m_states; if ( other.m_hints ) { @@ -126,11 +126,7 @@ bool QskSkinHintTable::setHint( QskAspect aspect, const QVariant& skinHint ) QSK_ASSERT_COUNTER( m_animatorCount ); } - if ( aspect.hasStates() ) - { - m_statefulCount++; - QSK_ASSERT_COUNTER( m_statefulCount ); - } + m_states |= aspect.states(); return true; } @@ -158,8 +154,7 @@ bool QskSkinHintTable::removeHint( QskAspect aspect ) if ( aspect.isAnimator() ) m_animatorCount--; - if ( aspect.hasStates() ) - m_statefulCount--; + // how to clear m_states ? TODO ... if ( m_hints->empty() ) { @@ -184,8 +179,7 @@ QVariant QskSkinHintTable::takeHint( QskAspect aspect ) if ( aspect.isAnimator() ) m_animatorCount--; - if ( aspect.hasStates() ) - m_statefulCount--; + // how to clear m_states ? TODO ... if ( m_hints->empty() ) { @@ -206,14 +200,14 @@ void QskSkinHintTable::clear() m_hints = nullptr; m_animatorCount = 0; - m_statefulCount = 0; + m_states = QskAspect::NoState; } const QVariant* QskSkinHintTable::resolvedHint( QskAspect aspect, QskAspect* resolvedAspect ) const { if ( m_hints != nullptr ) - return qskResolvedHint( aspect, *m_hints, resolvedAspect ); + return qskResolvedHint( aspect & m_states, *m_hints, resolvedAspect ); return nullptr; } @@ -223,7 +217,7 @@ QskAspect QskSkinHintTable::resolvedAspect( QskAspect aspect ) const QskAspect a; if ( m_hints != nullptr ) - qskResolvedHint( aspect, *m_hints, &a ); + qskResolvedHint( aspect & m_states, *m_hints, &a ); return a; } @@ -233,6 +227,8 @@ QskAspect QskSkinHintTable::resolvedAnimator( { if ( m_hints && m_animatorCount > 0 ) { + aspect &= m_states; + Q_FOREVER { auto it = m_hints->find( aspect ); @@ -268,15 +264,16 @@ bool QskSkinHintTable::setAnimation( bool QskSkinHintTable::isResolutionMatching( QskAspect aspect1, QskAspect aspect2 ) const { + // remove states we do not have early + aspect1 &= m_states; + aspect2 &= m_states; + if ( aspect1 == aspect2 ) return true; if ( aspect1.trunk() != aspect2.trunk() ) return false; - if ( !hasStates() ) - return false; - const auto a1 = aspect1; const auto a2 = aspect2; diff --git a/src/controls/QskSkinHintTable.h b/src/controls/QskSkinHintTable.h index c1e6a647..ac246376 100644 --- a/src/controls/QskSkinHintTable.h +++ b/src/controls/QskSkinHintTable.h @@ -40,9 +40,10 @@ class QSK_EXPORT QskSkinHintTable const std::unordered_map< QskAspect, QVariant >& hints() const; bool hasAnimators() const; - bool hasStates() const; bool hasHints() const; + QskAspect::States states() const; + void clear(); const QVariant* resolvedHint( QskAspect, @@ -62,7 +63,7 @@ class QSK_EXPORT QskSkinHintTable HintMap* m_hints = nullptr; unsigned short m_animatorCount = 0; - unsigned short m_statefulCount = 0; + QskAspect::States m_states; }; inline bool QskSkinHintTable::hasHints() const @@ -70,9 +71,9 @@ inline bool QskSkinHintTable::hasHints() const return m_hints != nullptr; } -inline bool QskSkinHintTable::hasStates() const +inline QskAspect::States QskSkinHintTable::states() const { - return m_statefulCount > 0; + return m_states; } inline bool QskSkinHintTable::hasAnimators() const diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 1268fcde..fba33948 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -940,23 +940,12 @@ const QVariant& QskSkinnable::storedHint( { const auto skin = effectiveSkin(); - // clearing all state bits not being handled from the skin - aspect.clearStates( ~skin->stateMask() ); - QskAspect resolvedAspect; const auto& localTable = m_data->hintTable; if ( localTable.hasHints() ) { - auto a = aspect; - - if ( !localTable.hasStates() ) - { - // we don't need to clear the state bits stepwise - a.clearStates(); - } - - if ( const QVariant* value = localTable.resolvedHint( a, &resolvedAspect ) ) + if ( const auto value = localTable.resolvedHint( aspect, &resolvedAspect ) ) { if ( status ) { @@ -972,10 +961,7 @@ const QVariant& QskSkinnable::storedHint( const auto& skinTable = skin->hintTable(); if ( skinTable.hasHints() ) { - auto a = aspect; - - const QVariant* value = skinTable.resolvedHint( a, &resolvedAspect ); - if ( value ) + if ( const auto value = skinTable.resolvedHint( aspect, &resolvedAspect ) ) { if ( status ) { @@ -993,8 +979,7 @@ const QVariant& QskSkinnable::storedHint( aspect.setSubControl( QskAspect::Control ); aspect.clearStates(); - value = skinTable.resolvedHint( aspect, &resolvedAspect ); - if ( value ) + if ( const auto value = skinTable.resolvedHint( aspect, &resolvedAspect ) ) { if ( status ) { @@ -1257,7 +1242,8 @@ void QskSkinnable::setSkinStates( QskAspect::States newStates ) if ( skin ) { - const auto mask = skin->stateMask(); + const auto mask = skin->hintTable().states() | m_data->hintTable.states(); + if ( ( newStates & mask ) == ( m_data->skinStates & mask ) ) { // the modified bits are not handled by the skin @@ -1297,24 +1283,13 @@ void QskSkinnable::setSkinStates( QskAspect::States newStates ) const auto primitive = static_cast< QskAspect::Primitive >( i ); aspect.setPrimitive( type, primitive ); - auto a1 = aspect | m_data->skinStates; - auto a2 = aspect | newStates; + const auto a1 = aspect | m_data->skinStates; + const auto a2 = aspect | newStates; bool doTransition = true; - if ( !m_data->hintTable.hasStates() ) - { - /* - The hints are found by stripping the state bits one by - one until a lookup into the hint table is successful. - So for deciding whether two aspects lead to the same hint - we can stop as soon as the aspects have the same state bits. - This way we can reduce the number of lookups significantly - for skinnables with many state bits. - - */ + if ( m_data->hintTable.states() == QskAspect::NoState ) doTransition = !skinTable.isResolutionMatching( a1, a2 ); - } if ( doTransition ) { From 81e2ea2920ae7308209bb96d940e41d4acd1cbb9 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 29 Mar 2022 08:08:06 +0200 Subject: [PATCH 073/107] qHash added --- src/common/QskAspect.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/QskAspect.h b/src/common/QskAspect.h index fc3a94d7..4b5f03bc 100644 --- a/src/common/QskAspect.h +++ b/src/common/QskAspect.h @@ -584,6 +584,11 @@ namespace std }; } +inline QskHashValue qHash( const QskAspect aspect, QskHashValue seed = 0 ) noexcept +{ + return qHash( aspect.value(), seed ); +} + #ifndef QT_NO_DEBUG_STREAM class QDebug; From aa3c01dee32e434695167e1300e750c30a25ab70 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 29 Mar 2022 08:08:46 +0200 Subject: [PATCH 074/107] making hintTable() public --- src/controls/QskSkinnable.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index b73ea956..97324e2c 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -230,6 +230,8 @@ class QSK_EXPORT QskSkinnable bool resetGraphicRoleHint( QskAspect ); int graphicRoleHint( QskAspect, QskSkinHintStatus* = nullptr ) const; + const QskSkinHintTable& hintTable() const; + protected: virtual void updateNode( QSGNode* ); virtual bool isTransitionAccepted( QskAspect ) const; @@ -237,7 +239,6 @@ class QSK_EXPORT QskSkinnable virtual QskAspect::Subcontrol substitutedSubcontrol( QskAspect::Subcontrol ) const; QskSkinHintTable& hintTable(); - const QskSkinHintTable& hintTable() const; private: Q_DISABLE_COPY( QskSkinnable ) From 94a7ae45091da21bd25d0a6d06d761ea6bec84f5 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 29 Mar 2022 08:09:19 +0200 Subject: [PATCH 075/107] using qskEffectiveSkin --- src/controls/QskSkinnable.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index fba33948..15603d95 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -1318,12 +1318,7 @@ QskSkin* QskSkinnable::effectiveSkin() const if ( skin == nullptr ) { if ( const auto control = owningControl() ) - { - if ( auto window = qobject_cast< const QskWindow* >( control->window() ) ) - { - skin = window->skin(); - } - } + skin = qskEffectiveSkin( control->window() ); } return skin ? skin : qskSetup->skin(); From 848a22b2a25c4a639dd4427dd448e81f82e5ebb6 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 29 Mar 2022 11:14:23 +0200 Subject: [PATCH 076/107] interpolation between monochrome gradients improved --- src/common/QskGradient.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 4da8eff8..1b1415b8 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -499,6 +499,14 @@ QskGradient QskGradient::interpolated( return QskGradient( gradient->orientation(), stops ); } + if ( isMonochrome() && to.isMonochrome() ) + { + const auto c = QskRgb::interpolated( + m_stops[ 0 ].color(), to.m_stops[ 0 ].color(), value ); + + return QskGradient( to.orientation(), c, c ); + } + if ( isMonochrome() ) { // we can ignore our stops From 511c6ddcd3cb6bf484d4e8d61f9391d7a7ca820f Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 29 Mar 2022 11:15:08 +0200 Subject: [PATCH 077/107] try to convert if start/end values have different types --- src/controls/QskVariantAnimator.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index 6372fbf0..fde0e00f 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -104,6 +104,25 @@ void QskVariantAnimator::setup() { m_interpolator = nullptr; + if ( m_startValue.userType() != m_endValue.userType() ) + { + /* + Convert one value so that the types are matching. + + As a side effect startValue()/endValue() won't return what had + been set setStartValue()/setEndValue() ! + */ + + if ( m_startValue.canConvert( m_endValue.userType() ) ) + { + m_startValue.convert( m_endValue.userType() ); + } + else if ( m_endValue.canConvert( m_startValue.userType() ) ) + { + m_endValue.convert( m_startValue.userType() ); + } + } + const auto type = m_startValue.userType(); if ( type == m_endValue.userType() ) { From baee63ea6b5f5891aae0e7ed1a336d0da1302986 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 30 Mar 2022 12:28:45 +0200 Subject: [PATCH 078/107] debug operators improved --- src/common/QskBoxBorderColors.cpp | 50 ++++++++++++++++++++++++++---- src/common/QskBoxBorderColors.h | 4 +-- src/common/QskBoxBorderMetrics.cpp | 21 +++++++++++-- src/common/QskBoxBorderMetrics.h | 7 +++++ src/common/QskGradient.cpp | 49 ++++++++++++++++++++++++++++- src/common/QskGradient.h | 1 + src/common/QskGradientStop.cpp | 7 ++++- src/common/QskMargins.h | 6 ++++ src/common/QskRgbValue.cpp | 26 ++++++++++++++++ src/common/QskRgbValue.h | 12 +++++++ 10 files changed, 170 insertions(+), 13 deletions(-) diff --git a/src/common/QskBoxBorderColors.cpp b/src/common/QskBoxBorderColors.cpp index cbb12e5d..9a201d51 100644 --- a/src/common/QskBoxBorderColors.cpp +++ b/src/common/QskBoxBorderColors.cpp @@ -165,6 +165,14 @@ bool QskBoxBorderColors::isMonochrome() const && m_gradients[ 3 ].isMonochrome(); } +bool QskBoxBorderColors::isValid() const +{ + return m_gradients[ 0 ].isValid() + || m_gradients[ 1 ].isValid() + || m_gradients[ 2 ].isValid() + || m_gradients[ 3 ].isValid(); +} + QskBoxBorderColors QskBoxBorderColors::interpolated( const QskBoxBorderColors& to, qreal ratio ) const { @@ -210,14 +218,44 @@ QDebug operator<<( QDebug debug, const QskBoxBorderColors& colors ) QDebugStateSaver saver( debug ); debug.nospace(); - debug << "BoxBorderColors" << '('; + debug << "BoxBorderColors"; - debug << " L" << colors.gradient( Qsk::Left ); - debug << ", T" << colors.gradient( Qsk::Top ); - debug << ", R" << colors.gradient( Qsk::Right ); - debug << ", B" << colors.gradient( Qsk::Bottom ); + if ( !colors.isValid() ) + { + debug << "()"; + } + else + { + debug << "( "; - debug << " )"; + if ( colors.isMonochrome() ) + { + const auto& gradient = colors.gradient( Qsk::Left ); + QskRgb::debugColor( debug, gradient.startColor() ); + } + else + { + const char prompts[] = { 'L', 'T', 'R', 'B' }; + + for ( int i = 0; i <= Qsk::Bottom; i++ ) + { + if ( i != 0 ) + debug << ", "; + + const auto& gradient = colors.gradient( + static_cast< Qsk::Position >( i ) ); + + debug << prompts[ i ] << ": "; + + if ( gradient.isValid() && gradient.isMonochrome() ) + QskRgb::debugColor( debug, gradient.startColor() ); + else + debug << gradient; + } + } + + debug << " )"; + } return debug; } diff --git a/src/common/QskBoxBorderColors.h b/src/common/QskBoxBorderColors.h index b6ca4b68..df670810 100644 --- a/src/common/QskBoxBorderColors.h +++ b/src/common/QskBoxBorderColors.h @@ -12,8 +12,6 @@ #include #include -class QDebug; - class QSK_EXPORT QskBoxBorderColors { public: @@ -53,6 +51,7 @@ class QSK_EXPORT QskBoxBorderColors bool isMonochrome() const; bool isVisible() const; + bool isValid() const; private: QskGradient m_gradients[ 4 ]; @@ -80,6 +79,7 @@ inline const QskGradient& QskBoxBorderColors::gradient( Qsk::Position position ) #ifndef QT_NO_DEBUG_STREAM +class QDebug; QSK_EXPORT QDebug operator<<( QDebug, const QskBoxBorderColors& ); #endif diff --git a/src/common/QskBoxBorderMetrics.cpp b/src/common/QskBoxBorderMetrics.cpp index 25de9fe6..3e9040bc 100644 --- a/src/common/QskBoxBorderMetrics.cpp +++ b/src/common/QskBoxBorderMetrics.cpp @@ -109,9 +109,24 @@ QDebug operator<<( QDebug debug, const QskBoxBorderMetrics& metrics ) QDebugStateSaver saver( debug ); debug.nospace(); - debug << "BoxBorder" << '('; - debug << metrics.sizeMode() << ',' << metrics.widths(); - debug << ')'; + debug << "BoxBorder" << "( "; + + if ( metrics.sizeMode() != Qt::AbsoluteSize ) + debug << metrics.sizeMode() << ", "; + + const auto& w = metrics.widths(); + + if ( metrics.isEquidistant() ) + { + debug << w.left(); + } + else + { + const char s[] = ", "; + debug << w.left() << s << w.top() << s << w.right() << s << w.bottom(); + } + + debug << " )"; return debug; } diff --git a/src/common/QskBoxBorderMetrics.h b/src/common/QskBoxBorderMetrics.h index 10b7961c..802d2c75 100644 --- a/src/common/QskBoxBorderMetrics.h +++ b/src/common/QskBoxBorderMetrics.h @@ -60,6 +60,8 @@ class QSK_EXPORT QskBoxBorderMetrics static QVariant interpolate( const QskBoxBorderMetrics&, const QskBoxBorderMetrics&, qreal progress ); + constexpr bool isEquidistant() const noexcept; + private: QskMargins m_widths; Qt::SizeMode m_sizeMode; @@ -115,6 +117,11 @@ inline constexpr bool QskBoxBorderMetrics::isNull() const noexcept return m_widths.isNull(); } +inline constexpr bool QskBoxBorderMetrics::isEquidistant() const noexcept +{ + return m_widths.isEquidistant(); +} + inline constexpr const QskMargins& QskBoxBorderMetrics::widths() const noexcept { return m_widths; diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 1b1415b8..49be2f78 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -229,6 +229,11 @@ QskGradient::QskGradient( Orientation orientation, const QskGradientStops& stops setStops( stops ); } +QskGradient::QskGradient( Qt::Orientation orientation, QGradient::Preset preset ) + : QskGradient( qskOrientation( orientation ), preset ) +{ +} + QskGradient::QskGradient( Orientation orientation, QGradient::Preset preset ) : QskGradient( orientation ) { @@ -632,7 +637,49 @@ void QskGradient::updateStatusBits() const QDebug operator<<( QDebug debug, const QskGradient& gradient ) { - debug << "GR:" << gradient.orientation() << gradient.stops().count(); + QDebugStateSaver saver( debug ); + debug.nospace(); + + debug << "Gradient"; + + if ( !gradient.isValid() ) + { + debug << "()"; + } + else + { + debug << "( "; + + if ( gradient.isMonochrome() ) + { + QskRgb::debugColor( debug, gradient.startColor() ); + } + else + { + const char o[] = { 'H', 'V', 'D' }; + debug << o[ gradient.orientation() ] << ", "; + + if ( gradient.stops().count() == 2 ) + { + QskRgb::debugColor( debug, gradient.startColor() ); + debug << ", "; + QskRgb::debugColor( debug, gradient.endColor() ); + } + else + { + const auto& s = gradient.stops(); + for ( int i = 0; i < s.count(); i++ ) + { + if ( i != 0 ) + debug << ", "; + + debug << s[i]; + } + } + } + debug << " )"; + } + return debug; } diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index 75005926..be90ad5a 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -52,6 +52,7 @@ class QSK_EXPORT QskGradient QskGradient( Qt::Orientation, const QVector< QskGradientStop >& ); QskGradient( Qt::Orientation, const QColor&, const QColor& ); + QskGradient( Qt::Orientation, QGradient::Preset ); QskGradient( Orientation, const QVector< QskGradientStop >& ); QskGradient( Orientation, const QColor&, const QColor& ); diff --git a/src/common/QskGradientStop.cpp b/src/common/QskGradientStop.cpp index 530a2a1d..ffef7d97 100644 --- a/src/common/QskGradientStop.cpp +++ b/src/common/QskGradientStop.cpp @@ -78,7 +78,12 @@ QColor QskGradientStop::interpolated( QDebug operator<<( QDebug debug, const QskGradientStop& stop ) { - debug << stop.position() << ": " << stop.color(); + QDebugStateSaver saver( debug ); + debug.nospace(); + + debug << stop.position() << ": "; + QskRgb::debugColor( debug, stop.color() ); + return debug; } diff --git a/src/common/QskMargins.h b/src/common/QskMargins.h index e90c9338..3a3bb962 100644 --- a/src/common/QskMargins.h +++ b/src/common/QskMargins.h @@ -61,6 +61,7 @@ class QSK_EXPORT QskMargins : public QMarginsF QskMargins interpolated( const QskMargins&, qreal progress ) const noexcept; constexpr bool isExpanding() const noexcept; + constexpr bool isEquidistant() const noexcept; static QVariant interpolate( const QskMargins&, const QskMargins&, qreal progress ) noexcept; @@ -181,6 +182,11 @@ constexpr inline qreal QskMargins::height() const noexcept return top() + bottom(); } +inline constexpr bool QskMargins::isEquidistant() const noexcept +{ + return ( left() == top() ) && ( left() == right() ) && ( left() == bottom() ); +} + Q_DECLARE_TYPEINFO( QskMargins, Q_MOVABLE_TYPE ); Q_DECLARE_METATYPE( QskMargins ) diff --git a/src/common/QskRgbValue.cpp b/src/common/QskRgbValue.cpp index 49a87f96..7b4c0b8c 100644 --- a/src/common/QskRgbValue.cpp +++ b/src/common/QskRgbValue.cpp @@ -172,3 +172,29 @@ QRgb QskRgb::darker( QRgb rgb, int factor ) noexcept return QColor::fromRgba( rgb ).darker( factor ).rgba(); } +#ifndef QT_NO_DEBUG_STREAM + +#include + +void QskRgb::debugColor( QDebug debug, const QColor& color ) +{ + debugColor( debug, color.rgba() ); +} + +void QskRgb::debugColor( QDebug debug, QRgb rgb ) +{ + QDebugStateSaver saver( debug ); + debug.nospace(); + + debug << '['; + + debug << qRed( rgb ) << "r," << qGreen( rgb ) << "g," + << qBlue( rgb ) << 'b'; + + if ( qAlpha( rgb ) != 255 ) + debug << ',' << qAlpha( rgb ) << 'a'; + + debug << ']'; +} + +#endif diff --git a/src/common/QskRgbValue.h b/src/common/QskRgbValue.h index 9f7a3d9b..8a6059de 100644 --- a/src/common/QskRgbValue.h +++ b/src/common/QskRgbValue.h @@ -480,4 +480,16 @@ namespace QskRgb QSK_EXPORT QRgb darker( QRgb, int factor = 200 ) noexcept; } +#ifndef QT_NO_DEBUG_STREAM + +class QDebug; + +namespace QskRgb +{ + QSK_EXPORT void debugColor( QDebug, const QColor& ); + QSK_EXPORT void debugColor( QDebug, QRgb ); +} + +#endif + #endif From 7d0092ccb39cd4d8dcf65ca8722d64c11d0c8aca Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 30 Mar 2022 18:21:31 +0200 Subject: [PATCH 079/107] QskStateCombination operators added --- src/common/QskStateCombination.cpp | 14 -------------- src/common/QskStateCombination.h | 14 +++++++++++++- src/src.pro | 1 - 3 files changed, 13 insertions(+), 16 deletions(-) delete mode 100644 src/common/QskStateCombination.cpp diff --git a/src/common/QskStateCombination.cpp b/src/common/QskStateCombination.cpp deleted file mode 100644 index 07a7b481..00000000 --- a/src/common/QskStateCombination.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the QSkinny License, Version 1.0 - *****************************************************************************/ - -#include "QskStateCombination.h" - -static void qskRegisterStateCombination() -{ - qRegisterMetaType< QskStateCombination >(); -} - -Q_CONSTRUCTOR_FUNCTION( qskRegisterStateCombination ) - diff --git a/src/common/QskStateCombination.h b/src/common/QskStateCombination.h index 8393c90b..13d64e22 100644 --- a/src/common/QskStateCombination.h +++ b/src/common/QskStateCombination.h @@ -21,6 +21,9 @@ class QSK_EXPORT QskStateCombination constexpr QskStateCombination( QskAspect::States = QskAspect::States() ) noexcept; constexpr QskStateCombination( Type, QskAspect::States = QskAspect::States() ) noexcept; + constexpr bool operator==( QskStateCombination ) const noexcept; + constexpr bool operator!=( QskStateCombination ) const noexcept; + constexpr bool isNull() const noexcept; void setType( Type ) noexcept; @@ -36,7 +39,6 @@ class QSK_EXPORT QskStateCombination }; Q_DECLARE_TYPEINFO( QskStateCombination, Q_MOVABLE_TYPE ); -Q_DECLARE_METATYPE( QskStateCombination ) constexpr inline QskStateCombination::QskStateCombination( QskAspect::State state ) noexcept @@ -90,4 +92,14 @@ constexpr inline QskAspect::States QskStateCombination::states() const noexcept return m_states; } +constexpr bool QskStateCombination::operator==( QskStateCombination other ) const noexcept +{ + return ( m_type == other.m_type ) && ( m_states == other.m_states ); +} + +constexpr bool QskStateCombination::operator!=( QskStateCombination other ) const noexcept +{ + return !( *this == other ); +} + #endif diff --git a/src/src.pro b/src/src.pro index a25be7da..0c00a0ec 100644 --- a/src/src.pro +++ b/src/src.pro @@ -63,7 +63,6 @@ SOURCES += \ common/QskScaleTickmarks.cpp \ common/QskShadowMetrics.cpp \ common/QskSizePolicy.cpp \ - common/QskStateCombination.cpp \ common/QskTextColors.cpp \ common/QskTextOptions.cpp From f991a21a0a1f1dedde3dea0192e5803eb2780257 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 30 Mar 2022 18:30:22 +0200 Subject: [PATCH 080/107] QMetaType definitions added --- src/common/QskArcMetrics.cpp | 4 +++ src/common/QskBoxBorderColors.cpp | 24 ++++++++++++++++++ src/common/QskBoxBorderColors.h | 39 ++++++++++++++++++++++++++++++ src/common/QskBoxBorderMetrics.cpp | 4 +++ src/common/QskBoxShapeMetrics.cpp | 4 +++ src/common/QskGradient.cpp | 4 +++ src/common/QskGradientStop.cpp | 4 +++ src/common/QskIntervalF.cpp | 4 +++ src/common/QskScaleTickmarks.cpp | 4 +++ src/common/QskShadowMetrics.cpp | 4 +++ 10 files changed, 95 insertions(+) diff --git a/src/common/QskArcMetrics.cpp b/src/common/QskArcMetrics.cpp index 991b075d..44d90fde 100644 --- a/src/common/QskArcMetrics.cpp +++ b/src/common/QskArcMetrics.cpp @@ -11,6 +11,10 @@ static void qskRegisterArcMetrics() { qRegisterMetaType< QskArcMetrics >(); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskArcMetrics >(); +#endif } Q_CONSTRUCTOR_FUNCTION( qskRegisterArcMetrics ) diff --git a/src/common/QskBoxBorderColors.cpp b/src/common/QskBoxBorderColors.cpp index 9a201d51..80493b20 100644 --- a/src/common/QskBoxBorderColors.cpp +++ b/src/common/QskBoxBorderColors.cpp @@ -13,6 +13,10 @@ static void qskRegisterBoxBorderColors() { qRegisterMetaType< QskBoxBorderColors >(); +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskBoxBorderColors >(); +#endif + QMetaType::registerConverter< QColor, QskBoxBorderColors >( []( const QColor& color ) { return QskBoxBorderColors( color ); } ); @@ -110,6 +114,26 @@ void QskBoxBorderColors::setGradientAt( Qt::Edges edges, const QskGradient& grad m_gradients[ Qsk::Bottom ] = gradient; } +void QskBoxBorderColors::setLeft( const QskGradient& gradient ) +{ + m_gradients[ Qsk::Left ] = gradient; +} + +void QskBoxBorderColors::setTop( const QskGradient& gradient ) +{ + m_gradients[ Qsk::Top ] = gradient; +} + +void QskBoxBorderColors::setRight( const QskGradient& gradient ) +{ + m_gradients[ Qsk::Right ] = gradient; +} + +void QskBoxBorderColors::setBottom( const QskGradient& gradient ) +{ + m_gradients[ Qsk::Bottom ] = gradient; +} + const QskGradient& QskBoxBorderColors::gradientAt( Qt::Edge edge ) const { switch ( edge ) diff --git a/src/common/QskBoxBorderColors.h b/src/common/QskBoxBorderColors.h index df670810..6011c2d9 100644 --- a/src/common/QskBoxBorderColors.h +++ b/src/common/QskBoxBorderColors.h @@ -14,6 +14,13 @@ class QSK_EXPORT QskBoxBorderColors { + Q_GADGET + + Q_PROPERTY( QskGradient left READ left WRITE setLeft ) + Q_PROPERTY( QskGradient top READ top WRITE setTop ) + Q_PROPERTY( QskGradient right READ right WRITE setRight ) + Q_PROPERTY( QskGradient bottom READ bottom WRITE setBottom ) + public: QskBoxBorderColors(); @@ -42,6 +49,18 @@ class QSK_EXPORT QskBoxBorderColors void setGradientAt( Qt::Edges, const QskGradient& ); const QskGradient& gradientAt( Qt::Edge ) const; + void setLeft( const QskGradient& ); + const QskGradient& left() const; + + void setTop( const QskGradient& ); + const QskGradient& top() const; + + void setRight( const QskGradient& ); + const QskGradient& right() const; + + void setBottom( const QskGradient& ); + const QskGradient& bottom() const; + QskBoxBorderColors interpolated( const QskBoxBorderColors&, qreal value ) const; static QVariant interpolate( const QskBoxBorderColors&, @@ -77,6 +96,26 @@ inline const QskGradient& QskBoxBorderColors::gradient( Qsk::Position position ) return m_gradients[ position ]; } +inline const QskGradient& QskBoxBorderColors::left() const +{ + return m_gradients[ Qsk::Left ]; +} + +inline const QskGradient& QskBoxBorderColors::top() const +{ + return m_gradients[ Qsk::Top ]; +} + +inline const QskGradient& QskBoxBorderColors::right() const +{ + return m_gradients[ Qsk::Right ]; +} + +inline const QskGradient& QskBoxBorderColors::bottom() const +{ + return m_gradients[ Qsk::Bottom ]; +} + #ifndef QT_NO_DEBUG_STREAM class QDebug; diff --git a/src/common/QskBoxBorderMetrics.cpp b/src/common/QskBoxBorderMetrics.cpp index 3e9040bc..18178062 100644 --- a/src/common/QskBoxBorderMetrics.cpp +++ b/src/common/QskBoxBorderMetrics.cpp @@ -12,6 +12,10 @@ static void qskRegisterBoxBorderMetrics() { qRegisterMetaType< QskBoxBorderMetrics >(); +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskBoxBorderMetrics >(); +#endif + QMetaType::registerConverter< QskMargins, QskBoxBorderMetrics >( []( const QskMargins& margins ) { return QskBoxBorderMetrics( margins ); } ); diff --git a/src/common/QskBoxShapeMetrics.cpp b/src/common/QskBoxShapeMetrics.cpp index 09e9cc70..17c21be1 100644 --- a/src/common/QskBoxShapeMetrics.cpp +++ b/src/common/QskBoxShapeMetrics.cpp @@ -14,6 +14,10 @@ static void qskRegisterBoxShapeMetrics() { qRegisterMetaType< QskBoxShapeMetrics >(); +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskBoxShapeMetrics >(); +#endif + QMetaType::registerConverter< int, QskBoxShapeMetrics >( []( int radius ) { return QskBoxShapeMetrics( radius ); } ); diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 49be2f78..82661437 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -15,6 +15,10 @@ static void qskRegisterGradient() { qRegisterMetaType< QskGradient >(); +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskGradient >(); +#endif + QMetaType::registerConverter< QColor, QskGradient >( []( const QColor& color ) { return QskGradient( color ); } ); } diff --git a/src/common/QskGradientStop.cpp b/src/common/QskGradientStop.cpp index ffef7d97..48dbdac2 100644 --- a/src/common/QskGradientStop.cpp +++ b/src/common/QskGradientStop.cpp @@ -14,6 +14,10 @@ static void qskRegisterGradientStop() { qRegisterMetaType< QskGradientStop >(); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskGradientStop >(); +#endif } Q_CONSTRUCTOR_FUNCTION( qskRegisterGradientStop ) diff --git a/src/common/QskIntervalF.cpp b/src/common/QskIntervalF.cpp index a27a83c8..f4b19d38 100644 --- a/src/common/QskIntervalF.cpp +++ b/src/common/QskIntervalF.cpp @@ -12,6 +12,10 @@ static void qskRegisterIntervalF() { qRegisterMetaType< QskIntervalF >(); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskIntervalF >(); +#endif } Q_CONSTRUCTOR_FUNCTION( qskRegisterIntervalF ) diff --git a/src/common/QskScaleTickmarks.cpp b/src/common/QskScaleTickmarks.cpp index 836fc474..65f67089 100644 --- a/src/common/QskScaleTickmarks.cpp +++ b/src/common/QskScaleTickmarks.cpp @@ -9,6 +9,10 @@ static void qskRegisterTickmarks() { qRegisterMetaType< QskScaleTickmarks >(); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskScaleTickmarks >(); +#endif } Q_CONSTRUCTOR_FUNCTION( qskRegisterTickmarks ) diff --git a/src/common/QskShadowMetrics.cpp b/src/common/QskShadowMetrics.cpp index 37b951b0..384104d3 100644 --- a/src/common/QskShadowMetrics.cpp +++ b/src/common/QskShadowMetrics.cpp @@ -12,6 +12,10 @@ static void qskRegisterShadowMetrics() { qRegisterMetaType< QskShadowMetrics >(); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + QMetaType::registerEqualsComparator< QskShadowMetrics >(); +#endif } Q_CONSTRUCTOR_FUNCTION( qskRegisterShadowMetrics ) From 27ee0fe42391ba7e05de931a34be1f622776af52 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 31 Mar 2022 12:25:24 +0200 Subject: [PATCH 081/107] using QVariant::metaType --- src/controls/QskSkinnable.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 15603d95..1aca8b64 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -41,12 +41,11 @@ static inline bool qskIsControl( const QskSkinnable* skinnable ) static inline QVariant qskTypedNullValue( const QVariant& value ) { #if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) - const auto vType = static_cast< QMetaType >( value.userType() ); + return QVariant( value.metaType() ); #else - const auto vType = value.userType(); + return QVariant( value.userType(), nullptr ); #endif - return QVariant( vType, nullptr ); } static inline bool qskSetFlag( QskSkinnable* skinnable, From e2d6823927aab0f5cace664648fa849f092a3617 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 31 Mar 2022 18:09:03 +0200 Subject: [PATCH 082/107] skin transition heavily changed --- src/controls/QskSkinHintTable.cpp | 30 - src/controls/QskSkinHintTable.h | 6 +- src/controls/QskSkinTransition.cpp | 972 ++++++++++++++-------------- src/controls/QskSkinnable.cpp | 28 +- src/controls/QskVariantAnimator.cpp | 123 +++- src/controls/QskVariantAnimator.h | 3 + 6 files changed, 590 insertions(+), 572 deletions(-) diff --git a/src/controls/QskSkinHintTable.cpp b/src/controls/QskSkinHintTable.cpp index d43a4434..7b654c65 100644 --- a/src/controls/QskSkinHintTable.cpp +++ b/src/controls/QskSkinHintTable.cpp @@ -64,41 +64,11 @@ QskSkinHintTable::QskSkinHintTable() { } -QskSkinHintTable::QskSkinHintTable( const QskSkinHintTable& other ) - : m_hints( nullptr ) - , m_animatorCount( other.m_animatorCount ) - , m_states( other.m_states ) -{ - if ( other.m_hints ) - m_hints = new HintMap( *( other.m_hints ) ); -} - QskSkinHintTable::~QskSkinHintTable() { delete m_hints; } -QskSkinHintTable& QskSkinHintTable::operator=( const QskSkinHintTable& other ) -{ - m_animatorCount = other.m_animatorCount; - m_states = other.m_states; - - if ( other.m_hints ) - { - if ( m_hints == nullptr ) - m_hints = new HintMap(); - - *m_hints = *other.m_hints; - } - else - { - delete m_hints; - m_hints = nullptr; - } - - return *this; -} - const std::unordered_map< QskAspect, QVariant >& QskSkinHintTable::hints() const { if ( m_hints ) diff --git a/src/controls/QskSkinHintTable.h b/src/controls/QskSkinHintTable.h index ac246376..9ae56be9 100644 --- a/src/controls/QskSkinHintTable.h +++ b/src/controls/QskSkinHintTable.h @@ -17,12 +17,8 @@ class QSK_EXPORT QskSkinHintTable { public: QskSkinHintTable(); - QskSkinHintTable( const QskSkinHintTable& other ); - ~QskSkinHintTable(); - QskSkinHintTable& operator=( const QskSkinHintTable& ); - bool setAnimation( QskAspect, QskAnimationHint ); QskAnimationHint animation( QskAspect ) const; @@ -57,6 +53,8 @@ class QSK_EXPORT QskSkinHintTable bool isResolutionMatching( QskAspect, QskAspect ) const; private: + Q_DISABLE_COPY( QskSkinHintTable ) + static const QVariant invalidHint; typedef std::unordered_map< QskAspect, QVariant > HintMap; diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index 04c38e4e..b96b6753 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -20,6 +20,51 @@ #include #include +static void qskAddCandidates( const QskSkinTransition::Type mask, + const QskSkin* skin, QSet< QskAspect >& candidates ) +{ + for ( const auto& entry : skin->hintTable().hints() ) + { + const auto aspect = entry.first.trunk(); + + if ( aspect.isAnimator() ) + continue; + + bool isCandidate = false; + + switch( aspect.type() ) + { + case QskAspect::Flag: + { + if ( aspect.flagPrimitive() == QskAspect::GraphicRole ) + { + isCandidate = mask & QskSkinTransition::Color; + } +#if 0 + else if ( aspect.flagPrimitive() == QskAspect::FontRole ) + { + isCandidate = mask & QskSkinTransition::Metric; + } +#endif + break; + } + case QskAspect::Color: + { + isCandidate = mask & QskSkinTransition::Color; + break; + } + case QskAspect::Metric: + { + isCandidate = mask & QskSkinTransition::Metric; + break; + } + } + + if ( isCandidate ) + candidates += aspect; + } +} + namespace { class UpdateInfo @@ -40,479 +85,85 @@ namespace int updateModes; }; - class AnimatorCandidate + class HintAnimator : public QskHintAnimator { public: - AnimatorCandidate() = default; - - inline AnimatorCandidate( QskAspect aspect, - const QVariant& from, const QVariant& to ) - : aspect( aspect ) - , from( from ) - , to( to ) + inline HintAnimator( const QskControl* control, const QskAspect aspect, + const QVariant& value1, const QVariant& value2, QskAnimationHint hint ) { - } + setAspect( aspect ); + setStartValue( value1 ); + setEndValue( value2 ); - QskAspect aspect; - QVariant from; - QVariant to; + setDuration( hint.duration ); + setEasingCurve( hint.type ); + setUpdateFlags( hint.updateFlags ); + + setWindow( control->window() ); + } }; -} -static QVector< AnimatorCandidate > qskAnimatorCandidates( - QskSkinTransition::Type mask, - const QskSkinHintTable& oldTable, - const std::unordered_map< int, QskColorFilter >& oldFilters, - const QskSkinHintTable& newTable, - const std::unordered_map< int, QskColorFilter >& newFilters ) -{ - // building a list of candidates for animations by comparing - // the old/new set of skin hints - - const QskColorFilter noFilter; - QVector< AnimatorCandidate > candidates; - - if ( !oldTable.hasHints() ) - return candidates; - - for ( const auto& entry : newTable.hints() ) - { - const auto aspect = entry.first; - - if ( aspect.isAnimator() ) - continue; - - const auto type = aspect.type(); - - if ( type == QskAspect::Flag ) - { - switch ( aspect.flagPrimitive() ) - { - case QskAspect::GraphicRole: - { - if ( !( mask & QskSkinTransition::Color ) ) - continue; - - int role1 = 0; - - const auto value = oldTable.resolvedHint( aspect ); - if ( value ) - role1 = value->toInt(); - - const int role2 = entry.second.toInt(); - - /* - When the role is the same we already have the animators - for the graphic filter table running - */ - if ( role1 != role2 ) - { - const auto it1 = oldFilters.find( role1 ); - const auto it2 = newFilters.find( role2 ); - - if ( it1 != oldFilters.end() || it2 != newFilters.end() ) - { - const auto& f1 = ( it1 != oldFilters.end() ) ? it1->second : noFilter; - const auto& f2 = ( it2 != newFilters.end() ) ? it2->second : noFilter; - - if ( f1 != f2 ) - { - candidates += AnimatorCandidate( aspect, - QVariant::fromValue( f1 ), QVariant::fromValue( f2 ) ); - } - } - } - break; - } - case QskAspect::FontRole: - { - if ( !( mask & QskSkinTransition::Metric ) ) - continue; - - break; - } - default: - ; - } - } - else - { - if ( ( ( type == QskAspect::Color ) && ( mask & QskSkinTransition::Color ) ) || - ( ( type == QskAspect::Metric ) && ( mask & QskSkinTransition::Metric ) ) ) - { - auto value = oldTable.resolvedHint( aspect ); - if ( value == nullptr && aspect.subControl() != QskAspect::Control ) - { - auto a = aspect; - a.setSubControl( QskAspect::Control ); - a.clearStates(); - value = oldTable.resolvedHint( a ); - } - - /* - We are missing transitions, when a hint in newTable - gets resolved from QskControl. TODO ... - */ - if ( value && *value != entry.second ) - candidates += AnimatorCandidate( aspect, *value, entry.second ); - } - } - } - - return candidates; -} - -namespace -{ - class AnimatorGroup + class WindowAnimator { public: - AnimatorGroup( QQuickWindow* window = nullptr ) - : m_window( window ) - { - } + WindowAnimator( QQuickWindow* = nullptr ); - inline const QQuickWindow* window() const - { - return m_window; - } + const QQuickWindow* window() const; - void start() - { - for ( auto& it : m_hintAnimatorMap ) - it.second.start(); + void start(); + bool isRunning() const; - for ( auto& it : m_graphicFilterAnimatorMap ) - it.second.start(); - } + QVariant animatedHint( QskAspect ) const; + QVariant animatedGraphicFilter( int graphicRole ) const; - bool isRunning() const - { - if ( !m_hintAnimatorMap.empty() ) - { - const auto& animator = m_hintAnimatorMap.begin()->second; - if ( animator.isRunning() ) - return true; - } + void addGraphicFilterAnimators( const QskAnimationHint&, + const QskSkin*, const QskSkin* ); - if ( !m_graphicFilterAnimatorMap.empty() ) - { - const auto& animator = m_graphicFilterAnimatorMap.begin()->second; - if ( animator.isRunning() ) - return true; - } + void addItemAspects( QQuickItem*, + const QskAnimationHint&, const QSet< QskAspect >&, + const QskSkin*, const QskSkin* ); - return false; - } - - inline QVariant animatedHint( QskAspect aspect ) const - { - auto it = m_hintAnimatorMap.find( aspect ); - if ( it != m_hintAnimatorMap.cend() ) - { - const auto& animator = it->second; - if ( animator.isRunning() ) - return animator.currentValue(); - } - - return QVariant(); - } - - inline QVariant animatedGraphicFilter( int graphicRole ) const - { - auto it = m_graphicFilterAnimatorMap.find( graphicRole ); - if ( it != m_graphicFilterAnimatorMap.cend() ) - { - const auto& animator = it->second; - if ( animator.isRunning() ) - return animator.currentValue(); - } - - return QVariant(); - } - - void addGraphicFilterAnimators( - const QskAnimationHint& animatorHint, - const std::unordered_map< int, QskColorFilter >& oldFilters, - const std::unordered_map< int, QskColorFilter >& newFilters ) - { - const QskColorFilter noFilter; - - for ( auto it2 = newFilters.begin(); it2 != newFilters.end(); ++it2 ) - { - auto it1 = oldFilters.find( it2->first ); - if ( it1 == oldFilters.cend() ) - it1 = oldFilters.find( 0 ); - - const auto& f1 = ( it1 != oldFilters.cend() ) ? it1->second : noFilter; - const auto& f2 = it2->second; - - if ( f1 != f2 ) - { - QskVariantAnimator animator; - animator.setWindow( m_window ); - animator.setDuration( animatorHint.duration ); - animator.setEasingCurve( animatorHint.type ); - animator.setStartValue( QVariant::fromValue( f1 ) ); - animator.setEndValue( QVariant::fromValue( f2 ) ); - - m_graphicFilterAnimatorMap.emplace( it2->first, animator ); - } - } - } - - void addAnimators( QQuickItem* item, const QskAnimationHint& animatorHint, - const QVector< AnimatorCandidate >& candidates, QskSkin* skin ) - { - if ( !item->isVisible() ) - return; - - if ( auto control = qskControlCast( item ) ) - { - if ( control->isInitiallyPainted() && ( skin == control->effectiveSkin() ) ) - { - addControlAnimators( control, animatorHint, candidates ); -#if 1 - /* - As it is hard to identify which controls depend on the animated - graphic filters we schedule an initial update and let the - controls do the rest: see QskSkinnable::effectiveGraphicFilter - */ - control->update(); -#endif - } - } - - const auto children = item->childItems(); - for ( auto child : children ) - addAnimators( child, animatorHint, candidates, skin ); - } - - void update() - { - for ( auto& info : m_updateInfos ) - { - if ( auto control = info.control ) - { - if ( info.updateModes & UpdateInfo::Polish ) - { - control->resetImplicitSize(); - control->polish(); - } - - if ( info.updateModes & UpdateInfo::Update ) - control->update(); - } - } - } + void update(); private: - void addControlAnimators( QskControl* control, const QskAnimationHint& animatorHint, - const QVector< AnimatorCandidate >& candidates ) - { - const auto subControls = control->subControls(); + bool isControlAffected( const QskControl*, + const QVector< QskAspect::Subcontrol >&, QskAspect ) const; - for ( const auto& candidate : candidates ) - { - const auto aspect = candidate.aspect; + void addHints( const QskControl*, + const QskAnimationHint&, const QSet< QskAspect >& candidates, + const QskSkin* skin1, const QskSkin* skin2 ); - if ( !aspect.isMetric() ) - { - if ( !( control->flags() & QQuickItem::ItemHasContents ) ) - { - // while metrics might have an effect on layouts, we - // can safely ignore others for controls without content - continue; - } - } + void storeAnimator( const QskControl*, const QskAspect, + const QVariant&, const QVariant&, QskAnimationHint ); - const auto subControl = aspect.subControl(); - if ( subControl != control->effectiveSubcontrol( subControl ) ) - { - // The control uses subcontrol redirection, so we can assume it - // is not interested in this subcontrol. - continue; - } - - if ( subControl != QskAspect::Control ) - { - if ( !subControls.contains( subControl ) ) - { - // the control is not interested in the aspect - continue; - } - } - else - { - if ( !control->autoFillBackground() ) - { - // no need to animate the background unless we show it - continue; - } - } - - auto a = aspect; - a.setStates( control->skinStates() ); - - const auto requestState = control->hintStatus( a ); - - if ( requestState.source != QskSkinHintStatus::Skin ) - { - // The control does not resolve the aspect from the skin. - continue; - } - - if ( aspect != requestState.aspect ) - { - // the aspect was resolved to something else - continue; - } - - addAnimator( control->window(), aspect, - candidate.from, candidate.to, animatorHint ); - - storeUpdateInfo( control, aspect ); - } - } - - void addAnimator( QQuickWindow* window, const QskAspect aspect, - const QVariant& from, const QVariant& to, QskAnimationHint animationHint ) - { - auto it = m_hintAnimatorMap.find( aspect ); - if ( it != m_hintAnimatorMap.end() ) - return; // already there - - it = m_hintAnimatorMap.emplace( aspect, QskHintAnimator() ).first; - auto& animator = it->second; - - animator.setAspect( aspect ); - animator.setStartValue( from ); - animator.setEndValue( to ); - - animator.setDuration( animationHint.duration ); - animator.setEasingCurve( animationHint.type ); - animator.setUpdateFlags( animationHint.updateFlags ); - - animator.setControl( nullptr ); - animator.setWindow( window ); - } - - inline void storeUpdateInfo( QskControl* control, QskAspect aspect ) - { - UpdateInfo info; - info.control = control; - - info.updateModes = UpdateInfo::Update; - if ( aspect.isMetric() ) - info.updateModes |= UpdateInfo::Polish; - - auto it = std::lower_bound( - m_updateInfos.begin(), m_updateInfos.end(), info, UpdateInfo::compare ); - - if ( ( it != m_updateInfos.end() ) && ( it->control == info.control ) ) - it->updateModes |= info.updateModes; - else - m_updateInfos.insert( it, info ); - } + void storeUpdateInfo( const QskControl*, QskAspect ); QQuickWindow* m_window; - std::unordered_map< QskAspect, QskHintAnimator > m_hintAnimatorMap; + std::unordered_map< QskAspect, HintAnimator > m_animatorMap; std::unordered_map< int, QskVariantAnimator > m_graphicFilterAnimatorMap; std::vector< UpdateInfo > m_updateInfos; // vector: for fast iteration }; - class AnimatorGroups : public QObject + class ApplicationAnimator : public QObject { Q_OBJECT public: - ~AnimatorGroups() - { - reset(); - } + ~ApplicationAnimator(); - inline AnimatorGroup* animatorGroup( const QQuickWindow* window ) - { - if ( !m_animatorGroups.empty() && window ) - { - for ( auto group : m_animatorGroups ) - { - if ( group->window() == window ) - return group; - } - } + WindowAnimator* windowAnimator( const QQuickWindow* ); - return nullptr; - } + void add( WindowAnimator* ); - void add( AnimatorGroup* group ) - { - m_animatorGroups.push_back( group ); - } - - void start() - { - m_connections[0] = QskAnimator::addAdvanceHandler( - this, SLOT(notify(QQuickWindow*)), Qt::UniqueConnection ); - - m_connections[1] = QskAnimator::addCleanupHandler( - this, SLOT(cleanup(QQuickWindow*)), Qt::UniqueConnection ); - - for ( auto& group : m_animatorGroups ) - group->start(); - } - - void reset() - { - qDeleteAll( m_animatorGroups ); - m_animatorGroups.clear(); - - disconnect( m_connections[0] ); - disconnect( m_connections[1] ); - } - - inline bool isRunning() const - { - return !m_animatorGroups.empty(); - } + void start(); + void reset(); + bool isRunning() const; private Q_SLOTS: - void notify( QQuickWindow* window ) - { - for ( auto& group : m_animatorGroups ) - { - if ( group->window() == window ) - { - group->update(); - return; - } - } - } - - void cleanup( QQuickWindow* window ) - { - for ( auto it = m_animatorGroups.begin(); - it != m_animatorGroups.end(); ++it ) - { - auto group = *it; - if ( group->window() == window ) - { - if ( !group->isRunning() ) - { - // The notification might be for other animators - - m_animatorGroups.erase( it ); - delete group; - } - - break; - } - } - - if ( m_animatorGroups.empty() ) - reset(); - } + // using functor slots ? + void notify( QQuickWindow* ); + void cleanup( QQuickWindow* ); private: /* @@ -522,12 +173,372 @@ namespace But as skin transitions are no operations, that happen often, we can accept the overhaed of the current implementation and do the finetuning later. */ - std::vector< AnimatorGroup* > m_animatorGroups; + std::vector< WindowAnimator* > m_windowAnimators; QMetaObject::Connection m_connections[2]; }; } -Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator ) +Q_GLOBAL_STATIC( ApplicationAnimator, qskApplicationAnimator ) + +WindowAnimator::WindowAnimator( QQuickWindow* window ) + : m_window( window ) +{ +} + +inline const QQuickWindow* WindowAnimator::window() const +{ + return m_window; +} + +void WindowAnimator::start() +{ + for ( auto& it : m_animatorMap ) + it.second.start(); + + for ( auto& it : m_graphicFilterAnimatorMap ) + it.second.start(); +} + +bool WindowAnimator::isRunning() const +{ + if ( !m_animatorMap.empty() ) + { + const auto& animator = m_animatorMap.begin()->second; + if ( animator.isRunning() ) + return true; + } + + if ( !m_graphicFilterAnimatorMap.empty() ) + { + const auto& animator = m_graphicFilterAnimatorMap.begin()->second; + if ( animator.isRunning() ) + return true; + } + + return false; +} + +inline QVariant WindowAnimator::animatedHint( QskAspect aspect ) const +{ + auto it = m_animatorMap.find( aspect ); + if ( it != m_animatorMap.cend() ) + { + const auto& animator = it->second; + if ( animator.isRunning() ) + return animator.currentValue(); + } + + return QVariant(); +} + +inline QVariant WindowAnimator::animatedGraphicFilter( int graphicRole ) const +{ + auto it = m_graphicFilterAnimatorMap.find( graphicRole ); + if ( it != m_graphicFilterAnimatorMap.cend() ) + { + const auto& animator = it->second; + if ( animator.isRunning() ) + return animator.currentValue(); + } + + return QVariant(); +} + +void WindowAnimator::addGraphicFilterAnimators( const QskAnimationHint& animatorHint, + const QskSkin* skin1, const QskSkin* skin2 ) +{ + const QskColorFilter noFilter; + + const auto& filter1 = skin1->graphicFilters(); + const auto& filter2 = skin2->graphicFilters(); + + for ( auto it2 = filter2.begin(); it2 != filter2.end(); ++it2 ) + { + auto it1 = filter1.find( it2->first ); + if ( it1 == filter1.cend() ) + it1 = filter1.find( 0 ); + + const auto& f1 = ( it1 != filter1.cend() ) ? it1->second : noFilter; + const auto& f2 = it2->second; + + if ( f1 != f2 ) + { + QskVariantAnimator animator; + animator.setWindow( m_window ); + animator.setDuration( animatorHint.duration ); + animator.setEasingCurve( animatorHint.type ); + animator.setStartValue( QVariant::fromValue( f1 ) ); + animator.setEndValue( QVariant::fromValue( f2 ) ); + + m_graphicFilterAnimatorMap.emplace( it2->first, animator ); + } + } +} + +void WindowAnimator::addItemAspects( QQuickItem* item, + const QskAnimationHint& animatorHint, const QSet< QskAspect >& candidates, + const QskSkin* skin1, const QskSkin* skin2 ) +{ + if ( !item->isVisible() ) + return; + + if ( auto control = qskControlCast( item ) ) + { + if ( control->isInitiallyPainted() && ( control->effectiveSkin() == skin2 ) ) + { + addHints( control, animatorHint, candidates, skin1, skin2 ); +#if 1 + /* + As it is hard to identify which controls depend on the animated + graphic filters we schedule an initial update and let the + controls do the rest: see QskSkinnable::effectiveGraphicFilter + */ + control->update(); +#endif + } + } + + const auto children = item->childItems(); + for ( auto child : children ) + addItemAspects( child, animatorHint, candidates, skin1, skin2 ); +} + +void WindowAnimator::update() +{ + for ( auto& info : m_updateInfos ) + { + if ( auto control = info.control ) + { + if ( info.updateModes & UpdateInfo::Polish ) + { + control->resetImplicitSize(); + control->polish(); + } + + if ( info.updateModes & UpdateInfo::Update ) + control->update(); + } + } +} + +void WindowAnimator::addHints( const QskControl* control, + const QskAnimationHint& animatorHint, const QSet< QskAspect >& candidates, + const QskSkin* skin1, const QskSkin* skin2 ) +{ + const auto subControls = control->subControls(); + + const auto& localTable = control->hintTable(); + + const auto& table1 = skin1->hintTable(); + const auto& table2 = skin2->hintTable(); + + for ( auto aspect : candidates ) + { + if ( !isControlAffected( control, subControls, aspect ) ) + continue; + + aspect.setPlacement( control->effectivePlacement() ); + aspect.setStates( control->skinStates() ); + + if ( localTable.resolvedHint( aspect ) ) + { + // value is not from the skin - ignored + continue; + } + + QskAspect r1, r2; + + const auto v1 = table1.resolvedHint( aspect, &r1 ); + const auto v2 = table2.resolvedHint( aspect, &r2 ); + + if ( v1 && v2 ) + { + if ( QskVariantAnimator::maybeInterpolate( *v1, *v2 ) ) + { + if ( r1.placement() == r2.placement() ) + aspect.setPlacement( r2.placement() ); + + if ( r1.states() == r2.states() ) + aspect.setStates( r2.states() ); + + storeAnimator( control, aspect, *v1, *v2, animatorHint ); + storeUpdateInfo( control, aspect ); + } + } + else if ( v1 ) + { + aspect.setPlacement( r1.placement() ); + aspect.setStates( r1.states() ); + + storeAnimator( control, aspect, *v1, QVariant(), animatorHint ); + storeUpdateInfo( control, aspect ); + } + else if ( v2 ) + { + aspect.setPlacement( r1.placement() ); + aspect.setStates( r1.states() ); + + storeAnimator( control, aspect, QVariant(), *v2, animatorHint ); + storeUpdateInfo( control, aspect ); + } + } +} + +inline bool WindowAnimator::isControlAffected( const QskControl* control, + const QVector< QskAspect::Subcontrol >& subControls, const QskAspect aspect ) const +{ + if ( !aspect.isMetric() ) + { + if ( !( control->flags() & QQuickItem::ItemHasContents ) ) + { + // while metrics might have an effect on layouts, we + // ignore all others for controls without content + return false; + } + } + + const auto subControl = aspect.subControl(); + if ( subControl != control->effectiveSubcontrol( subControl ) ) + { + // The control uses subcontrol redirection, so we can assume it + // is not interested in this subcontrol. + + return false; + } + + if ( subControl == QskAspect::Control ) + { + if ( !control->autoFillBackground() ) + { + // no need to animate the background unless we show it + return false; + } + } + else + { + if ( !subControls.contains( subControl ) ) + { + // the control is not interested in the aspect + return false; + } + } + + return true; +} + +inline void WindowAnimator::storeAnimator( const QskControl* control, const QskAspect aspect, + const QVariant& value1, const QVariant& value2, QskAnimationHint hint ) +{ + if ( m_animatorMap.find( aspect ) == m_animatorMap.cend() ) + { + m_animatorMap.emplace( aspect, + HintAnimator( control, aspect, value1, value2, hint ) ); + } +} + +inline void WindowAnimator::storeUpdateInfo( const QskControl* control, QskAspect aspect ) +{ + UpdateInfo info; + info.control = const_cast< QskControl* >( control ); + + info.updateModes = UpdateInfo::Update; + if ( aspect.isMetric() ) + info.updateModes |= UpdateInfo::Polish; + + auto it = std::lower_bound( + m_updateInfos.begin(), m_updateInfos.end(), info, UpdateInfo::compare ); + + if ( ( it != m_updateInfos.end() ) && ( it->control == info.control ) ) + it->updateModes |= info.updateModes; + else + m_updateInfos.insert( it, info ); +} + +ApplicationAnimator::~ApplicationAnimator() +{ + reset(); +} + +inline WindowAnimator* ApplicationAnimator::windowAnimator( const QQuickWindow* window ) +{ + if ( window ) + { + for ( auto animator : m_windowAnimators ) + { + if ( animator->window() == window ) + return animator; + } + } + + return nullptr; +} + +void ApplicationAnimator::add( WindowAnimator* animator ) +{ + m_windowAnimators.push_back( animator ); +} + +void ApplicationAnimator::start() +{ + m_connections[0] = QskAnimator::addAdvanceHandler( + this, SLOT(notify(QQuickWindow*)), Qt::UniqueConnection ); + + m_connections[1] = QskAnimator::addCleanupHandler( + this, SLOT(cleanup(QQuickWindow*)), Qt::UniqueConnection ); + + for ( auto& animator : m_windowAnimators ) + animator->start(); +} + +void ApplicationAnimator::reset() +{ + qDeleteAll( m_windowAnimators ); + m_windowAnimators.clear(); + + disconnect( m_connections[0] ); + disconnect( m_connections[1] ); +} + +inline bool ApplicationAnimator::isRunning() const +{ + return !m_windowAnimators.empty(); +} + +void ApplicationAnimator::notify( QQuickWindow* window ) +{ + for ( auto& animator : m_windowAnimators ) + { + if ( animator->window() == window ) + { + animator->update(); + return; + } + } +} + +void ApplicationAnimator::cleanup( QQuickWindow* window ) +{ + for ( auto it = m_windowAnimators.begin(); + it != m_windowAnimators.end(); ++it ) + { + auto animator = *it; + if ( animator->window() == window ) + { + if ( !animator->isRunning() ) + { + // The notification might be for other animators + + m_windowAnimators.erase( it ); + delete animator; + } + + break; + } + } + + if ( m_windowAnimators.empty() ) + reset(); +} class QskSkinTransition::PrivateData { @@ -593,38 +604,20 @@ void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) void QskSkinTransition::process() { - auto skinFrom = m_data->skins[ 0 ]; - auto skinTo = m_data->skins[ 1 ]; + qskApplicationAnimator->reset(); - if ( ( skinFrom == nullptr ) || ( skinTo == nullptr ) ) + auto skin1 = m_data->skins[ 0 ]; + auto skin2 = m_data->skins[ 1 ]; + + QSet< QskAspect > candidates; + + if ( skin1 && skin2 ) { - // do nothing - return; - } - - qskSkinAnimator->reset(); - - if ( ( m_data->animationHint.duration <= 0 ) || ( m_data->mask == 0 ) ) - { - // no animations, we can apply the changes - updateSkin( skinFrom, skinTo ); - return; - } - - QVector< AnimatorCandidate > candidates; - const auto oldFilters = skinFrom->graphicFilters(); - - { - // copy out all hints before updating the skin - // - would be good to have Copy on Write here - - const auto oldTable = skinFrom->hintTable(); - - // apply the changes - updateSkin( skinFrom, skinTo ); - - candidates = qskAnimatorCandidates( m_data->mask, oldTable, oldFilters, - skinTo->hintTable(), skinTo->graphicFilters() ); + if ( ( m_data->animationHint.duration > 0 ) && ( m_data->mask != 0 ) ) + { + qskAddCandidates( m_data->mask, skin1, candidates ); + qskAddCandidates( m_data->mask, skin2, candidates ); + } } if ( !candidates.isEmpty() ) @@ -635,21 +628,19 @@ void QskSkinTransition::process() for ( const auto window : windows ) { - if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) ) + if ( auto w = qobject_cast< QQuickWindow* >( window ) ) { - if ( !quickWindow->isVisible() || - ( qskEffectiveSkin( quickWindow ) != skinTo ) ) + if ( !w->isVisible() || ( qskEffectiveSkin( w ) != skin2 ) ) { continue; } - auto group = new AnimatorGroup( quickWindow ); + auto animator = new WindowAnimator( w ); if ( doGraphicFilter ) { - group->addGraphicFilterAnimators( - m_data->animationHint, oldFilters, - skinTo->graphicFilters() ); + animator->addGraphicFilterAnimators( + m_data->animationHint, skin1, skin2 ); doGraphicFilter = false; } @@ -659,21 +650,24 @@ void QskSkinTransition::process() over the the item trees. */ - group->addAnimators( quickWindow->contentItem(), - m_data->animationHint, candidates, skinTo ); + animator->addItemAspects( w->contentItem(), + m_data->animationHint, candidates, skin1, skin2 ); - qskSkinAnimator->add( group ); + qskApplicationAnimator->add( animator ); } } - qskSkinAnimator->start(); + qskApplicationAnimator->start(); } + + // apply the changes + updateSkin( skin1, skin2 ); } bool QskSkinTransition::isRunning() { - if ( qskSkinAnimator.exists() ) - return qskSkinAnimator->isRunning(); + if ( qskApplicationAnimator.exists() ) + return qskApplicationAnimator->isRunning(); return false; } @@ -681,10 +675,10 @@ bool QskSkinTransition::isRunning() QVariant QskSkinTransition::animatedHint( const QQuickWindow* window, QskAspect aspect ) { - if ( qskSkinAnimator.exists() ) + if ( qskApplicationAnimator.exists() ) { - if ( const auto group = qskSkinAnimator->animatorGroup( window ) ) - return group->animatedHint( aspect ); + if ( const auto animator = qskApplicationAnimator->windowAnimator( window ) ) + return animator->animatedHint( aspect ); } return QVariant(); @@ -693,10 +687,10 @@ QVariant QskSkinTransition::animatedHint( QVariant QskSkinTransition::animatedGraphicFilter( const QQuickWindow* window, int graphicRole ) { - if ( qskSkinAnimator.exists() ) + if ( qskApplicationAnimator.exists() ) { - if ( const auto group = qskSkinAnimator->animatorGroup( window ) ) - return group->animatedGraphicFilter( graphicRole ); + if ( const auto animator = qskApplicationAnimator->windowAnimator( window ) ) + return animator->animatedGraphicFilter( graphicRole ); } return QVariant(); diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 1aca8b64..15d8b0b5 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -38,16 +38,6 @@ static inline bool qskIsControl( const QskSkinnable* skinnable ) return skinnable->metaObject()->inherits( &QskControl::staticMetaObject ); } -static inline QVariant qskTypedNullValue( const QVariant& value ) -{ -#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) - return QVariant( value.metaType() ); -#else - return QVariant( value.userType(), nullptr ); -#endif - -} - static inline bool qskSetFlag( QskSkinnable* skinnable, const QskAspect aspect, int flag ) { @@ -1155,27 +1145,11 @@ void QskSkinnable::startHintTransition( QskAspect aspect, if ( control->window() == nullptr || !isTransitionAccepted( aspect ) ) return; - /* - We might be invalid for one of the values, when an aspect - has not been defined for all states ( f.e. metrics are expected - to fallback to 0.0 ). In this case we create a default one. - */ - auto v1 = from; auto v2 = to; - if ( !v1.isValid() ) - { - v1 = qskTypedNullValue( v2 ); - } - else if ( !v2.isValid() ) - { - v2 = qskTypedNullValue( v1 ); - } - else if ( v1.userType() != v2.userType() ) - { + if ( !QskVariantAnimator::convertValues( v1, v2 ) ) return; - } if ( aspect.flagPrimitive() == QskAspect::GraphicRole ) { diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index fde0e00f..a23fd356 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -76,6 +76,31 @@ QSK_DECL_INSANE static inline QVariant qskInterpolate( return f( from.constData(), to.constData(), progress ); } +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + +using QskMetaType = int; +static inline QskMetaType qskMetaType( const QVariant& v ) { return v.userType(); } + +#else + +using QskMetaType = QMetaType; +static inline QskMetaType qskMetaType( const QVariant& v ) { return v.metaType(); } + +#endif + +static inline QVariant qskDefaultVariant( QskMetaType type ) +{ + return QVariant( type, nullptr ); +} + +static inline QVariant qskConvertedVariant( const QVariant& from, QskMetaType type ) +{ + auto v = from; + v.convert( type ); + + return v; +} + QskVariantAnimator::QskVariantAnimator() : m_interpolator( nullptr ) { @@ -100,35 +125,60 @@ void QskVariantAnimator::setCurrentValue( const QVariant& value ) m_currentValue = value; } +bool QskVariantAnimator::convertValues( QVariant& v1, QVariant& v2 ) +{ + if ( !v1.isValid() && !v2.isValid() ) + return false; + + const auto type1 = qskMetaType( v1 ); + const auto type2 = qskMetaType( v2 ); + + if ( !v1.isValid() ) + { + v1 = qskDefaultVariant( type2 ); + return true; + } + + if ( !v2.isValid() ) + { + v2 = qskDefaultVariant( type1 ); + return true; + } + + if ( type1 != type2 ) + { + if ( v1.canConvert( type2 ) ) + { + v1.convert( type2 ); + return true; + } + + if ( v2.canConvert( type1 ) ) + { + v2.convert( type1 ); + return true; + } + + return false; + } + + return true; +} + void QskVariantAnimator::setup() { m_interpolator = nullptr; - if ( m_startValue.userType() != m_endValue.userType() ) + if ( convertValues( m_startValue, m_endValue ) ) { - /* - Convert one value so that the types are matching. - - As a side effect startValue()/endValue() won't return what had - been set setStartValue()/setEndValue() ! - */ - - if ( m_startValue.canConvert( m_endValue.userType() ) ) + if ( m_startValue != m_endValue ) { - m_startValue.convert( m_endValue.userType() ); - } - else if ( m_endValue.canConvert( m_startValue.userType() ) ) - { - m_endValue.convert( m_startValue.userType() ); - } - } + const auto id = m_startValue.userType(); - const auto type = m_startValue.userType(); - if ( type == m_endValue.userType() ) - { - // all what has been registered by qRegisterAnimationInterpolator - m_interpolator = reinterpret_cast< void ( * )() >( - QVariantAnimationPrivate::getInterpolator( type ) ); + // all what has been registered by qRegisterAnimationInterpolator + m_interpolator = reinterpret_cast< void ( * )() >( + QVariantAnimationPrivate::getInterpolator( id ) ); + } } m_currentValue = m_interpolator ? m_startValue : m_endValue; @@ -150,3 +200,32 @@ void QskVariantAnimator::done() { m_interpolator = nullptr; } + +bool QskVariantAnimator::maybeInterpolate( + const QVariant& value1, const QVariant& value2 ) +{ + if ( !value1.isValid() && !value2.isValid() ) + return false; + + const auto type1 = qskMetaType( value1 ); + const auto type2 = qskMetaType( value2 ); + + if ( !value1.isValid() ) + return value2 != qskDefaultVariant( type2 ); + + if ( !value2.isValid() ) + return value1 != qskDefaultVariant( type1 ); + + if ( type1 != type2 ) + { + if ( value1.canConvert( type2 ) ) + return value2 != qskConvertedVariant( value1, type2 ); + + if ( value2.canConvert( type1 ) ) + return value1 != qskConvertedVariant( value2, type1 ); + + return false; + } + + return value1 != value2; +} diff --git a/src/controls/QskVariantAnimator.h b/src/controls/QskVariantAnimator.h index 1507670d..9e036b06 100644 --- a/src/controls/QskVariantAnimator.h +++ b/src/controls/QskVariantAnimator.h @@ -24,6 +24,9 @@ class QSK_EXPORT QskVariantAnimator : public QskAnimator void setEndValue( const QVariant& ); QVariant endValue() const; + static bool maybeInterpolate( const QVariant&, const QVariant& ); + static bool convertValues( QVariant&, QVariant& ); + protected: void setup() override; void advance( qreal value ) override; From a676caf994fffc77a5c7e3feb69c1f6623c70723 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 13:56:16 +0200 Subject: [PATCH 083/107] support lib reorganized --- examples/automotive/main.cpp | 2 - examples/boxes/main.cpp | 2 - examples/buttons/main.cpp | 2 - examples/colorswitch/main.cpp | 2 - examples/gallery/main.cpp | 2 - examples/iotdashboard/main.cpp | 3 - examples/layouts/main.cpp | 2 - examples/listbox/main.cpp | 2 - examples/messagebox/main.cpp | 2 - examples/messageboxQml/main.cpp | 2 - examples/mycontrols/main.cpp | 2 - examples/qvgviewer/main.cpp | 2 - examples/tabview/main.cpp | 2 - playground/anchors/main.cpp | 2 - playground/dialogbuttons/main.cpp | 2 - playground/grids/main.cpp | 11 -- playground/inputpanel/main.cpp | 2 - playground/webview/main.cpp | 2 - support/SkinnyFont.cpp | 43 ------ support/SkinnyGlobal.h | 17 +-- support/SkinnyNamespace.cpp | 140 ++++++++++++++++++++ support/{SkinnyFont.h => SkinnyNamespace.h} | 13 +- support/SkinnyShapeFactory.h | 5 +- support/SkinnyShapeProvider.h | 5 +- support/SkinnyShortcut.cpp | 72 +--------- support/SkinnyShortcut.h | 7 +- support/support.pro | 4 +- 27 files changed, 161 insertions(+), 191 deletions(-) delete mode 100644 support/SkinnyFont.cpp create mode 100644 support/SkinnyNamespace.cpp rename support/{SkinnyFont.h => SkinnyNamespace.h} (63%) diff --git a/examples/automotive/main.cpp b/examples/automotive/main.cpp index ed93e224..d4fd90f2 100644 --- a/examples/automotive/main.cpp +++ b/examples/automotive/main.cpp @@ -7,7 +7,6 @@ #include "SkinFactory.h" #include -#include #include #include @@ -33,7 +32,6 @@ int main( int argc, char** argv ) */ qskSetup->setItemUpdateFlag( QskQuickItem::PreferRasterForTextures, true ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); MainWindow window; diff --git a/examples/boxes/main.cpp b/examples/boxes/main.cpp index bfe8678d..95261fc2 100644 --- a/examples/boxes/main.cpp +++ b/examples/boxes/main.cpp @@ -5,7 +5,6 @@ #include "Box.h" -#include #include #include @@ -555,7 +554,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugShortcuts ); auto* tabView = new TabView(); diff --git a/examples/buttons/main.cpp b/examples/buttons/main.cpp index 26ee773f..373e695d 100644 --- a/examples/buttons/main.cpp +++ b/examples/buttons/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -24,7 +23,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QQmlApplicationEngine engine( QUrl( "qrc:/qml/buttons.qml" ) ); diff --git a/examples/colorswitch/main.cpp b/examples/colorswitch/main.cpp index 59a1361a..00d69450 100644 --- a/examples/colorswitch/main.cpp +++ b/examples/colorswitch/main.cpp @@ -5,7 +5,6 @@ #include "Theme.h" -#include #include #include @@ -28,7 +27,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::ChangeFonts | SkinnyShortcut::DebugShortcuts ); diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 838d9106..1fca95f2 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -8,7 +8,6 @@ #include "slider/SliderPage.h" #include "switchbutton/SwitchButtonPage.h" -#include #include #include @@ -44,7 +43,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); auto tabView = new TabView(); diff --git a/examples/iotdashboard/main.cpp b/examples/iotdashboard/main.cpp index 80be72ba..a1457e0d 100644 --- a/examples/iotdashboard/main.cpp +++ b/examples/iotdashboard/main.cpp @@ -7,7 +7,6 @@ #include "GraphicProvider.h" #include "Skin.h" -#include #include #include @@ -61,8 +60,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); - Qsk::addGraphicProvider( QString(), new GraphicProvider() ); // disable default skins diff --git a/examples/layouts/main.cpp b/examples/layouts/main.cpp index f6d59be6..6c829fd5 100644 --- a/examples/layouts/main.cpp +++ b/examples/layouts/main.cpp @@ -10,7 +10,6 @@ #include "StackLayoutPage.h" #include "TestRectangle.h" -#include #include #include @@ -31,7 +30,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); auto tabView = new QskTabView(); diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp index 487796aa..2c1e2099 100644 --- a/examples/listbox/main.cpp +++ b/examples/listbox/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -65,7 +64,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QskWindow window; diff --git a/examples/messagebox/main.cpp b/examples/messagebox/main.cpp index f5702319..f1b96068 100644 --- a/examples/messagebox/main.cpp +++ b/examples/messagebox/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -126,7 +125,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); qskDialog->setPolicy( QskDialog::EmbeddedBox ); diff --git a/examples/messageboxQml/main.cpp b/examples/messageboxQml/main.cpp index 58d084a6..3e7a0694 100644 --- a/examples/messageboxQml/main.cpp +++ b/examples/messageboxQml/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -22,7 +21,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QQmlApplicationEngine engine( QUrl( "qrc:/qml/messagebox.qml" ) ); diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index 996bcd02..7102c1a7 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -6,7 +6,6 @@ #include "MySkin.h" #include "MyToggleButton.h" -#include #include #include @@ -136,7 +135,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::DebugBackground | SkinnyShortcut::DebugStatistics | SkinnyShortcut::Quit ); diff --git a/examples/qvgviewer/main.cpp b/examples/qvgviewer/main.cpp index c6a53784..31d62caa 100644 --- a/examples/qvgviewer/main.cpp +++ b/examples/qvgviewer/main.cpp @@ -5,7 +5,6 @@ #include "MainWindow.h" -#include #include #ifdef CONTEXT_MENU @@ -29,7 +28,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QskFocusIndicator* focusIndicator = new QskFocusIndicator(); diff --git a/examples/tabview/main.cpp b/examples/tabview/main.cpp index 7afab28f..5fbd43dc 100644 --- a/examples/tabview/main.cpp +++ b/examples/tabview/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -90,7 +89,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); auto tabView = new TabView(); diff --git a/playground/anchors/main.cpp b/playground/anchors/main.cpp index 7f758ec6..a75c279d 100644 --- a/playground/anchors/main.cpp +++ b/playground/anchors/main.cpp @@ -5,7 +5,6 @@ #include "AnchorBox.h" -#include #include #include @@ -153,7 +152,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugShortcuts ); auto box = new MyBox(); diff --git a/playground/dialogbuttons/main.cpp b/playground/dialogbuttons/main.cpp index 7393099d..b55461f9 100644 --- a/playground/dialogbuttons/main.cpp +++ b/playground/dialogbuttons/main.cpp @@ -5,7 +5,6 @@ #include "Window.h" -#include #include #include @@ -21,7 +20,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); Window window( Qt::Horizontal ); diff --git a/playground/grids/main.cpp b/playground/grids/main.cpp index 40dd8a8a..ea81b96a 100644 --- a/playground/grids/main.cpp +++ b/playground/grids/main.cpp @@ -5,8 +5,6 @@ #include "TestBox.h" -#include - #include #include @@ -389,15 +387,6 @@ int main( int argc, char** argv ) { QApplication app( argc, argv ); -#if 1 - /* - we don't need the fonts, but by calling something from - the support library initializations regarding the skins - are loaded. TODO ... - */ - SkinnyFont::init( &app ); -#endif - int testcase = 0; if ( argc == 2 ) testcase = atoi( argv[1] ); diff --git a/playground/inputpanel/main.cpp b/playground/inputpanel/main.cpp index d26e3361..af6994cd 100644 --- a/playground/inputpanel/main.cpp +++ b/playground/inputpanel/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -285,7 +284,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); #if 1 diff --git a/playground/webview/main.cpp b/playground/webview/main.cpp index 0a6de6ec..454e3639 100644 --- a/playground/webview/main.cpp +++ b/playground/webview/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -43,7 +42,6 @@ int main( int argc, char* argv[] ) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugShortcuts ); QskWindow window; diff --git a/support/SkinnyFont.cpp b/support/SkinnyFont.cpp deleted file mode 100644 index 7278c388..00000000 --- a/support/SkinnyFont.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "SkinnyFont.h" - -#include -#include -#include -#include - -#define STRINGIFY(x) #x -#define STRING(x) STRINGIFY(x) - -void SkinnyFont::init( QGuiApplication* ) -{ -#ifdef FONTCONFIG_FILE - const char env[] = "FONTCONFIG_FILE"; - if ( !qEnvironmentVariableIsSet( env ) ) - qputenv( env, STRING( FONTCONFIG_FILE ) ); -#endif - - QElapsedTimer timer; - timer.start(); - - QFontDatabase(); - - const auto elapsed = timer.elapsed(); - - if ( elapsed > 20 ) - { - qWarning() << "Loading fonts needed" << elapsed << "ms" - << "- usually because of creating a font cache."; - } - - /* - The default initialization in QskSkin sets up its font table - with using the application font for the default font role. - */ - QGuiApplication::setFont( QFont( "DejaVuSans", 12 ) ); -} - diff --git a/support/SkinnyGlobal.h b/support/SkinnyGlobal.h index 4f5a9a17..9c350ab8 100644 --- a/support/SkinnyGlobal.h +++ b/support/SkinnyGlobal.h @@ -3,23 +3,20 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_GLOBAL_H -#define SKINNY_GLOBAL_H +#pragma once #include #ifdef QSK_DLL -#if defined( SKINNY_MAKEDLL ) // create a DLL library -#define SKINNY_EXPORT Q_DECL_EXPORT -#else // use a DLL library -#define SKINNY_EXPORT Q_DECL_IMPORT -#endif + #if defined( SKINNY_MAKEDLL ) // create a DLL library + #define SKINNY_EXPORT Q_DECL_EXPORT + #else // use a DLL library + #define SKINNY_EXPORT Q_DECL_IMPORT + #endif #endif // QSK_DLL #ifndef SKINNY_EXPORT -#define SKINNY_EXPORT -#endif - + #define SKINNY_EXPORT #endif diff --git a/support/SkinnyNamespace.cpp b/support/SkinnyNamespace.cpp new file mode 100644 index 00000000..baf2d6a6 --- /dev/null +++ b/support/SkinnyNamespace.cpp @@ -0,0 +1,140 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the 3-clause BSD License + *****************************************************************************/ + +#include "SkinnyNamespace.h" + +#include +#include +#include +#include +#include + +#include +#include + +#define STRINGIFY(x) #x +#define STRING(x) STRINGIFY(x) + +#if defined( ENSURE_SKINS ) + + #include + #include + + static void initSkins() + { + if ( qskSkinManager->skinNames().isEmpty() ) + { + /* + To avoid having problems with not finding the skin plugins + we manually add them here. + */ + + qskSkinManager->registerFactory( "SquiekFactory", new QskSquiekSkinFactory() ); + qskSkinManager->registerFactory( "MaterialFactory", new QskMaterialSkinFactory() ); + + qWarning() << "Couldn't find skin plugins, adding some manually."; + } + } + + Q_COREAPP_STARTUP_FUNCTION( initSkins ) + +#endif + +#define ENSURE_FONTS + +#if defined( ENSURE_FONTS ) + + #include + #include + + static void initFonts() + { + #ifdef FONTCONFIG_FILE + const char env[] = "FONTCONFIG_FILE"; + if ( !qEnvironmentVariableIsSet( env ) ) + qputenv( env, STRING( FONTCONFIG_FILE ) ); + #endif + + QElapsedTimer timer; + timer.start(); + + QFontDatabase(); + + const auto elapsed = timer.elapsed(); + + if ( elapsed > 20 ) + { + qWarning() << "Loading fonts needed" << elapsed << "ms" + << "- usually because of creating a font cache."; + } + + /* + The default initialization in QskSkin sets up its font table + with using the application font for the default font role. + */ + QGuiApplication::setFont( QFont( "DejaVuSans", 12 ) ); + } +#endif + +Q_COREAPP_STARTUP_FUNCTION( initFonts ) + +void Skinny::changeSkin( QskAnimationHint hint ) +{ + const auto names = qskSkinManager->skinNames(); + if ( names.size() <= 1 ) + return; + + int index = names.indexOf( qskSetup->skinName() ); + index = ( index + 1 ) % names.size(); + + auto oldSkin = qskSetup->skin(); + if ( oldSkin->parent() == qskSetup ) + oldSkin->setParent( nullptr ); // otherwise setSkin deletes it + + if ( auto newSkin = qskSetup->setSkin( names[ index ] ) ) + { + QskSkinTransition transition; + + //transition.setMask( QskAspect::Color ); // Metrics are flickering -> TODO + transition.setSourceSkin( oldSkin ); + transition.setTargetSkin( newSkin ); + transition.setAnimation( hint ); + + transition.process(); + + if ( oldSkin->parent() == nullptr ) + delete oldSkin; + } +} + +void Skinny::changeFonts( int increment ) +{ + auto skin = qskSetup->skin(); + + const auto fonts = skin->fonts(); + + for ( auto it = fonts.begin(); it != fonts.end(); ++it ) + { + auto role = it->first; + auto font = it->second; + + if ( font.pixelSize() > 0 ) + { + const auto newSize = font.pixelSize() + increment; + if ( newSize > 0 ) + font.setPixelSize( newSize ); + } + else + { + const auto newSize = font.pointSizeF() + increment; + if ( newSize > 0 ) + font.setPointSizeF( font.pointSizeF() + increment ); + } + + skin->setFont( role, font ); + } + + Q_EMIT qskSetup->skinChanged( skin ); +} diff --git a/support/SkinnyFont.h b/support/SkinnyNamespace.h similarity index 63% rename from support/SkinnyFont.h rename to support/SkinnyNamespace.h index db2675a9..072e60b2 100644 --- a/support/SkinnyFont.h +++ b/support/SkinnyNamespace.h @@ -3,16 +3,13 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_FONT_H_ -#define SKINNY_FONT_H_ +#pragma once #include "SkinnyGlobal.h" +#include -class QGuiApplication; - -namespace SkinnyFont +namespace Skinny { - SKINNY_EXPORT void init( QGuiApplication* ); + SKINNY_EXPORT void changeSkin( QskAnimationHint hint = 500 ); + SKINNY_EXPORT void changeFonts( int increment ); } - -#endif diff --git a/support/SkinnyShapeFactory.h b/support/SkinnyShapeFactory.h index 3cbb591d..42794218 100644 --- a/support/SkinnyShapeFactory.h +++ b/support/SkinnyShapeFactory.h @@ -3,8 +3,7 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_SHAPE_FACTORY_H_ -#define SKINNY_SHAPE_FACTORY_H_ +#pragma once #include "SkinnyGlobal.h" #include @@ -32,5 +31,3 @@ namespace SkinnyShapeFactory SKINNY_EXPORT QPainterPath shapePath( Shape, const QSizeF& ); } - -#endif diff --git a/support/SkinnyShapeProvider.h b/support/SkinnyShapeProvider.h index 3b5f7962..fb0a8155 100644 --- a/support/SkinnyShapeProvider.h +++ b/support/SkinnyShapeProvider.h @@ -3,8 +3,7 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_SHAPE_PROVIDER_H -#define SKINNY_SHAPE_PROVIDER_H +#pragma once #include "SkinnyGlobal.h" #include @@ -15,5 +14,3 @@ class SKINNY_EXPORT SkinnyShapeProvider : public QskGraphicProvider const QskGraphic* loadGraphic( const QString& id ) const override final; }; -#endif - diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 582827fb..6226f559 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -1,15 +1,11 @@ #include "SkinnyShortcut.h" +#include "SkinnyNamespace.h" #include #include -#include #include -#include -#include #include #include -#include -#include #include #include @@ -17,7 +13,6 @@ #include #include -#include #include SkinnyShortcut::SkinnyShortcut( QObject* parent ): @@ -34,17 +29,17 @@ void SkinnyShortcut::enable( Types types ) if ( types & RotateSkin ) { QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_S ), - false, &s_shortcut, &SkinnyShortcut::rotateSkin ); + false, &s_shortcut, [] { Skinny::changeSkin(); } ); cout << "CTRL-S to change the skin." << endl; } if ( types & ChangeFonts ) { QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_F ), - false, &s_shortcut, [] { s_shortcut.changeFonts( +1 ); } ); + false, &s_shortcut, [] { Skinny::changeFonts( +1 ); } ); QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_G ), - false, &s_shortcut, [] { s_shortcut.changeFonts( -1 ); } ); + false, &s_shortcut, [] { Skinny::changeFonts( -1 ); } ); cout << "CTRL-F to increase the font size." << endl; cout << "CTRL-G to decrease the font size." << endl; @@ -75,35 +70,6 @@ void SkinnyShortcut::enable( Types types ) } } -void SkinnyShortcut::rotateSkin() -{ - const auto names = qskSkinManager->skinNames(); - if ( names.size() <= 1 ) - return; - - int index = names.indexOf( qskSetup->skinName() ); - index = ( index + 1 ) % names.size(); - - auto oldSkin = qskSetup->skin(); - if ( oldSkin->parent() == qskSetup ) - oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - - if ( auto newSkin = qskSetup->setSkin( names[ index ] ) ) - { - QskSkinTransition transition; - - //transition.setMask( QskAspect::Color ); // Metrics are flickering -> TODO - transition.setSourceSkin( oldSkin ); - transition.setTargetSkin( newSkin ); - transition.setAnimation( 500 ); - - transition.process(); - - if ( oldSkin->parent() == nullptr ) - delete oldSkin; - } -} - void SkinnyShortcut::showBackground() { #if 0 @@ -149,36 +115,6 @@ void SkinnyShortcut::showBackground() } } -void SkinnyShortcut::changeFonts( int increment ) -{ - auto skin = qskSetup->skin(); - - const auto fonts = skin->fonts(); - - for ( auto it = fonts.begin(); it != fonts.end(); ++it ) - { - auto role = it->first; - auto font = it->second; - - if ( font.pixelSize() > 0 ) - { - const auto newSize = font.pixelSize() + increment; - if ( newSize > 0 ) - font.setPixelSize( newSize ); - } - else - { - const auto newSize = font.pointSizeF() + increment; - if ( newSize > 0 ) - font.setPointSizeF( font.pointSizeF() + increment ); - } - - skin->setFont( role, font ); - } - - Q_EMIT qskSetup->skinChanged( skin ); -} - static inline void countNodes( const QSGNode* node, int& counter ) { if ( node ) diff --git a/support/SkinnyShortcut.h b/support/SkinnyShortcut.h index 52222f18..8f63781f 100644 --- a/support/SkinnyShortcut.h +++ b/support/SkinnyShortcut.h @@ -3,8 +3,7 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_SHORTCUT_H_ -#define SKINNY_SHORTCUT_H_ +#pragma once #include "SkinnyGlobal.h" #include @@ -34,12 +33,8 @@ class SKINNY_EXPORT SkinnyShortcut : public QObject private: SkinnyShortcut( QObject* parent = nullptr ); - void rotateSkin(); - void changeFonts( int increment ); void showBackground(); void debugStatistics(); }; Q_DECLARE_OPERATORS_FOR_FLAGS( SkinnyShortcut::Types ) - -#endif diff --git a/support/support.pro b/support/support.pro index 699b1f2b..b02cb0d9 100644 --- a/support/support.pro +++ b/support/support.pro @@ -12,13 +12,13 @@ contains(QSK_CONFIG, QskDll): DEFINES += SKINNY_MAKEDLL HEADERS += \ SkinnyGlobal.h \ - SkinnyFont.h \ + SkinnyNamespace.h \ SkinnyShapeFactory.h \ SkinnyShapeProvider.h \ SkinnyShortcut.h SOURCES += \ - SkinnyFont.cpp \ + SkinnyNamespace.cpp \ SkinnyPlugin.cpp \ SkinnyShapeFactory.cpp \ SkinnyShapeProvider.cpp \ From 0cd577c977a3df2c7f5bfb3adeaa1848443cc82b Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 13:57:26 +0200 Subject: [PATCH 084/107] making QskSwtchButton smaller --- skins/squiek/QskSquiekSkin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index f7031ae1..bfdd6706 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -892,7 +892,7 @@ void Editor::setupSwitchButton() using A = QskAspect; using Q = QskSwitchButton; - const qreal radius = qskDpiScaled( 18 ); + const qreal radius = qskDpiScaled( 12 ); const qreal handleSize = 2 * ( radius - 2 ); setBoxShape( Q::Groove, 100, Qt::RelativeSize ); From 01afcd85575947568bf5dd85568fe801cef3b41a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 14:41:56 +0200 Subject: [PATCH 085/107] using c++11 --- src/common/QskAspect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/QskAspect.cpp b/src/common/QskAspect.cpp index a45febbb..6162df0e 100644 --- a/src/common/QskAspect.cpp +++ b/src/common/QskAspect.cpp @@ -144,7 +144,7 @@ QVector< QskAspect::Subcontrol > QskAspect::subControls( const QMetaObject* meta static QByteArray qskEnumString( const char* name, int value ) { - const QMetaObject& mo = QskAspect::staticMetaObject; + const auto& mo = QskAspect::staticMetaObject; const QMetaEnum metaEnum = mo.enumerator( mo.indexOfEnumerator( name ) ); const char* key = metaEnum.valueToKey( value ); From a40ca46556f853e3d569ce4509723c2a9298bcb6 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 14:42:18 +0200 Subject: [PATCH 086/107] font initialization changed --- src/controls/QskSkin.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 85215d98..e438816c 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -12,6 +12,7 @@ #include "QskGraphicProviderMap.h" #include "QskSkinHintTable.h" #include "QskStandardSymbol.h" +#include "QskPlatform.h" #include "QskMargins.h" @@ -216,13 +217,14 @@ void QskSkin::declareSkinlet( const QMetaObject* metaObject, void QskSkin::setupFonts( const QString& family, int weight, bool italic ) { + const int sizes[] = { 10, 15, 20, 32, 66 }; + static_assert( sizeof( sizes ) / sizeof( sizes[ 0 ] ) == HugeFont ); + QFont font( family, -1, weight, italic ); - const uint base = TinyFont; for ( int i = TinyFont; i <= HugeFont; i++ ) { - // TODO: make the scaling components configurable - font.setPixelSize( int( std::pow( uint( i ) - base + 2, 2.5 ) ) ); + font.setPixelSize( qskDpiScaled( sizes[i-1] ) ); m_data->fonts[ i ] = font; } From ff8b4245a68271efd4bd9a899a1610b170c5745a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 14:43:22 +0200 Subject: [PATCH 087/107] text box reimplemented --- examples/gallery/label/LabelPage.cpp | 48 ++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/examples/gallery/label/LabelPage.cpp b/examples/gallery/label/LabelPage.cpp index 8e4a2813..7b945ce8 100644 --- a/examples/gallery/label/LabelPage.cpp +++ b/examples/gallery/label/LabelPage.cpp @@ -8,29 +8,51 @@ #include #include #include +#include namespace { + class TextLabel : public QskTextLabel + { + public: + TextLabel( int role, QQuickItem* parent = nullptr ) + : QskTextLabel( parent ) + { + setText( textFromRole( role ) ); + setFontRole( role ); + + setSizePolicy( Qt::Horizontal, QskSizePolicy::Ignored ); + } + + private: + QString textFromRole( int role ) const + { + static QMetaEnum metaEnum; + + if ( !metaEnum.isValid() ) + { + const auto& mo = QskSkin::staticMetaObject; + metaEnum = mo.enumerator( mo.indexOfEnumerator( "SkinFontRole" ) ); + } + + QString s( metaEnum.valueToKey( role ) ); + s.remove( QStringLiteral( "Font" ) ); + + return s; + } + }; + class TextBox : public QskLinearBox { public: TextBox( QQuickItem* parent = nullptr ) - : QskLinearBox( Qt::Vertical, 3, parent ) + : QskLinearBox( Qt::Horizontal, 3, parent ) { setMargins( 10 ); - //setDefaultAlignment( Qt::AlignTop ); - setExtraSpacingAt( Qt::BottomEdge ); + setDefaultAlignment( Qt::AlignCenter ); - const QStringList texts = - { "Default", "Tiny", "Small", "Medium", "Large", "Huge" }; - - for ( int i = 0; i < texts.size(); i++ ) - { - auto label = new QskTextLabel( texts[ i ] + " Font", this ); - - //label->setPanel( true ); - label->setFontRole( i ); - } + for ( int i = 0; i <= QskSkin::HugeFont; i++ ) + ( void ) new TextLabel( i, this ); } }; From bd9718007d8200125f3404b560117e3dfdfdf5ed Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 14:53:20 +0200 Subject: [PATCH 088/107] workaround for Qt 6.2 incompatibility --- playground/images/images.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/playground/images/images.qml b/playground/images/images.qml index 1ee7fb4f..b5132ff5 100644 --- a/playground/images/images.qml +++ b/playground/images/images.qml @@ -17,7 +17,8 @@ Qsk.Window orientation: Qt.Horizontal dimension: 3 - margins: 10 + //margins: 10 // only possible with Qt <= 6.1 + margins { left: 10; top: 10; right: 10; bottom: 10 } spacing: 10 Repeater From 4cb3301045c3201592e93ff2c79bd0d8320dc725 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 14:54:31 +0200 Subject: [PATCH 089/107] push buttons added --- examples/gallery/button/ButtonPage.cpp | 88 +++++++++++++++++++ .../ButtonPage.h} | 4 +- examples/gallery/gallery.pro | 4 +- examples/gallery/main.cpp | 72 +++++++++++++-- .../gallery/switchbutton/SwitchButtonPage.cpp | 54 ------------ 5 files changed, 155 insertions(+), 67 deletions(-) create mode 100644 examples/gallery/button/ButtonPage.cpp rename examples/gallery/{switchbutton/SwitchButtonPage.h => button/ButtonPage.h} (80%) delete mode 100644 examples/gallery/switchbutton/SwitchButtonPage.cpp diff --git a/examples/gallery/button/ButtonPage.cpp b/examples/gallery/button/ButtonPage.cpp new file mode 100644 index 00000000..9a347c37 --- /dev/null +++ b/examples/gallery/button/ButtonPage.cpp @@ -0,0 +1,88 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the 3-clause BSD License + *****************************************************************************/ + +#include "ButtonPage.h" + +#include +#include +#include +#include + +namespace +{ + class ButtonBox : public QskLinearBox + { + public: + ButtonBox( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Horizontal, 4, parent ) + { + setSpacing( 20 ); + setExtraSpacingAt( Qt::BottomEdge ); + setDefaultAlignment( Qt::AlignCenter ); + + populate(); + } + + private: + void populate() + { + const char* texts[] = { "Press Me", "Check Me" }; + const char* graphics[] = { "diamond/khaki", "ellipse/sandybrown" }; + + for ( int i = 0; i < 6; i++ ) + { + const int index = i % 2; + + auto button = new QskPushButton( this ); + button->setCheckable( index != 0 ); + //button->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); + + if ( i > 1 ) + { + auto src = QStringLiteral( "image://shapes/" ) + graphics[ index ]; + button->setGraphicSource( src ); + } + + if ( i < 2 || i > 3 ) + { + button->setText( texts[ index ] ); + } + } + } + }; + + class SwitchButtonBox : public QskLinearBox + { + public: + SwitchButtonBox( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Horizontal, parent ) + { + setSpacing( 20 ); + setExtraSpacingAt( Qt::LeftEdge | Qt::RightEdge | Qt::BottomEdge ); + + for ( auto orientation : { Qt::Vertical, Qt::Horizontal } ) + { + (void) new QskSwitchButton( orientation, this ); + + auto button = new QskSwitchButton( orientation, this ); + button->setInverted( true ); + } + } + }; +} + +ButtonPage::ButtonPage( QQuickItem* parent ) + : Page( Qt::Vertical, parent ) +{ + setSpacing( 40 ); + populate(); +} + +void ButtonPage::populate() +{ + new ButtonBox( this ); + new QskSeparator( Qt::Horizontal, this ); + new SwitchButtonBox( this ); +} diff --git a/examples/gallery/switchbutton/SwitchButtonPage.h b/examples/gallery/button/ButtonPage.h similarity index 80% rename from examples/gallery/switchbutton/SwitchButtonPage.h rename to examples/gallery/button/ButtonPage.h index 377092da..ad7cad86 100644 --- a/examples/gallery/switchbutton/SwitchButtonPage.h +++ b/examples/gallery/button/ButtonPage.h @@ -7,10 +7,10 @@ #include "Page.h" -class SwitchButtonPage : public Page +class ButtonPage : public Page { public: - SwitchButtonPage( QQuickItem* = nullptr ); + ButtonPage( QQuickItem* = nullptr ); private: void populate(); diff --git a/examples/gallery/gallery.pro b/examples/gallery/gallery.pro index 75cd1071..2c1eedb3 100644 --- a/examples/gallery/gallery.pro +++ b/examples/gallery/gallery.pro @@ -25,10 +25,10 @@ SOURCES += \ progressbar/ProgressBarPage.cpp \ HEADERS += \ - switchbutton/SwitchButtonPage.h + button/ButtonPage.h SOURCES += \ - switchbutton/SwitchButtonPage.cpp \ + button/ButtonPage.cpp \ HEADERS += \ Page.h diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 1fca95f2..6d4b79c3 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -6,7 +6,7 @@ #include "label/LabelPage.h" #include "progressbar/ProgressBarPage.h" #include "slider/SliderPage.h" -#include "switchbutton/SwitchButtonPage.h" +#include "button/ButtonPage.h" #include #include @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include @@ -30,6 +32,61 @@ namespace setTabPosition( Qsk::Left ); setAutoFitTabs( true ); } + + void setTabsEnabled( bool on ) + { + for ( int i = 0; i < count(); i++ ) + itemAt( i )->setEnabled( on ); + } + }; + + /* + Once QskApplicationView and friends are implemented we can replace + Header/ApplicationWindow with it. TODO ... + */ + class Header : public QskLinearBox + { + Q_OBJECT + + public: + Header( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Horizontal, parent ) + { + initSizePolicy( QskSizePolicy::Ignored, QskSizePolicy::Fixed ); + setMargins( 10 ); + + addStretch( 10 ); + + new QskTextLabel( "Enabled", this ); + + auto button = new QskSwitchButton( this ); + button->setChecked( true ); + + connect( button, &QskSwitchButton::toggled, + this, &Header::enabledToggled ); + } + + Q_SIGNALS: + void enabledToggled( bool ); + }; + + class ApplicationView : public QskLinearBox + { + public: + ApplicationView( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Vertical, parent ) + { + auto header = new Header( this ); + + auto tabView = new TabView( this ); + tabView->addTab( "Labels", new LabelPage() ); + tabView->addTab( "Buttons", new ButtonPage() ); + tabView->addTab( "Sliders", new SliderPage() ); + tabView->addTab( "Progress\nBars", new ProgressBarPage() ); + + connect( header, &Header::enabledToggled, + tabView, &TabView::setTabsEnabled ); + } }; } @@ -45,18 +102,13 @@ int main( int argc, char* argv[] ) SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); - auto tabView = new TabView(); - - tabView->addTab( "Labels", new LabelPage() ); - tabView->addTab( "Sliders", new SliderPage() ); - tabView->addTab( "Progress\nBars", new ProgressBarPage() ); - tabView->addTab( "Switches", new SwitchButtonPage() ); + auto mainView = new ApplicationView(); QSize size( 800, 600 ); - size = size.expandedTo( tabView->sizeHint().toSize() ); + size = size.expandedTo( mainView->sizeHint().toSize() ); QskWindow window; - window.addItem( tabView ); + window.addItem( mainView ); window.addItem( new QskFocusIndicator() ); window.resize( size ); @@ -64,3 +116,5 @@ int main( int argc, char* argv[] ) return app.exec(); } + +#include "main.moc" diff --git a/examples/gallery/switchbutton/SwitchButtonPage.cpp b/examples/gallery/switchbutton/SwitchButtonPage.cpp deleted file mode 100644 index 1fab35b1..00000000 --- a/examples/gallery/switchbutton/SwitchButtonPage.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "SwitchButtonPage.h" - -#include -#include -#include -#include - -#include - -SwitchButtonPage::SwitchButtonPage( QQuickItem* parent ) - : Page( Qt::Horizontal, parent ) -{ - setSpacing( 40 ); - populate(); -} - -void SwitchButtonPage::populate() -{ - auto hbox1 = new QskLinearBox(); - hbox1->setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed ); - hbox1->setExtraSpacingAt( Qt::LeftEdge ); - - auto label = new QskTextLabel( "Disable the switches:", hbox1 ); - label->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); - - auto button0 = new QskSwitchButton( hbox1 ); - - auto hbox2 = new QskLinearBox( Qt::Horizontal ); - hbox2->setDefaultAlignment( Qt::AlignHCenter | Qt::AlignTop ); - hbox2->setMargins( 30 ); - - (void) new QskSwitchButton( Qt::Vertical, hbox2 ); - (void) new QskSwitchButton( Qt::Horizontal, hbox2 ); - - auto button3 = new QskSwitchButton( Qt::Vertical, hbox2 ); - button3->setInverted( true ); - - auto button4 = new QskSwitchButton( Qt::Horizontal, hbox2 ); - button4->setInverted( true ); - - auto vbox = new QskLinearBox( Qt::Vertical, this ); - vbox->addItem( hbox1 ); - vbox->addItem( new QskSeparator() ); - vbox->addItem( hbox2 ); - vbox->setExtraSpacingAt( Qt::BottomEdge ); - - QObject::connect( button0, &QskSwitchButton::checkedChanged, - hbox2, &QskQuickItem::setDisabled ); -} From 0c7b14401b31382eb14e6d19954928d8ef892e75 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 15:58:47 +0200 Subject: [PATCH 090/107] change skin button added --- examples/gallery/main.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 6d4b79c3..7123fe62 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -10,12 +10,14 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -53,17 +55,32 @@ namespace : QskLinearBox( Qt::Horizontal, parent ) { initSizePolicy( QskSizePolicy::Ignored, QskSizePolicy::Fixed ); + setMargins( 10 ); + setBackgroundColor( Qt::lightGray ); + + { + auto button = new QskPushButton( "Skin", this ); +#if 1 + button->setFlat( true ); // until we have the section bit in QskAspect +#endif + + // transition leads to errors, when changing the tab before being completed. TODO ... + connect( button, &QskSwitchButton::clicked, + [] { Skinny::changeSkin( 500 ); } ); + } addStretch( 10 ); - new QskTextLabel( "Enabled", this ); + { + new QskTextLabel( "Enabled", this ); - auto button = new QskSwitchButton( this ); - button->setChecked( true ); + auto button = new QskSwitchButton( this ); + button->setChecked( true ); - connect( button, &QskSwitchButton::toggled, - this, &Header::enabledToggled ); + connect( button, &QskSwitchButton::toggled, + this, &Header::enabledToggled ); + } } Q_SIGNALS: From 4d724bb6fe378989c11b4283b5455df727407958 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 1 Apr 2022 17:00:05 +0200 Subject: [PATCH 091/107] compiler error fixed --- src/controls/QskSkin.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index e438816c..1f8b67db 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -218,7 +218,8 @@ void QskSkin::declareSkinlet( const QMetaObject* metaObject, void QskSkin::setupFonts( const QString& family, int weight, bool italic ) { const int sizes[] = { 10, 15, 20, 32, 66 }; - static_assert( sizeof( sizes ) / sizeof( sizes[ 0 ] ) == HugeFont ); + static_assert( sizeof( sizes ) / sizeof( sizes[ 0 ] ) == HugeFont, + "QskSkin::setupFonts: bad list size." ); QFont font( family, -1, weight, italic ); From ff316ce1ede1c192b10fa1a3421e40ea8e36627a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 3 Apr 2022 16:25:13 +0200 Subject: [PATCH 092/107] Q_DECLARE_TYPEINFO fixed --- src/common/QskGradientStop.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/common/QskGradientStop.h b/src/common/QskGradientStop.h index 926803c9..3149eea4 100644 --- a/src/common/QskGradientStop.h +++ b/src/common/QskGradientStop.h @@ -48,7 +48,10 @@ class QSK_EXPORT QskGradientStop QColor m_color; // using RGBA instead ? }; -Q_DECLARE_TYPEINFO( QskGradientStop, Q_MOVABLE_TYPE ); +#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) + Q_DECLARE_TYPEINFO( QskGradientStop, Q_RELOCATABLE_TYPE ); +#endif + Q_DECLARE_METATYPE( QskGradientStop ) inline constexpr QskGradientStop::QskGradientStop() noexcept From 6728ad2bdc3f69f7777c2d0e656d53e43920e65c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 3 Apr 2022 16:25:46 +0200 Subject: [PATCH 093/107] only check if types do match without doing the conversion --- src/controls/QskSkinnable.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 15d8b0b5..29207849 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -1145,12 +1145,12 @@ void QskSkinnable::startHintTransition( QskAspect aspect, if ( control->window() == nullptr || !isTransitionAccepted( aspect ) ) return; + if ( !QskVariantAnimator::maybeInterpolate( from, to ) ) + return; + auto v1 = from; auto v2 = to; - if ( !QskVariantAnimator::convertValues( v1, v2 ) ) - return; - if ( aspect.flagPrimitive() == QskAspect::GraphicRole ) { const auto skin = effectiveSkin(); From f4a9b15f11cd37d4e3b674358ff1d56da8b4c41f Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 3 Apr 2022 16:27:10 +0200 Subject: [PATCH 094/107] stop animation, when start/endValues are chaged. Otherwise we will run into crashes, when value types have not been aligned or can't be aligned --- src/controls/QskVariantAnimator.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index a23fd356..c54d4ea3 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -53,13 +53,13 @@ Q_CONSTRUCTOR_FUNCTION( qskRegisterInterpolator ) #endif #if defined( Q_CC_CLANG ) -#if __has_feature( address_sanitizer ) -#define QSK_DECL_INSANE __attribute__( ( no_sanitize( "undefined" ) ) ) -#endif + #if __has_feature( address_sanitizer ) + #define QSK_DECL_INSANE __attribute__( ( no_sanitize( "undefined" ) ) ) + #endif #endif #if !defined( QSK_DECL_INSANE ) -#define QSK_DECL_INSANE + #define QSK_DECL_INSANE #endif QSK_DECL_INSANE static inline QVariant qskInterpolate( @@ -112,11 +112,13 @@ QskVariantAnimator::~QskVariantAnimator() void QskVariantAnimator::setStartValue( const QVariant& value ) { + stop(); m_startValue = value; } void QskVariantAnimator::setEndValue( const QVariant& value ) { + stop(); m_endValue = value; } @@ -171,7 +173,7 @@ void QskVariantAnimator::setup() if ( convertValues( m_startValue, m_endValue ) ) { - if ( m_startValue != m_endValue ) + if ( m_startValue != m_endValue ) { const auto id = m_startValue.userType(); @@ -191,6 +193,8 @@ void QskVariantAnimator::advance( qreal progress ) if ( qFuzzyCompare( progress, 1.0 ) ) progress = 1.0; + Q_ASSERT( qskMetaType( m_startValue ) == qskMetaType( m_endValue ) ); + m_currentValue = qskInterpolate( m_interpolator, m_startValue, m_endValue, progress ); } From de48deb7c8bf92b0573279319185f5937cd6e82c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 3 Apr 2022 16:37:36 +0200 Subject: [PATCH 095/107] more switches --- examples/gallery/button/ButtonPage.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/gallery/button/ButtonPage.cpp b/examples/gallery/button/ButtonPage.cpp index 9a347c37..d2e0ab3d 100644 --- a/examples/gallery/button/ButtonPage.cpp +++ b/examples/gallery/button/ButtonPage.cpp @@ -67,7 +67,14 @@ namespace (void) new QskSwitchButton( orientation, this ); auto button = new QskSwitchButton( orientation, this ); + button->setChecked( true ); + + button = new QskSwitchButton( orientation, this ); button->setInverted( true ); + + button = new QskSwitchButton( orientation, this ); + button->setInverted( true ); + button->setChecked( true ); } } }; From a05d1e34710a5d486f5bfd824409d0bd78b18bfd Mon Sep 17 00:00:00 2001 From: Clemens Manert Date: Mon, 4 Apr 2022 08:53:20 +0200 Subject: [PATCH 096/107] Add a Checkbox (#169) * Add checkbox * Add checkbox tests * Add checkbox-groups * Add checkbox-groups tests --- qskinny.pro | 1 + skins/material/QskMaterialSkin.cpp | 21 +++ skins/squiek/QskSquiekSkin.cpp | 20 +++ src/controls/QskCheckBox.cpp | 185 ++++++++++++++++++++++++ src/controls/QskCheckBox.h | 48 +++++++ src/controls/QskCheckBoxSkinlet.cpp | 134 ++++++++++++++++++ src/controls/QskCheckBoxSkinlet.h | 32 +++++ src/controls/QskSkin.cpp | 4 + src/src.pro | 4 + tests/checkboxes/checkboxes.pro | 11 ++ tests/checkboxes/main.cpp | 209 ++++++++++++++++++++++++++++ tests/checkboxes/main.h | 30 ++++ tests/tests.pro | 5 + 13 files changed, 704 insertions(+) create mode 100644 src/controls/QskCheckBox.cpp create mode 100644 src/controls/QskCheckBox.h create mode 100644 src/controls/QskCheckBoxSkinlet.cpp create mode 100644 src/controls/QskCheckBoxSkinlet.h create mode 100644 tests/checkboxes/checkboxes.pro create mode 100644 tests/checkboxes/main.cpp create mode 100644 tests/checkboxes/main.h create mode 100644 tests/tests.pro diff --git a/qskinny.pro b/qskinny.pro index 7a41eef1..2443087c 100644 --- a/qskinny.pro +++ b/qskinny.pro @@ -7,6 +7,7 @@ SUBDIRS = \ qmlexport \ tools \ support \ + tests \ examples \ playground diff --git a/skins/material/QskMaterialSkin.cpp b/skins/material/QskMaterialSkin.cpp index a096179e..a89cbeec 100644 --- a/skins/material/QskMaterialSkin.cpp +++ b/skins/material/QskMaterialSkin.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -112,6 +113,7 @@ namespace void setupControl(); void setupBox(); + void setupCheckBox(); void setupDialogButtonBox(); void setupDialogButton(); void setupFocusIndicator(); @@ -142,6 +144,7 @@ void Editor::setup() setupControl(); setupBox(); + setupCheckBox(); setupDialogButtonBox(); setupDialogButton(); setupFocusIndicator(); @@ -177,6 +180,24 @@ void Editor::setupControl() qskShadedColor( m_pal.textColor, 0.6 ) ); } +void Editor::setupCheckBox() +{ + using Q = QskCheckBox; + + const qreal radius = qskDpiScaled( 18 ); + + setMargin( QskCheckBox::Tick, QMarginsF( 3, 5, 3, 3 ) ); + setStrutSize( Q::Box, radius, radius ); + + setBoxShape( Q::Box, 2 ); + + setColor( Q::Box, m_pal.baseColor); + setColor( Q::Box | Q::Checked, m_pal.accentColor ); + setGradient( Q::Box | Q::Checked | Q::Disabled, QskRgb::Grey ); + + setColor( Q::Tick, m_pal.contrastColor ); +} + void Editor::setupBox() { using Q = QskBox; diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index bfdd6706..a79fc20c 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -132,6 +133,7 @@ namespace void setupControl(); void setupBox(); + void setupCheckBox(); void setupDialogButton(); void setupDialogButtonBox(); void setupFocusIndicator(); @@ -251,6 +253,7 @@ void Editor::setup() setupControl(); setupBox(); + setupCheckBox(); setupDialogButtonBox(); setupDialogButton(); setupFocusIndicator(); @@ -292,6 +295,23 @@ void Editor::setupBox() setPanel( QskBox::Panel, Plain ); } +void Editor::setupCheckBox() +{ + using Q = QskCheckBox; + + const qreal size = qskDpiScaled( 26 ); + + setMargin( Q::Tick, QskMargins( qskDpiScaled( 5 ) ) ); + + setStrutSize( Q::Box, QSizeF( size, size ) ); + setBoxShape( Q::Box, qskDpiScaled( 3 ) ); + setBoxBorderMetrics( Q::Box, qskDpiScaled( 1 ) ); + setBoxBorderColors( Q::Box, m_pal.darker125 ); + setColor( Q::Box, m_pal.lighter135 ); + setColor( Q::Box | Q::Checked, m_pal.highlighted ); + setColor( Q::Tick, m_pal.lighter135 ); +} + void Editor::setupPopup() { using A = QskAspect; diff --git a/src/controls/QskCheckBox.cpp b/src/controls/QskCheckBox.cpp new file mode 100644 index 00000000..7251db0a --- /dev/null +++ b/src/controls/QskCheckBox.cpp @@ -0,0 +1,185 @@ +#include "QskCheckBox.h" + +#include "QskAspect.h" + +#include + +QSK_SUBCONTROL( QskCheckBox, Box ) +QSK_SUBCONTROL( QskCheckBox, Tick ) + +QSK_SYSTEM_STATE( QskCheckBox, PartiallyChecked, QskAspect::LastUserState << 2 ) + +struct QskCheckBox::PrivateData +{ + QSet< QskAbstractButton* > group; + int groupItemsChecked; + Qt::CheckState checkState; + bool checkStateChanging : 1; + bool toggleChanging : 1; + bool triState : 1; +}; + +QskCheckBox::QskCheckBox( QQuickItem* parent ) + : Inherited( parent ) + , m_data( new PrivateData { QSet< QskAbstractButton* >(), 0, + Qt::Unchecked, false, false, false } ) { + setAcceptHoverEvents( true ); + initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); + + connect( this, &QskCheckBox::checkedChanged, this, [ this ]( bool t ) + { + setCheckStateInternal( t ? Qt::CheckState::Checked : + Qt::CheckState::Unchecked ); + } ); +} + +QskCheckBox::~QskCheckBox() +{ + Q_EMIT removeFromAllGroupsRequested(); +} + +bool QskCheckBox::isCheckable() const +{ + return true; +} + +Qt::CheckState QskCheckBox::checkState() const +{ + return m_data->checkState; +} + +void QskCheckBox::setCheckStateInternal( Qt::CheckState checkState ) +{ + if( m_data->checkStateChanging ) + { + return; + } + + setSkinStateFlag( PartiallyChecked, + checkState == Qt::CheckState::PartiallyChecked ); + + m_data->checkState = checkState; + Q_EMIT checkStateChanged( checkState ); +} + +void QskCheckBox::setCheckState( Qt::CheckState checkState ) +{ + if( checkState == m_data->checkState ) + return; + + m_data->checkStateChanging = true; + if( checkState == Qt::CheckState::PartiallyChecked ) + { + setChecked( true ); + setTriState( true ); + } + else + { + setChecked( checkState == Qt::CheckState::Checked ); + } + m_data->checkStateChanging = false; + + setCheckStateInternal( checkState ); +} + +bool QskCheckBox::isTriState() const +{ + return m_data->triState; +} + +void QskCheckBox::setTriState( bool triState ) +{ + if( m_data->triState != triState ) + { + m_data->triState = triState; + Q_EMIT isTriStateChanged( triState ); + } +} + +void QskCheckBox::updated() +{ + if( m_data->toggleChanging ) + { + return; + } + + auto& groupItemsChecked = m_data->groupItemsChecked; + + if( groupItemsChecked == m_data->group.size() ) + { + this->setCheckState( Qt::CheckState::Checked ); + } + else if ( groupItemsChecked == 0 ) + { + this->setCheckState( Qt::CheckState::Unchecked ); + } + else + { + this->setCheckState( Qt::CheckState::PartiallyChecked ); + } +} + +void QskCheckBox::addToGroup( QskCheckBox* groupItem ) { + if( m_data->group.contains( groupItem ) ) + { + return; + } + + m_data->group.insert( groupItem ); + + if( groupItem->checkState() == Qt::CheckState::Checked ) + { + m_data->groupItemsChecked += 1; + } + + updated(); + + connect( this, &QskCheckBox::checkStateChanged, + groupItem, [ this, groupItem ] ( Qt::CheckState checkState ) + { + if( checkState == Qt::Checked ) + { + m_data->toggleChanging = true; + groupItem->setChecked( true ); + m_data->groupItemsChecked = m_data->group.size(); + m_data->toggleChanging = false; + } + else if ( checkState == Qt::Unchecked ) + { + m_data->toggleChanging = true; + groupItem->setChecked( false ); + m_data->groupItemsChecked = 0; + m_data->toggleChanging = false; + } + } ); + + connect( groupItem, &QskAbstractButton::toggled, + this, [ this, groupItem ] ( bool toggled ) + { + auto& groupItemsChecked = m_data->groupItemsChecked; + groupItemsChecked += toggled ? 1 : -1; + updated(); + } ); + + connect( groupItem, &QskCheckBox::removeFromAllGroupsRequested, + this, [ this, groupItem ] ( ) + { + removeFromGroup( groupItem ); + } ); +} + +void QskCheckBox::removeFromGroup( QskCheckBox* groupItem ) { + if( !m_data->group.remove( groupItem ) ) + { + return; + } + + if( groupItem->checkState() == Qt::CheckState::Checked ) + { + m_data->groupItemsChecked -= 1; + } + + updated(); +} + +#include "moc_QskCheckBox.cpp" diff --git a/src/controls/QskCheckBox.h b/src/controls/QskCheckBox.h new file mode 100644 index 00000000..eed70a7b --- /dev/null +++ b/src/controls/QskCheckBox.h @@ -0,0 +1,48 @@ +#ifndef QSK_CHECK_BOX_H +#define QSK_CHECK_BOX_H + +#include "QskAbstractButton.h" + +class QSK_EXPORT QskCheckBox : public QskAbstractButton +{ + Q_OBJECT + + Q_PROPERTY( Qt::CheckState checkState READ checkState + WRITE setCheckState NOTIFY checkStateChanged FINAL ) + Q_PROPERTY( bool isTriState READ isTriState + WRITE setTriState NOTIFY isTriStateChanged FINAL ) + + using Inherited = QskAbstractButton; + + public: + QSK_SUBCONTROLS( Box, Tick ) + QSK_STATES( PartiallyChecked ) + + QskCheckBox( QQuickItem* parent = nullptr ); + ~QskCheckBox() override; + + Qt::CheckState checkState() const; + bool isTriState() const; + bool isCheckable() const override final; + + void addToGroup( QskCheckBox* groupItem ); + void removeFromGroup( QskCheckBox* groupItem ); + + public Q_SLOTS: + void setCheckState( Qt::CheckState ); + void setTriState( bool triState = true ); + + Q_SIGNALS: + void checkStateChanged( Qt::CheckState ); + void isTriStateChanged( bool ); + void removeFromAllGroupsRequested(); + + private: + void setCheckStateInternal( Qt::CheckState ); + void updated(); + + struct PrivateData; + std::unique_ptr< PrivateData > m_data; +}; + +#endif // QSK_CHECK_BOX_H diff --git a/src/controls/QskCheckBoxSkinlet.cpp b/src/controls/QskCheckBoxSkinlet.cpp new file mode 100644 index 00000000..946394b6 --- /dev/null +++ b/src/controls/QskCheckBoxSkinlet.cpp @@ -0,0 +1,134 @@ +#include "QskCheckBoxSkinlet.h" +#include "QskCheckBox.h" + +#include +#include + +class Tic : public QSGGeometryNode { + QSGFlatColorMaterial material; + QSGGeometry geometry = QSGGeometry( + QSGGeometry::defaultAttributes_Point2D(), 3 ); + const QRectF& target; + public: + Tic( const QRectF& rect, const QColor& color ): target( rect ) { + geometry.setDrawingMode( QSGGeometry::DrawLineStrip ); + geometry.setLineWidth( 2 ); + setGeometry( &geometry ); + + material.setColor( color ); + setMaterial( &material ); + + markDirty( QSGNode::DirtyGeometry ); + } + + void setColor( const QColor& color ) { + material.setColor( color ); + markDirty( QSGNode::DirtyMaterial ); + } + + void makeTic() { + const auto& size = target.size(); + const auto x = target.x(); + const auto y = target.y(); + + geometry.vertexDataAsPoint2D()[0].set( x, y + size.height() / 2 ); + geometry.vertexDataAsPoint2D()[1].set( x + size.width() / 3, + y + size.height() ); + geometry.vertexDataAsPoint2D()[2].set( x + size.width(), y ); + markDirty( QSGNode::DirtyGeometry ); + } + + void makePartially() { + const auto& size = target.size(); + const auto x = target.x(); + const auto y = target.y(); + + geometry.vertexDataAsPoint2D()[0].set( x, y + size.height() / 2 ); + geometry.vertexDataAsPoint2D()[1].set( x, y + size.height() / 2 ); + geometry.vertexDataAsPoint2D()[2].set( x + size.width(), + y + size.height() / 2 ); + + markDirty( QSGNode::DirtyGeometry ); + } + + void makeEmpty() { + const auto x = target.x(); + const auto y = target.y(); + + geometry.vertexDataAsPoint2D()[0].set( x, y ); + geometry.vertexDataAsPoint2D()[1].set( x, y ); + geometry.vertexDataAsPoint2D()[2].set( x, y ); + + markDirty( QSGNode::DirtyGeometry ); + } +}; + +QskCheckBoxSkinlet::QskCheckBoxSkinlet( QskSkin* skin ) + : QskSkinlet( skin ) +{ + setNodeRoles( { BoxRole, TickRole } ); +} + +QskCheckBoxSkinlet::~QskCheckBoxSkinlet() +{ +} + +QRectF QskCheckBoxSkinlet::subControlRect( + const QskSkinnable*, + const QRectF& contentsRect, + QskAspect::Subcontrol ) const +{ + return contentsRect; +} + +QSGNode* QskCheckBoxSkinlet::updateSubNode( + const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const +{ + switch( nodeRole ) { + case BoxRole: + return updateBoxNode( skinnable, node, + QskCheckBox::Box ); + case TickRole: + auto control = dynamic_cast< const QskCheckBox* >( skinnable ); + auto rect = control->subControlRect( QskCheckBox::Tick ); + rect = rect.marginsRemoved( + skinnable->marginHint( QskCheckBox::Tick ) ); + + Tic* tic; + if ( static_cast< Tic* >( node ) == nullptr ) + { + tic = new Tic( rect, skinnable->color( QskCheckBox::Tick ) ); + } + else + { + tic = static_cast< Tic* >( node ); + } + + switch ( control->checkState() ) { + case Qt::CheckState::Unchecked: + tic->setColor( skinnable->color( QskCheckBox::Tick ) ); + tic->makeEmpty(); + break; + case Qt::CheckState::PartiallyChecked: + tic->setColor( skinnable->color( + QskCheckBox::Tick | QskCheckBox::PartiallyChecked ) ); + tic->makePartially(); + break; + case Qt::CheckState::Checked: + tic->setColor( skinnable->color( + QskCheckBox::Tick | QskCheckBox::Checked ) ); + tic->makeTic(); + break; + } + + return tic; + } + + return Inherited::updateSubNode( skinnable, nodeRole, node ); +} + +QSizeF QskCheckBoxSkinlet::sizeHint( const QskSkinnable* skinnable, + Qt::SizeHint, const QSizeF& ) const +{ + return skinnable->strutSizeHint( QskCheckBox::Box ); +} diff --git a/src/controls/QskCheckBoxSkinlet.h b/src/controls/QskCheckBoxSkinlet.h new file mode 100644 index 00000000..db19bdd2 --- /dev/null +++ b/src/controls/QskCheckBoxSkinlet.h @@ -0,0 +1,32 @@ +#ifndef QSK_CHECK_BOX_SKINLET_H +#define QSK_CHECK_BOX_SKINLET_H + +#include "QskSkinlet.h" + +class QSK_EXPORT QskCheckBoxSkinlet : public QskSkinlet +{ + Q_GADGET + + using Inherited = QskSkinlet; + public: + enum NodeRole + { + BoxRole, + TickRole, + }; + + Q_INVOKABLE QskCheckBoxSkinlet( QskSkin* = nullptr ); + ~QskCheckBoxSkinlet() override; + + QRectF subControlRect( const QskSkinnable*, + const QRectF&, QskAspect::Subcontrol ) const override; + + QSizeF sizeHint( const QskSkinnable*, + Qt::SizeHint, const QSizeF& ) const override; + + protected: + QSGNode* updateSubNode( const QskSkinnable*, + quint8 nodeRole, QSGNode* ) const override; +}; + +#endif // QSK_CHECK_BOX_SKINLET_H diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 1f8b67db..4a8e20e5 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -29,6 +29,9 @@ QSK_QT_PRIVATE_END #include "QskBox.h" #include "QskBoxSkinlet.h" +#include "QskCheckBox.h" +#include "QskCheckBoxSkinlet.h" + #include "QskFocusIndicator.h" #include "QskFocusIndicatorSkinlet.h" @@ -143,6 +146,7 @@ QskSkin::QskSkin( QObject* parent ) declareSkinlet< QskControl, QskSkinlet >(); declareSkinlet< QskBox, QskBoxSkinlet >(); + declareSkinlet< QskCheckBox, QskCheckBoxSkinlet >(); declareSkinlet< QskFocusIndicator, QskFocusIndicatorSkinlet >(); declareSkinlet< QskGraphicLabel, QskGraphicLabelSkinlet >(); declareSkinlet< QskListView, QskListViewSkinlet >(); diff --git a/src/src.pro b/src/src.pro index 0c00a0ec..2f51cb2b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -141,6 +141,8 @@ HEADERS += \ controls/QskBoundedValueInput.h \ controls/QskBox.h \ controls/QskBoxSkinlet.h \ + controls/QskCheckBox.h \ + controls/QskCheckBoxSkinlet.h \ controls/QskControl.h \ controls/QskControlPrivate.h \ controls/QskDirtyItemFilter.h \ @@ -221,6 +223,8 @@ SOURCES += \ controls/QskBoundedValueInput.cpp \ controls/QskBox.cpp \ controls/QskBoxSkinlet.cpp \ + controls/QskCheckBox.cpp \ + controls/QskCheckBoxSkinlet.cpp \ controls/QskControl.cpp \ controls/QskControlPrivate.cpp \ controls/QskDirtyItemFilter.cpp \ diff --git a/tests/checkboxes/checkboxes.pro b/tests/checkboxes/checkboxes.pro new file mode 100644 index 00000000..79376a0b --- /dev/null +++ b/tests/checkboxes/checkboxes.pro @@ -0,0 +1,11 @@ +CONFIG += qskexample + CONFIG += console + CONFIG += testcase + + QT += testlib + + HEADERS += \ + main.h + + SOURCES += \ + main.cpp diff --git a/tests/checkboxes/main.cpp b/tests/checkboxes/main.cpp new file mode 100644 index 00000000..234753c0 --- /dev/null +++ b/tests/checkboxes/main.cpp @@ -0,0 +1,209 @@ +#include "main.h" + +#include + +void CheckBoxTests::init() { + root = new QskControl(); +} +void CheckBoxTests::cleanup() { + delete root; +} + +void CheckBoxTests::checkbox() { + auto t = new QskCheckBox( root ); + + QVERIFY( t->isCheckable() ); +} + +void CheckBoxTests::click() { + auto t = new QskCheckBox( root ); + + QVERIFY( t->isChecked() == false ); + t->click(); + QVERIFY( t->isChecked() ); +} + +void CheckBoxTests::toggle() { + auto t = new QskCheckBox( root ); + + QVERIFY( t->isChecked() == false ); + t->toggle(); + QVERIFY( t->isChecked() ); + + t->toggle(); + QVERIFY( t->isChecked() == false ); +} + +void CheckBoxTests::triState() { + auto t = new QskCheckBox( root ); + + QVERIFY( t->isChecked() == false ); + QVERIFY( t->isTriState() == false ); + + t->setCheckState( Qt::CheckState::PartiallyChecked ); + + QVERIFY( t->isChecked() == true ); + QVERIFY( t->isTriState() == true ); +} + +void CheckBoxTests::higherGroupUpdatesLower() { + auto t = new QskCheckBox( root ); + auto t1 = new QskCheckBox( root ); + auto t2 = new QskCheckBox( root ); + auto t3 = new QskCheckBox( root ); + + t->addToGroup( t1 ); + t->addToGroup( t2 ); + t->addToGroup( t3 ); + + QVERIFY( t->isChecked() == false ); + QVERIFY( t1->isChecked() == false ); + QVERIFY( t2->isChecked() == false ); + QVERIFY( t3->isChecked() == false ); + + t->setChecked( true ); + QVERIFY( t->isChecked() ); + QVERIFY( t1->isChecked() ); + QVERIFY( t2->isChecked() ); + QVERIFY( t3->isChecked() ); + + t->setChecked( false ); + QVERIFY( t->isChecked() == false ); + QVERIFY( t1->isChecked() == false ); + QVERIFY( t2->isChecked() == false ); + QVERIFY( t3->isChecked() == false ); + +} +void CheckBoxTests::lowerGroupUpdatesHigher() { + auto t = new QskCheckBox( root ); + + auto t1 = new QskCheckBox( root ); + auto t2 = new QskCheckBox( root ); + + t->addToGroup( t1 ); + t->addToGroup( t2 ); + + t1->setChecked( true ); + QVERIFY( t->isChecked() ); + QVERIFY( t->isTriState() ); + QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); + QVERIFY( t1->isChecked() == true ); + QVERIFY( t2->isChecked() == false ); + + + t2->setChecked( true ); + QVERIFY( t->isChecked() ); + QVERIFY( t->isTriState() ); + QVERIFY( t->checkState() == Qt::CheckState::Checked ); + QVERIFY( t1->isChecked() == true ); + QVERIFY( t2->isChecked() == true ); + + t1->setChecked( false ); + QVERIFY( t->isChecked() ); + QVERIFY( t->isTriState() ); + QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); + QVERIFY( t1->isChecked() == false ); + QVERIFY( t2->isChecked() == true ); + + t2->setChecked( false ); + QVERIFY( t->isChecked() == false ); + QVERIFY( t->isTriState() ); + QVERIFY( t->checkState() == Qt::CheckState::Unchecked ); + QVERIFY( t1->isChecked() == false ); + QVERIFY( t2->isChecked() == false ); +} + +void CheckBoxTests::addToGroup() { + auto t = new QskCheckBox( root ); + + auto t1 = new QskCheckBox( root ); + auto t2 = new QskCheckBox( root ); + + t->addToGroup( t1 ); + t->addToGroup( t2 ); + + t->setChecked( true ); + QVERIFY( t->isChecked() ); + QVERIFY( t1->isChecked() ); + QVERIFY( t2->isChecked() ); + + auto t3 = new QskCheckBox( root ); + t->addToGroup( t3 ); + + QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); + + t3->setChecked( true ); + QVERIFY( t->checkState() == Qt::CheckState::Checked ); + auto t4 = new QskCheckBox( root ); + t4->setChecked( true ); + t->addToGroup( t4 ); + QVERIFY( t->checkState() == Qt::CheckState::Checked ); +} + +void CheckBoxTests::addPartlyToGroup() { + auto t = new QskCheckBox( root ); + + auto t1 = new QskCheckBox( root ); + auto t1a = new QskCheckBox( root ); + auto t1b = new QskCheckBox( root ); + + t1->addToGroup( t1a ); + t1->addToGroup( t1b ); + + t1a->setChecked( true ); + + QVERIFY( t1->checkState() == Qt::CheckState::PartiallyChecked ); + t->addToGroup( t1 ); + QVERIFY( t1->checkState() == Qt::CheckState::PartiallyChecked ); +} + + +void CheckBoxTests::removeFromGroup() { + auto t = new QskCheckBox( root ); + + auto t1 = new QskCheckBox( root ); + auto t2 = new QskCheckBox( root ); + + t->addToGroup( t1 ); + t->addToGroup( t2 ); + + t2->setChecked( true ); + QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); + + t->removeFromGroup( t2 ); + QVERIFY( t->isChecked() == false ); +} + +void CheckBoxTests::groupMemberGetsDeleted() { + auto t = new QskCheckBox( root ); + auto t1 = new QskCheckBox( root ); + auto t2 = new QskCheckBox( root ); + + t->addToGroup( t1 ); + t->addToGroup( t2 ); + + t2->setChecked( true ); + QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); + + delete t2; + QVERIFY( t->isChecked() == false ); +} + +void CheckBoxTests::addTwiceToSameGroup() { + auto t = new QskCheckBox( root ); + + auto t1 = new QskCheckBox( root ); + auto t2 = new QskCheckBox( root ); + + t->addToGroup( t1 ); + t->addToGroup( t1 ); + t->removeFromGroup( t1 ); + + t->addToGroup( t2 ); + + t2->setChecked( true ); + + QVERIFY( t->checkState() == Qt::CheckState::Checked ); +} +#include "moc_main.cpp" + diff --git a/tests/checkboxes/main.h b/tests/checkboxes/main.h new file mode 100644 index 00000000..5f5b5e93 --- /dev/null +++ b/tests/checkboxes/main.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +class QskControl; +class CheckBoxTests : public QObject +{ + Q_OBJECT + + QskControl * root; + private Q_SLOTS: + void init(); + void cleanup(); + + void checkbox(); + void click(); + void toggle(); + void triState(); + void higherGroupUpdatesLower(); + void lowerGroupUpdatesHigher(); + void addToGroup(); + void addPartlyToGroup(); + void removeFromGroup(); + void groupMemberGetsDeleted(); + void addTwiceToSameGroup(); +}; + +QTEST_MAIN(CheckBoxTests) + diff --git a/tests/tests.pro b/tests/tests.pro new file mode 100644 index 00000000..60e10ea4 --- /dev/null +++ b/tests/tests.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +SUBDIRS += \ + checkboxes + From 49cdc1a029f4b37173efea283a759e38a9f1a8c2 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 4 Apr 2022 14:14:07 +0200 Subject: [PATCH 097/107] formal cheges, check box added to gallery --- examples/gallery/button/ButtonPage.cpp | 21 +++ src/controls/QskCheckBox.cpp | 88 +++++------ src/controls/QskCheckBox.h | 10 +- src/controls/QskCheckBoxSkinlet.cpp | 204 ++++++++++++++----------- src/controls/QskCheckBoxSkinlet.h | 13 +- 5 files changed, 203 insertions(+), 133 deletions(-) diff --git a/examples/gallery/button/ButtonPage.cpp b/examples/gallery/button/ButtonPage.cpp index d2e0ab3d..d4610b43 100644 --- a/examples/gallery/button/ButtonPage.cpp +++ b/examples/gallery/button/ButtonPage.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -78,6 +79,24 @@ namespace } } }; + + class CheckButtonBox : public QskLinearBox + { + public: + CheckButtonBox( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Horizontal, parent ) + { + setSpacing( 20 ); + setExtraSpacingAt( Qt::LeftEdge | Qt::RightEdge | Qt::BottomEdge ); + + for ( auto state : { Qt::Unchecked, Qt::PartiallyChecked, Qt::Checked } ) + { + auto button = new QskCheckBox( this ); + button->setTriState( true ); + button->setCheckState( state ); + } + } + }; } ButtonPage::ButtonPage( QQuickItem* parent ) @@ -92,4 +111,6 @@ void ButtonPage::populate() new ButtonBox( this ); new QskSeparator( Qt::Horizontal, this ); new SwitchButtonBox( this ); + new QskSeparator( Qt::Horizontal, this ); + new CheckButtonBox( this ); } diff --git a/src/controls/QskCheckBox.cpp b/src/controls/QskCheckBox.cpp index 7251db0a..32bfbbb7 100644 --- a/src/controls/QskCheckBox.cpp +++ b/src/controls/QskCheckBox.cpp @@ -1,5 +1,9 @@ -#include "QskCheckBox.h" +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ +#include "QskCheckBox.h" #include "QskAspect.h" #include @@ -9,11 +13,22 @@ QSK_SUBCONTROL( QskCheckBox, Tick ) QSK_SYSTEM_STATE( QskCheckBox, PartiallyChecked, QskAspect::LastUserState << 2 ) -struct QskCheckBox::PrivateData +class QskCheckBox::PrivateData { + public: + PrivateData() + : checkState( Qt::Unchecked ) + , checkStateChanging( false ) + , toggleChanging( false ) + , triState( false ) + { + } + QSet< QskAbstractButton* > group; - int groupItemsChecked; - Qt::CheckState checkState; + + int groupItemsChecked = 0; + + int checkState : 2; bool checkStateChanging : 1; bool toggleChanging : 1; bool triState : 1; @@ -21,16 +36,13 @@ struct QskCheckBox::PrivateData QskCheckBox::QskCheckBox( QQuickItem* parent ) : Inherited( parent ) - , m_data( new PrivateData { QSet< QskAbstractButton* >(), 0, - Qt::Unchecked, false, false, false } ) { + , m_data( new PrivateData() ) +{ setAcceptHoverEvents( true ); initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); - connect( this, &QskCheckBox::checkedChanged, this, [ this ]( bool t ) - { - setCheckStateInternal( t ? Qt::CheckState::Checked : - Qt::CheckState::Unchecked ); - } ); + connect( this, &QskCheckBox::checkedChanged, this, + [ this ]( bool on ) { setCheckStateInternal( on ? Qt::Checked : Qt::Unchecked ); } ); } QskCheckBox::~QskCheckBox() @@ -45,18 +57,15 @@ bool QskCheckBox::isCheckable() const Qt::CheckState QskCheckBox::checkState() const { - return m_data->checkState; + return static_cast< Qt::CheckState >( m_data->checkState ); } void QskCheckBox::setCheckStateInternal( Qt::CheckState checkState ) { if( m_data->checkStateChanging ) - { return; - } - setSkinStateFlag( PartiallyChecked, - checkState == Qt::CheckState::PartiallyChecked ); + setSkinStateFlag( PartiallyChecked, checkState == Qt::PartiallyChecked ); m_data->checkState = checkState; Q_EMIT checkStateChanged( checkState ); @@ -68,15 +77,17 @@ void QskCheckBox::setCheckState( Qt::CheckState checkState ) return; m_data->checkStateChanging = true; - if( checkState == Qt::CheckState::PartiallyChecked ) + + if( checkState == Qt::PartiallyChecked ) { setChecked( true ); setTriState( true ); } else { - setChecked( checkState == Qt::CheckState::Checked ); + setChecked( checkState == Qt::Checked ); } + m_data->checkStateChanging = false; setCheckStateInternal( checkState ); @@ -99,43 +110,38 @@ void QskCheckBox::setTriState( bool triState ) void QskCheckBox::updated() { if( m_data->toggleChanging ) - { return; - } - auto& groupItemsChecked = m_data->groupItemsChecked; + const auto& groupItemsChecked = m_data->groupItemsChecked; if( groupItemsChecked == m_data->group.size() ) { - this->setCheckState( Qt::CheckState::Checked ); + setCheckState( Qt::Checked ); } else if ( groupItemsChecked == 0 ) { - this->setCheckState( Qt::CheckState::Unchecked ); + setCheckState( Qt::Unchecked ); } else { - this->setCheckState( Qt::CheckState::PartiallyChecked ); + setCheckState( Qt::PartiallyChecked ); } } -void QskCheckBox::addToGroup( QskCheckBox* groupItem ) { +void QskCheckBox::addToGroup( QskCheckBox* groupItem ) +{ if( m_data->group.contains( groupItem ) ) - { return; - } m_data->group.insert( groupItem ); - if( groupItem->checkState() == Qt::CheckState::Checked ) - { - m_data->groupItemsChecked += 1; - } + if( groupItem->checkState() == Qt::Checked ) + m_data->groupItemsChecked++; updated(); connect( this, &QskCheckBox::checkStateChanged, - groupItem, [ this, groupItem ] ( Qt::CheckState checkState ) + groupItem, [ this, groupItem ]( Qt::CheckState checkState ) { if( checkState == Qt::Checked ) { @@ -154,7 +160,7 @@ void QskCheckBox::addToGroup( QskCheckBox* groupItem ) { } ); connect( groupItem, &QskAbstractButton::toggled, - this, [ this, groupItem ] ( bool toggled ) + this, [ this, groupItem ]( bool toggled ) { auto& groupItemsChecked = m_data->groupItemsChecked; groupItemsChecked += toggled ? 1 : -1; @@ -162,22 +168,16 @@ void QskCheckBox::addToGroup( QskCheckBox* groupItem ) { } ); connect( groupItem, &QskCheckBox::removeFromAllGroupsRequested, - this, [ this, groupItem ] ( ) - { - removeFromGroup( groupItem ); - } ); + this, [ this, groupItem ]( ) { removeFromGroup( groupItem ); } ); } -void QskCheckBox::removeFromGroup( QskCheckBox* groupItem ) { +void QskCheckBox::removeFromGroup( QskCheckBox* groupItem ) +{ if( !m_data->group.remove( groupItem ) ) - { return; - } - if( groupItem->checkState() == Qt::CheckState::Checked ) - { - m_data->groupItemsChecked -= 1; - } + if( groupItem->checkState() == Qt::Checked ) + m_data->groupItemsChecked--; updated(); } diff --git a/src/controls/QskCheckBox.h b/src/controls/QskCheckBox.h index eed70a7b..2c273ca5 100644 --- a/src/controls/QskCheckBox.h +++ b/src/controls/QskCheckBox.h @@ -1,3 +1,8 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + #ifndef QSK_CHECK_BOX_H #define QSK_CHECK_BOX_H @@ -9,6 +14,7 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton Q_PROPERTY( Qt::CheckState checkState READ checkState WRITE setCheckState NOTIFY checkStateChanged FINAL ) + Q_PROPERTY( bool isTriState READ isTriState WRITE setTriState NOTIFY isTriStateChanged FINAL ) @@ -41,8 +47,8 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton void setCheckStateInternal( Qt::CheckState ); void updated(); - struct PrivateData; + class PrivateData; std::unique_ptr< PrivateData > m_data; }; -#endif // QSK_CHECK_BOX_H +#endif diff --git a/src/controls/QskCheckBoxSkinlet.cpp b/src/controls/QskCheckBoxSkinlet.cpp index 946394b6..fd9f842f 100644 --- a/src/controls/QskCheckBoxSkinlet.cpp +++ b/src/controls/QskCheckBoxSkinlet.cpp @@ -1,67 +1,88 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + #include "QskCheckBoxSkinlet.h" #include "QskCheckBox.h" #include #include -class Tic : public QSGGeometryNode { - QSGFlatColorMaterial material; - QSGGeometry geometry = QSGGeometry( - QSGGeometry::defaultAttributes_Point2D(), 3 ); - const QRectF& target; - public: - Tic( const QRectF& rect, const QColor& color ): target( rect ) { - geometry.setDrawingMode( QSGGeometry::DrawLineStrip ); - geometry.setLineWidth( 2 ); - setGeometry( &geometry ); +namespace +{ + class Tick : public QSGGeometryNode + { + public: + Tick( const QRectF& rect, const QColor& color ) + : m_target( rect ) + , geometry( QSGGeometry::defaultAttributes_Point2D(), 3 ) + { + geometry.setDrawingMode( QSGGeometry::DrawLineStrip ); + geometry.setLineWidth( 2 ); + setGeometry( &geometry ); - material.setColor( color ); - setMaterial( &material ); + material.setColor( color ); + setMaterial( &material ); - markDirty( QSGNode::DirtyGeometry ); - } + markDirty( QSGNode::DirtyGeometry ); + } - void setColor( const QColor& color ) { - material.setColor( color ); - markDirty( QSGNode::DirtyMaterial ); - } + void setColor( const QColor& color ) { + material.setColor( color ); + markDirty( QSGNode::DirtyMaterial ); + } - void makeTic() { - const auto& size = target.size(); - const auto x = target.x(); - const auto y = target.y(); + void makeTick() + { + const auto x = m_target.x(); + const auto y = m_target.y(); - geometry.vertexDataAsPoint2D()[0].set( x, y + size.height() / 2 ); - geometry.vertexDataAsPoint2D()[1].set( x + size.width() / 3, - y + size.height() ); - geometry.vertexDataAsPoint2D()[2].set( x + size.width(), y ); - markDirty( QSGNode::DirtyGeometry ); - } + auto vertexData = geometry.vertexDataAsPoint2D(); - void makePartially() { - const auto& size = target.size(); - const auto x = target.x(); - const auto y = target.y(); + vertexData[0].set( x, y + m_target.height() / 2 ); + vertexData[1].set( x + m_target.width() / 3, y + m_target.height() ); + vertexData[2].set( x + m_target.width(), y ); - geometry.vertexDataAsPoint2D()[0].set( x, y + size.height() / 2 ); - geometry.vertexDataAsPoint2D()[1].set( x, y + size.height() / 2 ); - geometry.vertexDataAsPoint2D()[2].set( x + size.width(), - y + size.height() / 2 ); + markDirty( QSGNode::DirtyGeometry ); + } - markDirty( QSGNode::DirtyGeometry ); - } + void makePartially() + { + const auto x = m_target.x(); + const auto y = m_target.y(); - void makeEmpty() { - const auto x = target.x(); - const auto y = target.y(); + auto vertexData = geometry.vertexDataAsPoint2D(); - geometry.vertexDataAsPoint2D()[0].set( x, y ); - geometry.vertexDataAsPoint2D()[1].set( x, y ); - geometry.vertexDataAsPoint2D()[2].set( x, y ); + vertexData[0].set( x, y + m_target.height() / 2 ); + vertexData[1].set( x, y + m_target.height() / 2 ); + vertexData[2].set( x + m_target.width(), y + m_target.height() / 2 ); - markDirty( QSGNode::DirtyGeometry ); - } -}; + markDirty( QSGNode::DirtyGeometry ); + } + + void makeEmpty() + { + const auto x = m_target.x(); + const auto y = m_target.y(); + + auto vertexData = geometry.vertexDataAsPoint2D(); + + vertexData[0].set( x, y ); + vertexData[1].set( x, y ); + vertexData[2].set( x, y ); + + markDirty( QSGNode::DirtyGeometry ); + } + + private: + + const QRectF m_target; + + QSGFlatColorMaterial material; + QSGGeometry geometry; + }; +} QskCheckBoxSkinlet::QskCheckBoxSkinlet( QskSkin* skin ) : QskSkinlet( skin ) @@ -74,9 +95,7 @@ QskCheckBoxSkinlet::~QskCheckBoxSkinlet() } QRectF QskCheckBoxSkinlet::subControlRect( - const QskSkinnable*, - const QRectF& contentsRect, - QskAspect::Subcontrol ) const + const QskSkinnable*, const QRectF& contentsRect, QskAspect::Subcontrol ) const { return contentsRect; } @@ -84,49 +103,62 @@ QRectF QskCheckBoxSkinlet::subControlRect( QSGNode* QskCheckBoxSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { - switch( nodeRole ) { + switch( nodeRole ) + { case BoxRole: - return updateBoxNode( skinnable, node, - QskCheckBox::Box ); + { + return updateBoxNode( skinnable, node, QskCheckBox::Box ); + } + case TickRole: - auto control = dynamic_cast< const QskCheckBox* >( skinnable ); - auto rect = control->subControlRect( QskCheckBox::Tick ); - rect = rect.marginsRemoved( - skinnable->marginHint( QskCheckBox::Tick ) ); - - Tic* tic; - if ( static_cast< Tic* >( node ) == nullptr ) - { - tic = new Tic( rect, skinnable->color( QskCheckBox::Tick ) ); - } - else - { - tic = static_cast< Tic* >( node ); - } - - switch ( control->checkState() ) { - case Qt::CheckState::Unchecked: - tic->setColor( skinnable->color( QskCheckBox::Tick ) ); - tic->makeEmpty(); - break; - case Qt::CheckState::PartiallyChecked: - tic->setColor( skinnable->color( - QskCheckBox::Tick | QskCheckBox::PartiallyChecked ) ); - tic->makePartially(); - break; - case Qt::CheckState::Checked: - tic->setColor( skinnable->color( - QskCheckBox::Tick | QskCheckBox::Checked ) ); - tic->makeTic(); - break; - } - - return tic; + { + auto checkBox = static_cast< const QskCheckBox* >( skinnable ); + return updateTickNode( checkBox, node ); + } } return Inherited::updateSubNode( skinnable, nodeRole, node ); } +QSGNode* QskCheckBoxSkinlet::updateTickNode( + const QskCheckBox* checkBox, QSGNode* node ) const +{ + using Q = QskCheckBox; + + auto rect = checkBox->subControlRect( Q::Tick ); + rect = rect.marginsRemoved( checkBox->marginHint( Q::Tick ) ); + + auto tick = static_cast< Tick* >( node ); + if ( tick == nullptr ) + tick = new Tick( rect, checkBox->color( Q::Tick ) ); + + switch ( checkBox->checkState() ) + { + case Qt::Unchecked: + + tick->setColor( checkBox->color( Q::Tick ) ); + tick->makeEmpty(); + + break; + + case Qt::PartiallyChecked: + + tick->setColor( checkBox->color( Q::Tick | Q::PartiallyChecked ) ); + tick->makePartially(); + + break; + + case Qt::Checked: + + tick->setColor( checkBox->color( Q::Tick | Q::Checked ) ); + tick->makeTick(); + + break; + } + + return tick; +} + QSizeF QskCheckBoxSkinlet::sizeHint( const QskSkinnable* skinnable, Qt::SizeHint, const QSizeF& ) const { diff --git a/src/controls/QskCheckBoxSkinlet.h b/src/controls/QskCheckBoxSkinlet.h index db19bdd2..d703600c 100644 --- a/src/controls/QskCheckBoxSkinlet.h +++ b/src/controls/QskCheckBoxSkinlet.h @@ -1,13 +1,21 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + #ifndef QSK_CHECK_BOX_SKINLET_H #define QSK_CHECK_BOX_SKINLET_H #include "QskSkinlet.h" +class QskCheckBox; + class QSK_EXPORT QskCheckBoxSkinlet : public QskSkinlet { Q_GADGET using Inherited = QskSkinlet; + public: enum NodeRole { @@ -27,6 +35,9 @@ class QSK_EXPORT QskCheckBoxSkinlet : public QskSkinlet protected: QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override; + + private: + QSGNode* updateTickNode( const QskCheckBox*, QSGNode* ) const; }; -#endif // QSK_CHECK_BOX_SKINLET_H +#endif From ae5a348b50fdd3d4be6a7ad742c33750dd9c35d5 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 4 Apr 2022 14:39:24 +0200 Subject: [PATCH 098/107] spelling aligned with Qt checkboxes ( triState -> tristate ) --- examples/gallery/button/ButtonPage.cpp | 2 +- src/controls/QskCheckBox.cpp | 18 ++++----- src/controls/QskCheckBox.h | 14 +++---- tests/checkboxes/main.cpp | 52 ++++++++++++++++---------- tests/checkboxes/main.h | 2 +- 5 files changed, 51 insertions(+), 37 deletions(-) diff --git a/examples/gallery/button/ButtonPage.cpp b/examples/gallery/button/ButtonPage.cpp index d4610b43..e6cb217d 100644 --- a/examples/gallery/button/ButtonPage.cpp +++ b/examples/gallery/button/ButtonPage.cpp @@ -92,7 +92,7 @@ namespace for ( auto state : { Qt::Unchecked, Qt::PartiallyChecked, Qt::Checked } ) { auto button = new QskCheckBox( this ); - button->setTriState( true ); + button->setTristate( true ); button->setCheckState( state ); } } diff --git a/src/controls/QskCheckBox.cpp b/src/controls/QskCheckBox.cpp index 32bfbbb7..5a5cdbee 100644 --- a/src/controls/QskCheckBox.cpp +++ b/src/controls/QskCheckBox.cpp @@ -20,7 +20,7 @@ class QskCheckBox::PrivateData : checkState( Qt::Unchecked ) , checkStateChanging( false ) , toggleChanging( false ) - , triState( false ) + , tristate( false ) { } @@ -31,7 +31,7 @@ class QskCheckBox::PrivateData int checkState : 2; bool checkStateChanging : 1; bool toggleChanging : 1; - bool triState : 1; + bool tristate : 1; }; QskCheckBox::QskCheckBox( QQuickItem* parent ) @@ -81,7 +81,7 @@ void QskCheckBox::setCheckState( Qt::CheckState checkState ) if( checkState == Qt::PartiallyChecked ) { setChecked( true ); - setTriState( true ); + setTristate( true ); } else { @@ -93,17 +93,17 @@ void QskCheckBox::setCheckState( Qt::CheckState checkState ) setCheckStateInternal( checkState ); } -bool QskCheckBox::isTriState() const +bool QskCheckBox::isTristate() const { - return m_data->triState; + return m_data->tristate; } -void QskCheckBox::setTriState( bool triState ) +void QskCheckBox::setTristate( bool tristate ) { - if( m_data->triState != triState ) + if( m_data->tristate != tristate ) { - m_data->triState = triState; - Q_EMIT isTriStateChanged( triState ); + m_data->tristate = tristate; + Q_EMIT tristateChanged( tristate ); } } diff --git a/src/controls/QskCheckBox.h b/src/controls/QskCheckBox.h index 2c273ca5..b1443c1d 100644 --- a/src/controls/QskCheckBox.h +++ b/src/controls/QskCheckBox.h @@ -15,8 +15,8 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton Q_PROPERTY( Qt::CheckState checkState READ checkState WRITE setCheckState NOTIFY checkStateChanged FINAL ) - Q_PROPERTY( bool isTriState READ isTriState - WRITE setTriState NOTIFY isTriStateChanged FINAL ) + Q_PROPERTY( bool tristate READ isTristate + WRITE setTristate NOTIFY tristateChanged FINAL ) using Inherited = QskAbstractButton; @@ -28,19 +28,19 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton ~QskCheckBox() override; Qt::CheckState checkState() const; - bool isTriState() const; + bool isTristate() const; bool isCheckable() const override final; - void addToGroup( QskCheckBox* groupItem ); - void removeFromGroup( QskCheckBox* groupItem ); + void addToGroup( QskCheckBox* ); + void removeFromGroup( QskCheckBox* ); public Q_SLOTS: void setCheckState( Qt::CheckState ); - void setTriState( bool triState = true ); + void setTristate( bool triState = true ); Q_SIGNALS: void checkStateChanged( Qt::CheckState ); - void isTriStateChanged( bool ); + void tristateChanged( bool ); void removeFromAllGroupsRequested(); private: diff --git a/tests/checkboxes/main.cpp b/tests/checkboxes/main.cpp index 234753c0..711a9d4a 100644 --- a/tests/checkboxes/main.cpp +++ b/tests/checkboxes/main.cpp @@ -2,20 +2,25 @@ #include -void CheckBoxTests::init() { +void CheckBoxTests::init() +{ root = new QskControl(); } -void CheckBoxTests::cleanup() { + +void CheckBoxTests::cleanup() +{ delete root; } -void CheckBoxTests::checkbox() { +void CheckBoxTests::checkbox() +{ auto t = new QskCheckBox( root ); QVERIFY( t->isCheckable() ); } -void CheckBoxTests::click() { +void CheckBoxTests::click() +{ auto t = new QskCheckBox( root ); QVERIFY( t->isChecked() == false ); @@ -23,7 +28,8 @@ void CheckBoxTests::click() { QVERIFY( t->isChecked() ); } -void CheckBoxTests::toggle() { +void CheckBoxTests::toggle() +{ auto t = new QskCheckBox( root ); QVERIFY( t->isChecked() == false ); @@ -34,19 +40,21 @@ void CheckBoxTests::toggle() { QVERIFY( t->isChecked() == false ); } -void CheckBoxTests::triState() { +void CheckBoxTests::tristate() +{ auto t = new QskCheckBox( root ); QVERIFY( t->isChecked() == false ); - QVERIFY( t->isTriState() == false ); + QVERIFY( t->isTristate() == false ); t->setCheckState( Qt::CheckState::PartiallyChecked ); QVERIFY( t->isChecked() == true ); - QVERIFY( t->isTriState() == true ); + QVERIFY( t->isTristate() == true ); } -void CheckBoxTests::higherGroupUpdatesLower() { +void CheckBoxTests::higherGroupUpdatesLower() +{ auto t = new QskCheckBox( root ); auto t1 = new QskCheckBox( root ); auto t2 = new QskCheckBox( root ); @@ -74,7 +82,9 @@ void CheckBoxTests::higherGroupUpdatesLower() { QVERIFY( t3->isChecked() == false ); } -void CheckBoxTests::lowerGroupUpdatesHigher() { + +void CheckBoxTests::lowerGroupUpdatesHigher() +{ auto t = new QskCheckBox( root ); auto t1 = new QskCheckBox( root ); @@ -85,7 +95,7 @@ void CheckBoxTests::lowerGroupUpdatesHigher() { t1->setChecked( true ); QVERIFY( t->isChecked() ); - QVERIFY( t->isTriState() ); + QVERIFY( t->isTristate() ); QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); QVERIFY( t1->isChecked() == true ); QVERIFY( t2->isChecked() == false ); @@ -93,27 +103,28 @@ void CheckBoxTests::lowerGroupUpdatesHigher() { t2->setChecked( true ); QVERIFY( t->isChecked() ); - QVERIFY( t->isTriState() ); + QVERIFY( t->isTristate() ); QVERIFY( t->checkState() == Qt::CheckState::Checked ); QVERIFY( t1->isChecked() == true ); QVERIFY( t2->isChecked() == true ); t1->setChecked( false ); QVERIFY( t->isChecked() ); - QVERIFY( t->isTriState() ); + QVERIFY( t->isTristate() ); QVERIFY( t->checkState() == Qt::CheckState::PartiallyChecked ); QVERIFY( t1->isChecked() == false ); QVERIFY( t2->isChecked() == true ); t2->setChecked( false ); QVERIFY( t->isChecked() == false ); - QVERIFY( t->isTriState() ); + QVERIFY( t->isTristate() ); QVERIFY( t->checkState() == Qt::CheckState::Unchecked ); QVERIFY( t1->isChecked() == false ); QVERIFY( t2->isChecked() == false ); } -void CheckBoxTests::addToGroup() { +void CheckBoxTests::addToGroup() +{ auto t = new QskCheckBox( root ); auto t1 = new QskCheckBox( root ); @@ -157,8 +168,8 @@ void CheckBoxTests::addPartlyToGroup() { QVERIFY( t1->checkState() == Qt::CheckState::PartiallyChecked ); } - -void CheckBoxTests::removeFromGroup() { +void CheckBoxTests::removeFromGroup() +{ auto t = new QskCheckBox( root ); auto t1 = new QskCheckBox( root ); @@ -174,7 +185,8 @@ void CheckBoxTests::removeFromGroup() { QVERIFY( t->isChecked() == false ); } -void CheckBoxTests::groupMemberGetsDeleted() { +void CheckBoxTests::groupMemberGetsDeleted() +{ auto t = new QskCheckBox( root ); auto t1 = new QskCheckBox( root ); auto t2 = new QskCheckBox( root ); @@ -189,7 +201,8 @@ void CheckBoxTests::groupMemberGetsDeleted() { QVERIFY( t->isChecked() == false ); } -void CheckBoxTests::addTwiceToSameGroup() { +void CheckBoxTests::addTwiceToSameGroup() +{ auto t = new QskCheckBox( root ); auto t1 = new QskCheckBox( root ); @@ -205,5 +218,6 @@ void CheckBoxTests::addTwiceToSameGroup() { QVERIFY( t->checkState() == Qt::CheckState::Checked ); } + #include "moc_main.cpp" diff --git a/tests/checkboxes/main.h b/tests/checkboxes/main.h index 5f5b5e93..f657b6c8 100644 --- a/tests/checkboxes/main.h +++ b/tests/checkboxes/main.h @@ -16,7 +16,7 @@ class CheckBoxTests : public QObject void checkbox(); void click(); void toggle(); - void triState(); + void tristate(); void higherGroupUpdatesLower(); void lowerGroupUpdatesHigher(); void addToGroup(); From b06687662b850f2b970edf831bfa44c9e2887058 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 4 Apr 2022 17:45:49 +0200 Subject: [PATCH 099/107] custom sliders moved from gallery to tabview. we do not want to have custom controlsin the gallery, that is intended to show the default versions --- examples/gallery/gallery.pro | 6 -- examples/gallery/slider/SliderPage.cpp | 77 +++++-------------- .../slider => tabview}/CustomSlider.cpp | 0 .../slider => tabview}/CustomSlider.h | 0 .../CustomSliderSkinlet.cpp | 0 .../slider => tabview}/CustomSliderSkinlet.h | 0 .../slider => tabview}/OtherSlider.cpp | 0 .../{gallery/slider => tabview}/OtherSlider.h | 0 examples/tabview/main.cpp | 48 +++++++++++- examples/tabview/tabview.pro | 8 ++ 10 files changed, 74 insertions(+), 65 deletions(-) rename examples/{gallery/slider => tabview}/CustomSlider.cpp (100%) rename examples/{gallery/slider => tabview}/CustomSlider.h (100%) rename examples/{gallery/slider => tabview}/CustomSliderSkinlet.cpp (100%) rename examples/{gallery/slider => tabview}/CustomSliderSkinlet.h (100%) rename examples/{gallery/slider => tabview}/OtherSlider.cpp (100%) rename examples/{gallery/slider => tabview}/OtherSlider.h (100%) diff --git a/examples/gallery/gallery.pro b/examples/gallery/gallery.pro index 2c1eedb3..c21ad9a3 100644 --- a/examples/gallery/gallery.pro +++ b/examples/gallery/gallery.pro @@ -7,15 +7,9 @@ SOURCES += \ label/LabelPage.cpp \ HEADERS += \ - slider/CustomSlider.h \ - slider/CustomSliderSkinlet.h \ - slider/OtherSlider.h \ slider/SliderPage.h SOURCES += \ - slider/CustomSlider.cpp \ - slider/CustomSliderSkinlet.cpp \ - slider/OtherSlider.cpp \ slider/SliderPage.cpp HEADERS += \ diff --git a/examples/gallery/slider/SliderPage.cpp b/examples/gallery/slider/SliderPage.cpp index 8e164a5c..733692d6 100644 --- a/examples/gallery/slider/SliderPage.cpp +++ b/examples/gallery/slider/SliderPage.cpp @@ -4,14 +4,27 @@ *****************************************************************************/ #include "SliderPage.h" -#include "CustomSlider.h" -#include "OtherSlider.h" +#include -#include -#include +namespace +{ + class Slider : public QskSlider + { + public: + Slider( Qt::Orientation orientation, QQuickItem* parent = nullptr ) + : QskSlider( orientation, parent ) + { + setBoundaries( 0, 1000 ); -SliderPage::SliderPage( QQuickItem* parentItem ) - : Page( Qt::Vertical, parentItem ) + setPageSize( 10 ); + setStepSize( 10 ); + setSnap( true ); + } + }; +} + +SliderPage::SliderPage( QQuickItem* parent ) + : Page( Qt::Horizontal, parent ) { setMargins( 10 ); setSpacing( 20 ); @@ -35,54 +48,6 @@ SliderPage::SliderPage( QQuickItem* parentItem ) void SliderPage::populate() { - { - auto slider = new QskSlider( this ); - - slider->setMinimum( 0 ); - slider->setMaximum( 1000 ); - slider->setPageSize( 10 ); - slider->setStepSize( 10 ); - slider->setSnap( true ); - } - - { - auto slider = new OtherSlider( this ); - - slider->setMinimum( 0 ); - slider->setMaximum( 10 ); - slider->setStepSize( 1 ); - } - - - auto hBox = new QskLinearBox( Qt::Horizontal, this ); - - { - auto slider = new QskSlider( Qt::Vertical, hBox ); - - slider->setMinimum( 0 ); - slider->setMaximum( 1000 ); - slider->setPageSize( 10 ); - slider->setStepSize( 10 ); - slider->setSnap( true ); - } - - { - auto slider = new OtherSlider( hBox ); - slider->setOrientation( Qt::Vertical ); - - slider->setMinimum( 0 ); - slider->setMaximum( 10 ); - slider->setStepSize( 1 ); - } - - { - auto slider = new CustomSlider( this ); - - slider->setMargins( QskMargins( 0, 15 ) ); - slider->setSnap( true ); - slider->setMinimum( 0 ); - slider->setMaximum( 2000 ); - slider->setStepSize( 10 ); - slider->setPageSize( 10 ); - } + ( void ) new Slider( Qt::Horizontal, this ); + ( void ) new Slider( Qt::Vertical, this ); } diff --git a/examples/gallery/slider/CustomSlider.cpp b/examples/tabview/CustomSlider.cpp similarity index 100% rename from examples/gallery/slider/CustomSlider.cpp rename to examples/tabview/CustomSlider.cpp diff --git a/examples/gallery/slider/CustomSlider.h b/examples/tabview/CustomSlider.h similarity index 100% rename from examples/gallery/slider/CustomSlider.h rename to examples/tabview/CustomSlider.h diff --git a/examples/gallery/slider/CustomSliderSkinlet.cpp b/examples/tabview/CustomSliderSkinlet.cpp similarity index 100% rename from examples/gallery/slider/CustomSliderSkinlet.cpp rename to examples/tabview/CustomSliderSkinlet.cpp diff --git a/examples/gallery/slider/CustomSliderSkinlet.h b/examples/tabview/CustomSliderSkinlet.h similarity index 100% rename from examples/gallery/slider/CustomSliderSkinlet.h rename to examples/tabview/CustomSliderSkinlet.h diff --git a/examples/gallery/slider/OtherSlider.cpp b/examples/tabview/OtherSlider.cpp similarity index 100% rename from examples/gallery/slider/OtherSlider.cpp rename to examples/tabview/OtherSlider.cpp diff --git a/examples/gallery/slider/OtherSlider.h b/examples/tabview/OtherSlider.h similarity index 100% rename from examples/gallery/slider/OtherSlider.h rename to examples/tabview/OtherSlider.h diff --git a/examples/tabview/main.cpp b/examples/tabview/main.cpp index 5fbd43dc..9c8bbda2 100644 --- a/examples/tabview/main.cpp +++ b/examples/tabview/main.cpp @@ -3,6 +3,9 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ +#include "CustomSlider.h" +#include "OtherSlider.h" + #include #include @@ -33,6 +36,36 @@ class Label : public QskTextLabel } }; +class SliderBox : public QskLinearBox +{ + public: + SliderBox( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Vertical, parent ) + { + setMargins( 30 ); + setSpacing( 50 ); + setExtraSpacingAt( Qt::BottomEdge ); + + { + auto slider = new OtherSlider( this ); + + slider->setMinimum( 0 ); + slider->setMaximum( 10 ); + slider->setStepSize( 1 ); + } + + { + auto slider = new CustomSlider( this ); + + slider->setSnap( true ); + slider->setMinimum( 0 ); + slider->setMaximum( 2000 ); + slider->setStepSize( 10 ); + slider->setPageSize( 10 ); + } + } +}; + class TabView : public QskTabView { public: @@ -43,11 +76,20 @@ class TabView : public QskTabView { QString text; if ( i == 4 ) - text = QString( "Another Tab" ); + { + const auto text = QStringLiteral( "Another Tab" ); + addTab( text, new Label( text ) ); + } + else if ( i == 7 ) + { + addTab( "Sliders", new SliderBox() ); + } else - text = QString( "Tab %1" ).arg( i + 1 ); + { + const auto text = QString( "Tab %1" ).arg( i + 1 ); + addTab( text, new Label( text ) ); + } - addTab( text, new Label( text ) ); } buttonAt( 2 )->setEnabled( false ); diff --git a/examples/tabview/tabview.pro b/examples/tabview/tabview.pro index 0a7f08c9..dbef219c 100644 --- a/examples/tabview/tabview.pro +++ b/examples/tabview/tabview.pro @@ -1,4 +1,12 @@ CONFIG += qskexample +HEADERS += \ + CustomSlider.h \ + CustomSliderSkinlet.h \ + OtherSlider.h \ + SOURCES += \ + CustomSlider.cpp \ + CustomSliderSkinlet.cpp \ + OtherSlider.cpp \ main.cpp From 3a40d4c0db26023354dd08ef769a2ee56a0ff1a7 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 4 Apr 2022 18:18:49 +0200 Subject: [PATCH 100/107] dependencies for the tests fixed --- qskinny.pro | 1 + 1 file changed, 1 insertion(+) diff --git a/qskinny.pro b/qskinny.pro index 2443087c..91e2624a 100644 --- a/qskinny.pro +++ b/qskinny.pro @@ -23,6 +23,7 @@ qmlexport.depends = src inputcontext.depends = src skins.depends = src tools.depends = src +tests.depends = src support support.depends = src skins examples.depends = tools support skins qmlexport playground.depends = tools support skins qmlexport From 752a97524be74dce1177b6f4703592a324d0bedd Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 4 Apr 2022 18:32:17 +0200 Subject: [PATCH 101/107] the geometry for the tick can change --- src/controls/QskCheckBoxSkinlet.cpp | 86 ++++++++++------------------- 1 file changed, 28 insertions(+), 58 deletions(-) diff --git a/src/controls/QskCheckBoxSkinlet.cpp b/src/controls/QskCheckBoxSkinlet.cpp index fd9f842f..e4547658 100644 --- a/src/controls/QskCheckBoxSkinlet.cpp +++ b/src/controls/QskCheckBoxSkinlet.cpp @@ -14,71 +14,51 @@ namespace class Tick : public QSGGeometryNode { public: - Tick( const QRectF& rect, const QColor& color ) - : m_target( rect ) - , geometry( QSGGeometry::defaultAttributes_Point2D(), 3 ) + Tick() + : geometry( QSGGeometry::defaultAttributes_Point2D(), 3 ) { geometry.setDrawingMode( QSGGeometry::DrawLineStrip ); geometry.setLineWidth( 2 ); setGeometry( &geometry ); - material.setColor( color ); setMaterial( &material ); - - markDirty( QSGNode::DirtyGeometry ); } - void setColor( const QColor& color ) { + void setColor( const QColor& color ) + { material.setColor( color ); markDirty( QSGNode::DirtyMaterial ); } - void makeTick() + void makeTick( const QRectF& rect ) { - const auto x = m_target.x(); - const auto y = m_target.y(); + const auto x = rect.x(); + const auto y = rect.y(); auto vertexData = geometry.vertexDataAsPoint2D(); - vertexData[0].set( x, y + m_target.height() / 2 ); - vertexData[1].set( x + m_target.width() / 3, y + m_target.height() ); - vertexData[2].set( x + m_target.width(), y ); + vertexData[0].set( x, y + rect.height() / 2 ); + vertexData[1].set( x + rect.width() / 3, y + rect.height() ); + vertexData[2].set( x + rect.width(), y ); markDirty( QSGNode::DirtyGeometry ); } - void makePartially() + void makePartially( const QRectF& rect ) { - const auto x = m_target.x(); - const auto y = m_target.y(); + const auto x = rect.x(); + const auto y = rect.y(); auto vertexData = geometry.vertexDataAsPoint2D(); - vertexData[0].set( x, y + m_target.height() / 2 ); - vertexData[1].set( x, y + m_target.height() / 2 ); - vertexData[2].set( x + m_target.width(), y + m_target.height() / 2 ); - - markDirty( QSGNode::DirtyGeometry ); - } - - void makeEmpty() - { - const auto x = m_target.x(); - const auto y = m_target.y(); - - auto vertexData = geometry.vertexDataAsPoint2D(); - - vertexData[0].set( x, y ); - vertexData[1].set( x, y ); - vertexData[2].set( x, y ); + vertexData[0].set( x, y + rect.height() / 2 ); + vertexData[1].set( x, y + rect.height() / 2 ); + vertexData[2].set( x + rect.width(), y + rect.height() / 2 ); markDirty( QSGNode::DirtyGeometry ); } private: - - const QRectF m_target; - QSGFlatColorMaterial material; QSGGeometry geometry; }; @@ -125,35 +105,25 @@ QSGNode* QskCheckBoxSkinlet::updateTickNode( { using Q = QskCheckBox; + if ( checkBox->checkState() == Qt::Unchecked ) + return nullptr; + auto rect = checkBox->subControlRect( Q::Tick ); rect = rect.marginsRemoved( checkBox->marginHint( Q::Tick ) ); auto tick = static_cast< Tick* >( node ); if ( tick == nullptr ) - tick = new Tick( rect, checkBox->color( Q::Tick ) ); + tick = new Tick(); - switch ( checkBox->checkState() ) + if ( checkBox->checkState() == Qt::PartiallyChecked ) { - case Qt::Unchecked: - - tick->setColor( checkBox->color( Q::Tick ) ); - tick->makeEmpty(); - - break; - - case Qt::PartiallyChecked: - - tick->setColor( checkBox->color( Q::Tick | Q::PartiallyChecked ) ); - tick->makePartially(); - - break; - - case Qt::Checked: - - tick->setColor( checkBox->color( Q::Tick | Q::Checked ) ); - tick->makeTick(); - - break; + tick->setColor( checkBox->color( Q::Tick | Q::PartiallyChecked ) ); + tick->makePartially( rect ); + } + else + { + tick->setColor( checkBox->color( Q::Tick | Q::Checked ) ); + tick->makeTick( rect ); } return tick; From 6ef1f8a45d0bbe99fd914ad00b1d8b4d3cf3e2bc Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 5 Apr 2022 08:48:16 +0200 Subject: [PATCH 102/107] QskCheckBox improvements --- skins/material/QskMaterialSkin.cpp | 19 +++++++++++-------- skins/squiek/QskSquiekSkin.cpp | 21 +++++++++++++-------- src/controls/QskCheckBox.cpp | 11 +++++------ src/controls/QskCheckBox.h | 2 +- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/skins/material/QskMaterialSkin.cpp b/skins/material/QskMaterialSkin.cpp index a89cbeec..979dee8f 100644 --- a/skins/material/QskMaterialSkin.cpp +++ b/skins/material/QskMaterialSkin.cpp @@ -182,20 +182,23 @@ void Editor::setupControl() void Editor::setupCheckBox() { + using A = QskAspect; using Q = QskCheckBox; - const qreal radius = qskDpiScaled( 18 ); + const qreal size = qskDpiScaled( 18 ); - setMargin( QskCheckBox::Tick, QMarginsF( 3, 5, 3, 3 ) ); - setStrutSize( Q::Box, radius, radius ); + setStrutSize( Q::Panel, size, size ); + setPadding( Q::Panel, 3 ); - setBoxShape( Q::Box, 2 ); + setBoxShape( Q::Panel, 2 ); - setColor( Q::Box, m_pal.baseColor); - setColor( Q::Box | Q::Checked, m_pal.accentColor ); - setGradient( Q::Box | Q::Checked | Q::Disabled, QskRgb::Grey ); + setGradient( Q::Panel, m_pal.baseColor); + setGradient( Q::Panel | Q::Checked, m_pal.accentColor ); + setGradient( Q::Panel | Q::Checked | Q::Disabled, QskRgb::Grey ); - setColor( Q::Tick, m_pal.contrastColor ); + setColor( Q::Indicator, m_pal.contrastColor ); + + setAnimation( Q::Panel | A::Color, qskDuration ); } void Editor::setupBox() diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index a79fc20c..3d250d91 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -297,19 +297,24 @@ void Editor::setupBox() void Editor::setupCheckBox() { + using A = QskAspect; using Q = QskCheckBox; const qreal size = qskDpiScaled( 26 ); - setMargin( Q::Tick, QskMargins( qskDpiScaled( 5 ) ) ); + setStrutSize( Q::Panel, size, size ); - setStrutSize( Q::Box, QSizeF( size, size ) ); - setBoxShape( Q::Box, qskDpiScaled( 3 ) ); - setBoxBorderMetrics( Q::Box, qskDpiScaled( 1 ) ); - setBoxBorderColors( Q::Box, m_pal.darker125 ); - setColor( Q::Box, m_pal.lighter135 ); - setColor( Q::Box | Q::Checked, m_pal.highlighted ); - setColor( Q::Tick, m_pal.lighter135 ); + setPadding( Q::Panel, qskDpiScaled( 5 ) ); + setBoxShape( Q::Panel, qskDpiScaled( 3 ) ); + setBoxBorderMetrics( Q::Panel, qskDpiScaled( 1 ) ); + + setBoxBorderColors( Q::Panel, m_pal.darker125 ); + setGradient( Q::Panel, m_pal.lighter135 ); + setGradient( Q::Panel | Q::Checked, m_pal.highlighted ); + + setColor( Q::Indicator, m_pal.lighter135 ); + + setAnimation( Q::Panel | A::Color, qskDuration ); } void Editor::setupPopup() diff --git a/src/controls/QskCheckBox.cpp b/src/controls/QskCheckBox.cpp index 5a5cdbee..69cdb7bd 100644 --- a/src/controls/QskCheckBox.cpp +++ b/src/controls/QskCheckBox.cpp @@ -8,8 +8,8 @@ #include -QSK_SUBCONTROL( QskCheckBox, Box ) -QSK_SUBCONTROL( QskCheckBox, Tick ) +QSK_SUBCONTROL( QskCheckBox, Panel ) +QSK_SUBCONTROL( QskCheckBox, Indicator ) QSK_SYSTEM_STATE( QskCheckBox, PartiallyChecked, QskAspect::LastUserState << 2 ) @@ -28,7 +28,7 @@ class QskCheckBox::PrivateData int groupItemsChecked = 0; - int checkState : 2; + Qt::CheckState checkState : 2; bool checkStateChanging : 1; bool toggleChanging : 1; bool tristate : 1; @@ -57,7 +57,7 @@ bool QskCheckBox::isCheckable() const Qt::CheckState QskCheckBox::checkState() const { - return static_cast< Qt::CheckState >( m_data->checkState ); + return m_data->checkState; } void QskCheckBox::setCheckStateInternal( Qt::CheckState checkState ) @@ -162,8 +162,7 @@ void QskCheckBox::addToGroup( QskCheckBox* groupItem ) connect( groupItem, &QskAbstractButton::toggled, this, [ this, groupItem ]( bool toggled ) { - auto& groupItemsChecked = m_data->groupItemsChecked; - groupItemsChecked += toggled ? 1 : -1; + m_data->groupItemsChecked += toggled ? 1 : -1; updated(); } ); diff --git a/src/controls/QskCheckBox.h b/src/controls/QskCheckBox.h index b1443c1d..9a2fb36e 100644 --- a/src/controls/QskCheckBox.h +++ b/src/controls/QskCheckBox.h @@ -21,7 +21,7 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton using Inherited = QskAbstractButton; public: - QSK_SUBCONTROLS( Box, Tick ) + QSK_SUBCONTROLS( Panel, Indicator ) QSK_STATES( PartiallyChecked ) QskCheckBox( QQuickItem* parent = nullptr ); From 8c2093d151a9ad2a783f9a9009220e0c41428243 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 5 Apr 2022 10:15:08 +0200 Subject: [PATCH 103/107] QskCheckBox improvements --- src/controls/QskCheckBoxSkinlet.cpp | 133 ++++++++++++++-------------- src/controls/QskCheckBoxSkinlet.h | 8 +- 2 files changed, 69 insertions(+), 72 deletions(-) diff --git a/src/controls/QskCheckBoxSkinlet.cpp b/src/controls/QskCheckBoxSkinlet.cpp index e4547658..10fa4421 100644 --- a/src/controls/QskCheckBoxSkinlet.cpp +++ b/src/controls/QskCheckBoxSkinlet.cpp @@ -5,132 +5,129 @@ #include "QskCheckBoxSkinlet.h" #include "QskCheckBox.h" +#include "QskSGNode.h" #include #include namespace { - class Tick : public QSGGeometryNode + class IndicatorNode : public QSGGeometryNode { public: - Tick() - : geometry( QSGGeometry::defaultAttributes_Point2D(), 3 ) + IndicatorNode() + : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 3 ) { - geometry.setDrawingMode( QSGGeometry::DrawLineStrip ); - geometry.setLineWidth( 2 ); - setGeometry( &geometry ); + m_geometry.setDrawingMode( QSGGeometry::DrawLineStrip ); + m_geometry.setLineWidth( 2 ); + setGeometry( &m_geometry ); - setMaterial( &material ); + setMaterial( &m_material ); } - void setColor( const QColor& color ) + void update( bool isPartially, const QRectF& rect, const QColor& color ) { - material.setColor( color ); - markDirty( QSGNode::DirtyMaterial ); - } + if ( color != m_material.color() ) + { + m_material.setColor( color ); + markDirty( QSGNode::DirtyMaterial ); + } - void makeTick( const QRectF& rect ) - { - const auto x = rect.x(); - const auto y = rect.y(); + if ( rect != m_rect || isPartially != m_isPartially ) + { + m_rect = rect; + m_isPartially = isPartially; - auto vertexData = geometry.vertexDataAsPoint2D(); + const auto x = rect.x(); + const auto y = rect.y(); + const auto w = rect.width(); + const auto h = rect.height(); - vertexData[0].set( x, y + rect.height() / 2 ); - vertexData[1].set( x + rect.width() / 3, y + rect.height() ); - vertexData[2].set( x + rect.width(), y ); + auto points = m_geometry.vertexDataAsPoint2D(); - markDirty( QSGNode::DirtyGeometry ); - } - - void makePartially( const QRectF& rect ) - { - const auto x = rect.x(); - const auto y = rect.y(); - - auto vertexData = geometry.vertexDataAsPoint2D(); - - vertexData[0].set( x, y + rect.height() / 2 ); - vertexData[1].set( x, y + rect.height() / 2 ); - vertexData[2].set( x + rect.width(), y + rect.height() / 2 ); - - markDirty( QSGNode::DirtyGeometry ); + if ( isPartially ) + { + points[0].set( x, y + h / 2 ); + points[1] = points[0]; + points[2].set( x + w, y + h / 2 ); + } + else + { + points[0].set( x, y + h / 2 ); + points[1].set( x + w / 3, y + h ); + points[2].set( x + w, y ); + } + + markDirty( QSGNode::DirtyGeometry ); + } } private: - QSGFlatColorMaterial material; - QSGGeometry geometry; + QSGFlatColorMaterial m_material; + QSGGeometry m_geometry; + + QRectF m_rect; + bool m_isPartially; }; } QskCheckBoxSkinlet::QskCheckBoxSkinlet( QskSkin* skin ) : QskSkinlet( skin ) { - setNodeRoles( { BoxRole, TickRole } ); + setNodeRoles( { PanelRole, IndicatorRole } ); } QskCheckBoxSkinlet::~QskCheckBoxSkinlet() { } -QRectF QskCheckBoxSkinlet::subControlRect( - const QskSkinnable*, const QRectF& contentsRect, QskAspect::Subcontrol ) const +QRectF QskCheckBoxSkinlet::subControlRect( const QskSkinnable* skinnable, + const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const { + if ( subControl == QskCheckBox::Indicator ) + return skinnable->innerBox( QskCheckBox::Panel, contentsRect ); + return contentsRect; } QSGNode* QskCheckBoxSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { + auto checkBox = static_cast< const QskCheckBox* >( skinnable ); + switch( nodeRole ) { - case BoxRole: - { - return updateBoxNode( skinnable, node, QskCheckBox::Box ); - } + case PanelRole: + return updateBoxNode( skinnable, node, QskCheckBox::Panel ); - case TickRole: - { - auto checkBox = static_cast< const QskCheckBox* >( skinnable ); - return updateTickNode( checkBox, node ); - } + case IndicatorRole: + return updateIndicatorNode( checkBox, node ); } return Inherited::updateSubNode( skinnable, nodeRole, node ); } -QSGNode* QskCheckBoxSkinlet::updateTickNode( +QSGNode* QskCheckBoxSkinlet::updateIndicatorNode( const QskCheckBox* checkBox, QSGNode* node ) const { using Q = QskCheckBox; - if ( checkBox->checkState() == Qt::Unchecked ) + const auto state = checkBox->checkState(); + if ( state == Qt::Unchecked ) return nullptr; - auto rect = checkBox->subControlRect( Q::Tick ); - rect = rect.marginsRemoved( checkBox->marginHint( Q::Tick ) ); + const auto rect = checkBox->subControlRect( Q::Indicator ); + if ( rect.isEmpty() ) + return nullptr; - auto tick = static_cast< Tick* >( node ); - if ( tick == nullptr ) - tick = new Tick(); + auto indicatorNode = QskSGNode::ensureNode< IndicatorNode >( node ); + indicatorNode->update( state != Qt::Checked, rect, checkBox->color( Q::Indicator ) ); - if ( checkBox->checkState() == Qt::PartiallyChecked ) - { - tick->setColor( checkBox->color( Q::Tick | Q::PartiallyChecked ) ); - tick->makePartially( rect ); - } - else - { - tick->setColor( checkBox->color( Q::Tick | Q::Checked ) ); - tick->makeTick( rect ); - } - - return tick; + return indicatorNode; } QSizeF QskCheckBoxSkinlet::sizeHint( const QskSkinnable* skinnable, Qt::SizeHint, const QSizeF& ) const { - return skinnable->strutSizeHint( QskCheckBox::Box ); + return skinnable->strutSizeHint( QskCheckBox::Panel ); } diff --git a/src/controls/QskCheckBoxSkinlet.h b/src/controls/QskCheckBoxSkinlet.h index d703600c..094c5807 100644 --- a/src/controls/QskCheckBoxSkinlet.h +++ b/src/controls/QskCheckBoxSkinlet.h @@ -19,8 +19,8 @@ class QSK_EXPORT QskCheckBoxSkinlet : public QskSkinlet public: enum NodeRole { - BoxRole, - TickRole, + PanelRole, + IndicatorRole, }; Q_INVOKABLE QskCheckBoxSkinlet( QskSkin* = nullptr ); @@ -36,8 +36,8 @@ class QSK_EXPORT QskCheckBoxSkinlet : public QskSkinlet QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override; - private: - QSGNode* updateTickNode( const QskCheckBox*, QSGNode* ) const; + protected: + virtual QSGNode* updateIndicatorNode( const QskCheckBox*, QSGNode* ) const; }; #endif From 4d7db7c4798085b6095bdbab62337f7d01974e2c Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 5 Apr 2022 10:41:36 +0200 Subject: [PATCH 104/107] wip --- examples/gallery/main.cpp | 38 +++++++++++++++++++++++++++++++ examples/qvgviewer/MainWindow.cpp | 30 ------------------------ examples/qvgviewer/main.cpp | 8 ------- examples/qvgviewer/qvgviewer.pro | 1 - src/controls/QskMenu.cpp | 5 ++++ 5 files changed, 43 insertions(+), 39 deletions(-) diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 7123fe62..3263ab5e 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,39 @@ namespace } }; + class MenuButton : public QskPushButton + { + public: + MenuButton( const QString& text, QQuickItem* parent = nullptr ) + : QskPushButton( text, parent ) + { + setFlat( true ); // until we have the section bit in QskAspect + + connect( this, &QskPushButton::pressed, this, &MenuButton::openMenu ); + } + + private: + void openMenu() + { + auto pos = geometry().bottomLeft(); + + QskMenu menu( window()->contentItem() ); + menu.setPopupFlag( QskPopup::DeleteOnClose, false ); + + menu.addOption( "image://shapes/Rectangle/White", "Print" ); + menu.addOption( "image://shapes/Diamond/Yellow", "Save As" ); + menu.addOption( "image://shapes/Ellipse/Red", "Setup" ); + menu.addSeparator(); + menu.addOption( "image://shapes/Hexagon/PapayaWhip", "Help" ); + + menu.setOrigin( pos ); + + const int result = menu.exec(); + if ( result >= 0 ) + qDebug() << "Selected:" << result; + } + }; + /* Once QskApplicationView and friends are implemented we can replace Header/ApplicationWindow with it. TODO ... @@ -70,6 +104,10 @@ namespace [] { Skinny::changeSkin( 500 ); } ); } + { + new MenuButton( "Menu", this ); + } + addStretch( 10 ); { diff --git a/examples/qvgviewer/MainWindow.cpp b/examples/qvgviewer/MainWindow.cpp index e78a1a79..bc379584 100644 --- a/examples/qvgviewer/MainWindow.cpp +++ b/examples/qvgviewer/MainWindow.cpp @@ -20,11 +20,6 @@ #include #include -#ifdef CONTEXT_MENU - #include - #include -#endif - #include #include @@ -46,10 +41,6 @@ class GraphicLabel : public QskGraphicLabel setBoxShapeHint( Panel, 8 ); setAlignment( Qt::AlignCenter ); setDarknessMode( false ); - -#ifdef CONTEXT_MENU - setAcceptedMouseButtons( Qt::LeftButton ); -#endif } void setDarknessMode( bool on ) @@ -80,27 +71,6 @@ class GraphicLabel : public QskGraphicLabel startTransition( QskGraphicLabel::Graphic | QskAspect::GraphicRole, duration, oldRole, graphicRole() ); } - -#ifdef CONTEXT_MENU - protected: - void mousePressEvent( QMouseEvent* event ) override - { - QskMenu menu( this ); - menu.setPopupFlag( QskPopup::DeleteOnClose, false ); - - menu.addOption( "image://shapes/Rectangle/White", "Print" ); - menu.addOption( "image://shapes/Diamond/Yellow", "Save As" ); - menu.addOption( "image://shapes/Ellipse/Red", "Setup" ); - menu.addSeparator(); - menu.addOption( "image://shapes/Hexagon/PapayaWhip", "Help" ); - - menu.setOrigin( qskMousePosition( event ) ); - - const int result = menu.exec(); - if ( result >= 0 ) - qDebug() << "Selected:" << result; - } -#endif }; MainWindow::MainWindow() diff --git a/examples/qvgviewer/main.cpp b/examples/qvgviewer/main.cpp index 31d62caa..458709e1 100644 --- a/examples/qvgviewer/main.cpp +++ b/examples/qvgviewer/main.cpp @@ -7,10 +7,6 @@ #include -#ifdef CONTEXT_MENU - #include -#endif - #include #include @@ -22,10 +18,6 @@ int main( int argc, char* argv[] ) QskObjectCounter counter( true ); #endif -#ifdef CONTEXT_MENU - Qsk::addGraphicProvider( "shapes", new SkinnyShapeProvider() ); -#endif - QGuiApplication app( argc, argv ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); diff --git a/examples/qvgviewer/qvgviewer.pro b/examples/qvgviewer/qvgviewer.pro index ece321d1..d2c05ec5 100644 --- a/examples/qvgviewer/qvgviewer.pro +++ b/examples/qvgviewer/qvgviewer.pro @@ -1,5 +1,4 @@ CONFIG += qskexample -DEFINES += CONTEXT_MENU HEADERS += \ MainWindow.h diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index 0cff4321..a8034736 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -75,6 +75,9 @@ QskMenu::~QskMenu() { } +#if 1 + +// has no effect as we do not offer submenus yet. TODO ... bool QskMenu::isCascading() const { return flagHint( QskMenu::Panel | QskAspect::Style ); @@ -92,6 +95,8 @@ void QskMenu::resetCascading() Q_EMIT cascadingChanged( isCascading() ); } +#endif + void QskMenu::setOrigin( const QPointF& origin ) { if ( origin != m_data->origin ) From 2a6d27d78d107791e3f5347c753cc64fcbc80fed Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 5 Apr 2022 11:38:23 +0200 Subject: [PATCH 105/107] wip --- examples/gallery/main.cpp | 22 ++++++---------- skins/material/QskMaterialSkin.cpp | 42 ++++++++++++++++++++++++++++++ skins/squiek/QskSquiekSkin.cpp | 15 ++++++----- src/controls/QskMenu.cpp | 5 ++++ 4 files changed, 63 insertions(+), 21 deletions(-) diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 3263ab5e..5a466641 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -57,22 +57,16 @@ namespace private: void openMenu() { - auto pos = geometry().bottomLeft(); + auto menu = new QskMenu( window()->contentItem() ); - QskMenu menu( window()->contentItem() ); - menu.setPopupFlag( QskPopup::DeleteOnClose, false ); + menu->addOption( "image://shapes/Rectangle/White", "Print" ); + menu->addOption( "image://shapes/Diamond/Yellow", "Save As" ); + menu->addOption( "image://shapes/Ellipse/Red", "Setup" ); + menu->addSeparator(); + menu->addOption( "image://shapes/Hexagon/PapayaWhip", "Help" ); - menu.addOption( "image://shapes/Rectangle/White", "Print" ); - menu.addOption( "image://shapes/Diamond/Yellow", "Save As" ); - menu.addOption( "image://shapes/Ellipse/Red", "Setup" ); - menu.addSeparator(); - menu.addOption( "image://shapes/Hexagon/PapayaWhip", "Help" ); - - menu.setOrigin( pos ); - - const int result = menu.exec(); - if ( result >= 0 ) - qDebug() << "Selected:" << result; + menu->setOrigin( geometry().bottomLeft() ); + menu->open(); } }; diff --git a/skins/material/QskMaterialSkin.cpp b/skins/material/QskMaterialSkin.cpp index 979dee8f..03b170ba 100644 --- a/skins/material/QskMaterialSkin.cpp +++ b/skins/material/QskMaterialSkin.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,7 @@ namespace void setupInputPanel(); void setupVirtualKeyboard(); void setupListView(); + void setupMenu(); void setupPageIndicator(); void setupPopup(); void setupProgressBar(); @@ -151,6 +153,7 @@ void Editor::setup() setupInputPanel(); setupVirtualKeyboard(); setupListView(); + setupMenu(); setupPageIndicator(); setupPopup(); setupProgressBar(); @@ -223,6 +226,45 @@ void Editor::setupPopup() setGradient( Q::Overlay, gradient ); } +void Editor::setupMenu() +{ + using A = QskAspect; + using Q = QskMenu; + + setBoxShape( Q::Panel, qskDpiScaled( 4 ) ); + setBoxBorderMetrics( Q::Panel, qskDpiScaled( 1 ) ); + setBoxBorderColors( Q::Panel, m_pal.darker125 ); + + setGradient( Q::Panel, m_pal.baseColor ); + + const bool isCascading = qskMaybeDesktopPlatform(); + setFlagHint( Q::Panel | A::Style, isCascading ); + +#if 0 + setPadding( Q::Separator, QMarginsF( 10, 0, 10, 0 ) ); +#endif + setMetric( Q::Separator | A::Size, qskDpiScaled( 1 ) ); + setBoxShape( Q::Separator, 0 ); + setBoxBorderMetrics( Q::Separator, 0 ); + setGradient( Q::Separator, m_pal.darker125 ); + + setPadding( Q::Cell, QskMargins( 2, 10, 2, 10 ) ); + setSpacing( Q::Cell, 5 ); + setGradient( Q::Cell, Qt::transparent ); + + setGradient( Q::Cursor, m_pal.accentColor ); + + setColor( Q::Text, m_pal.textColor ); + setColor( Q::Text | Q::Selected, m_pal.contrastColor ); + setFontRole( Q::Text, QskSkin::SmallFont ); + + setPosition( Q::Panel, 0 ); + setPosition( Q::Panel | QskPopup::Closed, 1 ); + + setAnimation( Q::Panel | A::Metric, 150 ); + setAnimation( Q::Cursor | A::Position | A::Metric, 75, QEasingCurve::OutCubic ); +} + void Editor::setupTextLabel() { using Q = QskTextLabel; diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index 3d250d91..fd45d94a 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -331,11 +331,11 @@ void Editor::setupMenu() using A = QskAspect; using Q = QskMenu; - const QColor c1( 78, 158, 38 ); - const QColor c2( 15, 103, 43 ); + setBoxShape( Q::Panel, qskDpiScaled( 4 ) ); + setBoxBorderMetrics( Q::Panel, qskDpiScaled( 1 ) ); + setBoxBorderColors( Q::Panel, m_pal.darker125 ); - setBoxShape( Q::Panel, 4 ); - setVGradient( Q::Panel, c1, c2 ); + setGradient( Q::Panel, m_pal.lighter110 ); const bool isCascading = qskMaybeDesktopPlatform(); setFlagHint( Q::Panel | A::Style, isCascading ); @@ -343,16 +343,17 @@ void Editor::setupMenu() #if 0 setPadding( Q::Separator, QMarginsF( 10, 0, 10, 0 ) ); #endif - setMetric( Q::Separator | A::Size, 2 ); + setMetric( Q::Separator | A::Size, qskDpiScaled( 2 ) ); setSeparator( Q::Separator | A::Horizontal ); setPadding( Q::Cell, QskMargins( 2, 10, 2, 10 ) ); setSpacing( Q::Cell, 5 ); setGradient( Q::Cell, Qt::transparent ); - setHGradient( Q::Cursor, c2, c2.lighter( 2 ) ); + setGradient( Q::Cursor, m_pal.highlighted ); - setColor( Q::Text, QColor( 255, 255, 255 ) ); + setColor( Q::Text, m_pal.contrastedText ); + setColor( Q::Text | Q::Selected, m_pal.highlightedText ); setFontRole( Q::Text, QskSkin::SmallFont ); setPosition( Q::Panel, 0 ); diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index a8034736..9c1389f9 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -37,6 +37,11 @@ namespace QString text; QskGraphic graphic; + +#if 0 + // TODO ... + bool isEnabled = true; +#endif }; } From 1cb2110f5d51d24399793906f2ef325501d0b444 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 5 Apr 2022 15:31:17 +0200 Subject: [PATCH 106/107] sending a second StyleChange once the transition is done --- src/controls/QskSkinTransition.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index b96b6753..985ee28b 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -20,6 +20,16 @@ #include #include +static void qskSendStyleEventRecursive( QQuickItem* item ) +{ + QEvent event( QEvent::StyleChange ); + QCoreApplication::sendEvent( item, &event ); + + const auto children = item->childItems(); + for ( auto child : children ) + qskSendStyleEventRecursive( child ); +} + static void qskAddCandidates( const QskSkinTransition::Type mask, const QskSkin* skin, QSet< QskAspect >& candidates ) { @@ -532,6 +542,9 @@ void ApplicationAnimator::cleanup( QQuickWindow* window ) delete animator; } + // let the items know, that we are done + qskSendStyleEventRecursive( window->contentItem() ); + break; } } From 676e0d5e9f2fee3614c8247ec60745263b274700 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 6 Apr 2022 08:41:32 +0200 Subject: [PATCH 107/107] colorswitch example removed --- examples/buttons/TestButton.qml | 7 + examples/buttons/buttons.qml | 10 +- examples/colorswitch/Theme.cpp | 117 ----------------- examples/colorswitch/Theme.h | 35 ----- examples/colorswitch/colorswitch.pro | 11 -- examples/colorswitch/colorswitch.qml | 187 --------------------------- examples/colorswitch/colorswitch.qrc | 5 - examples/colorswitch/main.cpp | 36 ------ examples/examples.pro | 1 - src/controls/QskWindow.cpp | 9 +- 10 files changed, 21 insertions(+), 397 deletions(-) delete mode 100644 examples/colorswitch/Theme.cpp delete mode 100644 examples/colorswitch/Theme.h delete mode 100644 examples/colorswitch/colorswitch.pro delete mode 100644 examples/colorswitch/colorswitch.qml delete mode 100644 examples/colorswitch/colorswitch.qrc delete mode 100644 examples/colorswitch/main.cpp diff --git a/examples/buttons/TestButton.qml b/examples/buttons/TestButton.qml index 9d4d5137..cbb76ae5 100644 --- a/examples/buttons/TestButton.qml +++ b/examples/buttons/TestButton.qml @@ -5,10 +5,17 @@ Qsk.PushButton { sizePolicy { + // long texts, should not have an effect horizontalPolicy: Qsk.SizePolicy.Ignored verticalPolicy: Qsk.SizePolicy.Ignored } + minimumSize + { + width: 80 + height: 60 + } + shape { sizeMode: Qt.RelativeSize diff --git a/examples/buttons/buttons.qml b/examples/buttons/buttons.qml index 442f7729..e8296251 100644 --- a/examples/buttons/buttons.qml +++ b/examples/buttons/buttons.qml @@ -6,12 +6,20 @@ Qsk.Window { id: window visible: true - // visibility: QskWindow.Minimized width: 600 height: 600 color: "Beige" + Component.onCompleted: + { + // very much standard: we should find a better way + + var hint = sizeConstraint(); + setMinimumWidth( hint.width ) + setMinimumHeight( hint.height ) + } + Qsk.Shortcut { sequence : "Ctrl+X" diff --git a/examples/colorswitch/Theme.cpp b/examples/colorswitch/Theme.cpp deleted file mode 100644 index a24a66bc..00000000 --- a/examples/colorswitch/Theme.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "Theme.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - class SkinTransition final : public QskSkinTransition - { - public: - SkinTransition( const QColor& accent ) - : m_accent( accent ) - { - } - - protected: - void updateSkin( QskSkin*, QskSkin* newSkin ) override - { - newSkin->resetColors( m_accent ); - - /* - The current implementation of the skins is not that good - and we don't have support for customizing them by a minimal set - of attributes. So we do some manual extra work here - */ - - QskSkinHintTableEditor ed( &newSkin->hintTable() ); - - ed.setColor( QskListView::Cell | QskListView::Selected, m_accent.darker( 130 ) ); - ed.setBoxBorderColors( QskFocusIndicator::Panel, m_accent.darker( 150 ) ); - } - - private: - const QColor m_accent; - }; -} - -Theme::Theme( QObject* parent ) - : QObject( parent ) - , m_accent( Qt::blue ) -{ - connect( qskSetup, &QskSetup::skinChanged, - this, [ this ]( QskSkin* ) { updateColors(); } ); - - connect( qskSetup, &QskSetup::skinChanged, - this, [ this ]( QskSkin* ) { Q_EMIT skinChanged(); } ); -} - -void Theme::setAccent( QColor color ) -{ - if ( m_accent != color ) - { - m_accent = color; - updateColors(); - - Q_EMIT accentChanged(); - } -} - -QColor Theme::accent() const -{ - return m_accent; -} - -void Theme::setSkin( const QString& skinName ) -{ - if ( skinName == qskSetup->skinName() ) - return; - - auto oldSkin = qskSetup->skin(); - if ( oldSkin->parent() == qskSetup ) - oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - - auto newSkin = qskSetup->setSkin( skinName ); - - SkinTransition transition( m_accent ); - - transition.setSourceSkin( oldSkin ); - transition.setTargetSkin( newSkin ); - transition.setAnimation( 500 ); - - transition.process(); - - if ( oldSkin->parent() == nullptr ) - delete oldSkin; -} - -QString Theme::skin() const -{ - return qskSetup->skinName(); -} - -void Theme::updateColors() -{ - SkinTransition transition( m_accent ); - - transition.setMask( SkinTransition::Color ); - transition.setSourceSkin( qskSetup->skin() ); - transition.setTargetSkin( qskSetup->skin() ); - transition.setAnimation( 500 ); - - transition.process(); -} - -#include "moc_Theme.cpp" diff --git a/examples/colorswitch/Theme.h b/examples/colorswitch/Theme.h deleted file mode 100644 index a01300f3..00000000 --- a/examples/colorswitch/Theme.h +++ /dev/null @@ -1,35 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#pragma once - -#include -#include - -class Theme : public QObject -{ - Q_OBJECT - - Q_PROPERTY( QColor accent READ accent WRITE setAccent NOTIFY accentChanged ) - Q_PROPERTY( QString skin READ skin WRITE setSkin NOTIFY skinChanged ) - - public: - Theme( QObject* parent = nullptr ); - - void setAccent( QColor color ); - QColor accent() const; - - void setSkin( const QString& ); - QString skin() const; - - Q_SIGNALS: - void accentChanged(); - void skinChanged(); - - private: - void updateColors(); - - QColor m_accent; -}; diff --git a/examples/colorswitch/colorswitch.pro b/examples/colorswitch/colorswitch.pro deleted file mode 100644 index e6da7676..00000000 --- a/examples/colorswitch/colorswitch.pro +++ /dev/null @@ -1,11 +0,0 @@ -CONFIG += qskexample qskqmlexport - -RESOURCES += \ - colorswitch.qrc - -HEADERS += \ - Theme.h - -SOURCES += \ - Theme.cpp \ - main.cpp diff --git a/examples/colorswitch/colorswitch.qml b/examples/colorswitch/colorswitch.qml deleted file mode 100644 index 32732703..00000000 --- a/examples/colorswitch/colorswitch.qml +++ /dev/null @@ -1,187 +0,0 @@ -import QtQuick 2.5 -import Skinny 1.0 -import Theme 1.0 // things beyond supersimple are way more convenient with C++ - -Main -{ - id: main - - property var accentColors: [ "red", "lightgreen", "#66336699" ] - - Theme - { - accent: accentColors[ tabBar.currentIndex < 0 ? 0 : tabBar.currentIndex ] - skin: listBox.entries[ listBox.selectedRow ] - } - - Window - { - id: window - - visible: true - color: "Gainsboro" - - width: 600 - height: 600 - - Component.onCompleted: - { - // very much standard: we should find a better way - - var hint = sizeConstraint(); - setMinimumWidth( hint.width ) - setMinimumHeight( hint.height ) - } - - LinearBox - { - orientation: Qt.Horizontal - - spacing: 20 - //margins: 8 // so that we can see the focus frame - margins { left: 8; top: 8; right: 8; bottom: 8 } - - SimpleListBox - { - id: listBox - - preferredWidthFromColumns: true - sizePolicy.horizontalPolicy: SizePolicy.Fixed - - entries: main.skinList - selectedRow: 1 - } - - LinearBox - { - // margins: 10 - margins { left: 10; top: 10; right: 10; bottom: 10 } - orientation: Qt.Vertical - defaultAlignment: Qt.AlignCenter - extraSpacingAt: Qt.BottomEdge - - TabBar - { - id: tabBar - currentIndex: 1 - - Instantiator - { - onObjectAdded: { - tabBar.insertTab( index, object ); - } - - model: accentColors - - delegate: TabButton - { - id: tabButton1 - sizePolicy.horizontalPolicy: SizePolicy.MinimumExpanding - text: modelData - } - } - } - - LinearBox - { - orientation: Qt.Horizontal - dimension: 3 - - spacing: 20 - //margins: 20 - margins { left: 20; top: 20; right: 20; bottom: 20 } - - sizePolicy - { - horizontalPolicy: SizePolicy.Fixed - verticalPolicy: SizePolicy.Fixed - } - - PushButton - { - text: "normal" - focus: true - } - - PushButton - { - text: checked ? "checked" : "unchecked" - checked: true - checkable: true - } - - PushButton - { - text: "disabled" - enabled: false - } - - PushButton - { - text: "flat" - flat: true - } - - PushButton - { - text: ( checked ? "\u2714 " : "" ) + "flat" - flat: true - checkable: true - checked: true - } - - PushButton - { - text: "flat" - flat: true - enabled: false - } - } - - LinearBox - { - spacing: 5 - orientation: Qt.Horizontal - - sizePolicy - { - horizontalPolicy: SizePolicy.MinimumExpanding - verticalPolicy: SizePolicy.Fixed - } - - Slider - { - id: slider - - minimum: 0 - maximum: 100 - value: 42 - - snap: true - stepSize: 1 - } - - TextLabel - { - id: sliderValue - - FontMetrics - { - id: fontMetrics - } - - property rect textRect: fontMetrics.boundingRect("100") - preferredSize: Qt.size( textRect.width, textRect.height ) - sizePolicy: SizePolicy.Fixed - - text: slider.value - } - } - } - } - - FocusIndicator - { - } - } -} diff --git a/examples/colorswitch/colorswitch.qrc b/examples/colorswitch/colorswitch.qrc deleted file mode 100644 index 77f236a9..00000000 --- a/examples/colorswitch/colorswitch.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - colorswitch.qml - - diff --git a/examples/colorswitch/main.cpp b/examples/colorswitch/main.cpp deleted file mode 100644 index 00d69450..00000000 --- a/examples/colorswitch/main.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "Theme.h" - -#include - -#include -#include - -#include -#include -#include - -int main( int argc, char* argv[] ) -{ -#ifdef ITEM_STATISTICS - QskObjectCounter counter( true ); -#endif - - qputenv( "QT_IM_MODULE", "skinny" ); - - QskQml::registerTypes(); - qmlRegisterType< Theme >( "Theme", 1, 0, "Theme" ); - - QGuiApplication app( argc, argv ); - - SkinnyShortcut::enable( SkinnyShortcut::Quit | - SkinnyShortcut::ChangeFonts | SkinnyShortcut::DebugShortcuts ); - - QQmlApplicationEngine engine( QUrl( "qrc:/qml/colorswitch.qml" ) ); - - return app.exec(); -} diff --git a/examples/examples.pro b/examples/examples.pro index 0402f44c..a2698bd4 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -32,7 +32,6 @@ qtHaveModule(svg) { SUBDIRS += \ boxes \ buttons \ - colorswitch \ frames \ gbenchmark \ glabels \ diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 7e853324..42f7640c 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -489,15 +489,16 @@ QSize QskWindow::sizeConstraint() const const auto children = contentItem()->childItems(); for ( auto child : children ) { - if ( auto control = qskControlCast( child ) ) + if ( !qskIsTransparentForPositioner( child ) ) { - const QSizeF itemConstraint = control->sizeConstraint(); + const auto size = qskSizeConstraint( child, Qt::PreferredSize ); +qDebug() << child << size; if ( doWidth ) - constraint.setWidth( qMax( constraint.width(), itemConstraint.width() ) ); + constraint.setWidth( qMax( constraint.width(), size.width() ) ); if ( doHeight ) - constraint.setHeight( qMax( constraint.height(), itemConstraint.height() ) ); + constraint.setHeight( qMax( constraint.height(), size.height() ) ); } } }