qskinny/examples/gallery/inputs/InputPage.cpp

175 lines
4.5 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "InputPage.h"
#include <QskGridBox.h>
#include <QskSlider.h>
#include <QskTextField.h>
#include <QskSpinBox.h>
namespace
{
class Slider : public QskSlider
{
public:
enum Style
{
Continuous,
Discrete,
Centered
};
Slider( Qt::Orientation orientation,
Style style, QQuickItem* parent = nullptr )
: QskSlider( orientation, parent )
{
setBoundaries( 0, 100 );
setValue( 30 );
switch( style )
{
case Discrete:
{
setSnapping( true );
setStepSize( 5 );
setPageSteps( 4 );
break;
}
case Continuous:
{
setSnapping( false );
setStepSize( 1 );
setPageSteps( 10 );
break;
}
case Centered:
{
// TODO
break;
}
}
#if 0
connect( this, &QskSlider::valueChanged,
[]( qreal value ) { qDebug() << value; } );
#endif
}
};
class InputBox : public QskLinearBox
{
public:
InputBox( QQuickItem* parent = nullptr )
: QskLinearBox( Qt::Horizontal, parent )
{
setSpacing( 20 );
{
new QskTextField( "Edit Me", this );
}
{
auto textField = new QskTextField( "Only Read Me", this );
textField->setReadOnly( true );
textField->setSizePolicy( Qt::Horizontal, QskSizePolicy::MinimumExpanding );
}
{
auto textField = new QskTextField( "12345", this );
textField->setMaxLength( 5 );
textField->setEchoMode( QskTextField::PasswordEchoOnEdit );
#if 1
textField->setFixedWidth( 80 );
#endif
}
}
};
}
InputPage::InputPage( QQuickItem* parent )
: Page( Qt::Horizontal, parent )
{
struct
{
Slider* continous;
Slider* discrete;
Slider* centered;
} sliders[2];
for ( int i = 0; i < 2; i++ )
{
const auto orientation = static_cast< Qt::Orientation >( i + 1 );
sliders[i].continous = new Slider( orientation, Slider::Continuous );
sliders[i].discrete = new Slider( orientation, Slider::Discrete );
auto slider = new Slider( orientation, Slider::Continuous );
slider->setOrigin( slider->minimum()
+ 0.5 * ( slider->maximum() - slider->minimum() ) );
sliders[i].centered = slider;
}
auto spinBox = new QskSpinBox( 0.0, 100.0, 1.0 );
spinBox->setSizePolicy( Qt::Horizontal, QskSizePolicy::Fixed );
auto inputBox = new InputBox();
inputBox->setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed );
auto vBox = new QskLinearBox( Qt::Vertical );
vBox->setSpacing( 30 );
vBox->setExtraSpacingAt( Qt::RightEdge | Qt::BottomEdge );
vBox->addItem( sliders[0].continous );
vBox->addItem( sliders[0].discrete );
vBox->addItem( sliders[0].centered );
vBox->addItem( inputBox );
vBox->addItem( spinBox );
auto mainBox = new QskLinearBox( Qt::Horizontal, this );
mainBox->setSpacing( 30 );
mainBox->addItem( sliders[1].continous );
mainBox->addItem( sliders[1].discrete );
mainBox->addItem( sliders[1].centered );
mainBox->addItem( vBox );
auto inputs = findChildren< QskBoundedValueInput* >();
for ( auto input : inputs )
{
connect( input, &QskBoundedValueInput::valueChanged,
this, &InputPage::syncValues );
}
spinBox->setValue( 30.0 );
}
void InputPage::syncValues( qreal value )
{
static bool blockUpdates = false;
if ( blockUpdates )
return;
blockUpdates = true;
if ( qobject_cast< const QskSlider* >( sender() ) )
{
auto spinBoxes = findChildren< QskSpinBox* >();
for ( auto spinBox : spinBoxes )
spinBox->setValue( value );
}
else
{
auto sliders = findChildren< QskSlider* >();
for ( auto slider : sliders )
slider->setValue( value );
}
blockUpdates = false;
}