diff --git a/playground/nodes/RadialNodes.cpp b/playground/nodes/RadialNodes.cpp index 2debd88e..fc2bf160 100644 --- a/playground/nodes/RadialNodes.cpp +++ b/playground/nodes/RadialNodes.cpp @@ -9,4 +9,15 @@ RadialTickmarks::RadialTickmarks( QQuickItem* const parent ) : QskControl( paren setStrutSizeHint( Lines, 2, 10 ); } +void RadialTickmarks::setTickmarks( const QskScaleTickmarks& tickmarks ) +{ + m_tickmarks = tickmarks; + update(); +} + +QskScaleTickmarks RadialTickmarks::tickmarks() const +{ + return m_tickmarks; +} + #include "moc_RadialNodes.cpp" \ No newline at end of file diff --git a/playground/nodes/RadialNodes.h b/playground/nodes/RadialNodes.h index 70a29af7..e5f50aab 100644 --- a/playground/nodes/RadialNodes.h +++ b/playground/nodes/RadialNodes.h @@ -1,10 +1,16 @@ #pragma once #include +#include class RadialTickmarks : public QskControl { public: QSK_SUBCONTROLS(Lines) explicit RadialTickmarks( QQuickItem* parent = nullptr ); + void setTickmarks(const QskScaleTickmarks& tickmarks); + QskScaleTickmarks tickmarks() const; + +private: + QskScaleTickmarks m_tickmarks; }; \ No newline at end of file diff --git a/playground/nodes/RadialNodesSkinlet.cpp b/playground/nodes/RadialNodesSkinlet.cpp index e4c04286..6458ff9e 100644 --- a/playground/nodes/RadialNodesSkinlet.cpp +++ b/playground/nodes/RadialNodesSkinlet.cpp @@ -175,7 +175,8 @@ QRectF RadialTickmarksSkinlet::subControlRect( const QskSkinnable* const skinnab { if ( subControl == RadialTickmarks::Lines ) { - return contentsRect; + const auto a = skinnable->strutSizeHint(RadialTickmarks::Lines).height() / 2; + return contentsRect.adjusted(+a, +a, -a, -a); } return QskSkinlet::subControlRect( skinnable, contentsRect, subControl ); } @@ -189,22 +190,6 @@ QSGNode* RadialTickmarksSkinlet::updateSubNode( { case Lines: { const auto* const control = static_cast< const Q* >( skinnable ); - - QskScaleTickmarks tickmarks; - QVector< qreal > major, medium, minor; - for ( int deg = 0; deg < 360; deg += 1 ) - { - if ( deg % 10 == 0 ) - major << deg; - else if ( deg % 5 == 0 ) - medium << deg; - else - minor << deg; - } - tickmarks.setMajorTicks( major ); - tickmarks.setMediumTicks( medium ); - tickmarks.setMinorTicks( minor ); - const auto subControlRect = control->subControlContentsRect( Q::Lines ); const auto alignment = control->alignmentHint( Q::Lines ); const auto size = control->strutSizeHint( Q::Lines ); @@ -221,7 +206,7 @@ QSGNode* RadialTickmarksSkinlet::updateSubNode( auto* const root = QskSGNode::ensureNode< QskRadialTickmarksNode >( node ); root->setMaterialProperties( skinnable->color( Q::Lines ) ); - root->setGeometryProperties( tickmarks, radius, height, c, alignment, size.width() ); + root->setGeometryProperties( control->tickmarks(), radius, height, c, alignment, size.width() ); return root; } default: diff --git a/playground/nodes/main.cpp b/playground/nodes/main.cpp index af880ab4..1513c476 100644 --- a/playground/nodes/main.cpp +++ b/playground/nodes/main.cpp @@ -6,19 +6,19 @@ #include #include -#include -#include -#include -#include -#include -#include #include -#include +#include +#include +#include +#include +#include #include #include -#include +#include +#include #include #include +#include #include @@ -35,47 +35,85 @@ int main( int argc, char* argv[] ) SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); - qskSkinManager->setPluginPaths( - { R"(C:\repositories\qskinny_rveh-install-win\plugins)" } ); + qskSkinManager->setPluginPaths( { R"(C:\repositories\qskinny_rveh-install-win\plugins)" } ); qskSetup->setItemUpdateFlag( QskQuickItem::PreferRasterForTextures, true ); - + QskWindow window; window.resize( 800, 600 ); - auto* const layout = new QskLinearBox(Qt::Horizontal, window.contentItem() ); - auto* const left = new QskLinearBox(Qt::Vertical, layout); - auto* const right = new QskLinearBox(Qt::Vertical, layout); + auto* const layout = new QskLinearBox( Qt::Horizontal, window.contentItem() ); + auto* const left = new QskLinearBox( Qt::Vertical, layout ); + auto* const right = new QskLinearBox( Qt::Vertical, layout ); auto* const control = new RadialTickmarks( left ); auto* const skinlet = new RadialTickmarksSkinlet; { - (void) new QskTextLabel("Tickmark Alignment", right); - auto* const alignment = new QskSegmentedBar(right); - alignment->setOptions( { "Center", "Bottom", "Top" } ); - QObject::connect(alignment, &QskSegmentedBar::selectedIndexChanged, control, [=](const int i){ + ( void ) new QskTextLabel( "Tickmark Alignment", right ); + auto* const alignment = new QskSegmentedBar( right ); + alignment->setOptions( { "Center", "Bottom", "Top" } ); + QObject::connect( + alignment, &QskSegmentedBar::selectedIndexChanged, control, [ = ]( const int i ) { static const Qt::Alignment a[ 3 ]{ Qt::AlignVCenter, Qt::AlignBottom, Qt::AlignTop }; - control->setAlignmentHint(RadialTickmarks::Lines, a[i]); - }); + control->setAlignmentHint( RadialTickmarks::Lines, a[ i ] ); + } ); + alignment->setSelectedIndex(0); - (void) new QskTextLabel("Tickmark Size", right); - auto* const sliderW = new QskSlider(right); - auto* const sliderH = new QskSlider(right); + ( void ) new QskTextLabel( "Tickmark Size W / H", right ); + auto* const sliderW = new QskSlider( right ); + auto* const sliderH = new QskSlider( right ); - sliderW->setMinimum(1.0); - sliderW->setMaximum(4.0); - sliderW->setValue(1.0); + sliderW->setMinimum( 1.0 ); + sliderW->setMaximum( 4.0 ); + sliderW->setValue( 1.0 ); sliderH->setValue( 0.5 ); - auto updateStrutSizeHint = [=](const qreal){ + auto updateStrutSizeHint = [ = ]( const qreal ) { const auto width = sliderW->value(); - const auto height = sliderH->value() * control->height(); - control->setStrutSizeHint(RadialTickmarks::Lines, width, height ); + const auto height = sliderH->value() * qMin(control->height(), control->width()) / 2; + control->setStrutSizeHint( RadialTickmarks::Lines, width, height ); }; QObject::connect( sliderW, &QskSlider::valueChanged, control, updateStrutSizeHint ); - QObject::connect( sliderH, &QskSlider::valueChanged, control, updateStrutSizeHint ); + QObject::connect( sliderH, &QskSlider::valueChanged, control, updateStrutSizeHint ); + + ( void ) new QskTextLabel( "Tickmarks [min,max]", right ); + + auto* const tickmarksMin = new QskSlider( right ); + tickmarksMin->setMinimum( 0 ); + tickmarksMin->setMaximum( 360 ); + + auto* const tickmarksMax = new QskSlider( right ); + tickmarksMax->setMinimum( 0 ); + tickmarksMax->setMaximum( 360 ); + + auto updateTickmark = [ control, tickmarksMin, tickmarksMax ]( const qreal v ) { + QskScaleTickmarks tickmarks; + QVector< qreal > major, medium, minor; + + for ( int deg = tickmarksMin->value(); deg < tickmarksMax->value(); deg += 1 ) + { + if ( deg % 10 == 0 ) + major << deg; + else if ( deg % 5 == 0 ) + medium << deg; + else + minor << deg; + } + + tickmarks.setMajorTicks( major ); + tickmarks.setMediumTicks( medium ); + tickmarks.setMinorTicks( minor ); + control->setTickmarks( tickmarks ); + }; + + QObject::connect( tickmarksMin, &QskSlider::valueChanged, control, updateTickmark ); + QObject::connect( tickmarksMax, &QskSlider::valueChanged, control, updateTickmark ); + + tickmarksMin->setValue( 0 ); + tickmarksMax->setValue( 270 ); + } - control->setSkinlet(skinlet); + control->setSkinlet( skinlet ); skinlet->setOwnedBySkinnable( true ); window.show();