qskinny/examples/blurredbox/MainWindow.cpp

254 lines
8.3 KiB
C++

#include "MainWindow.h"
#include "BlurredBox.h"
#include "BlurredBoxTextureProvider.h"
#include "BlurredBoxSkinlet.h"
#include <QColor>
#include <QskLinearBox.h>
#include <QskStackBox.h>
#include <QskGraphic.h>
#include <QskGraphicLabel.h>
#include <QskGridBox.h>
#include <QskSegmentedBar.h>
#include <QskShortcutMap.h>
#include <QskSkin.h>
#include <QskSlider.h>
#include <QskTextInput.h>
#include <QskTextLabel.h>
#include <QQuickItemGrabResult>
#include <QSGTextureProvider>
#include <QskAnimator.h>
#include <QskBoxShapeMetrics.h>
#include <QskPushButton.h>
#include <memory>
class BlurredBoxAnimator : public QskAnimator{
public:
BlurredBoxAnimator(BlurredBox& blurred): m_blurred(blurred) {
}
void advance(qreal value) override
{
m_blurred.setOpacity(value);
}
void done() override {
delete this;
}
private:
BlurredBox& m_blurred;
};
enum Layers : int { BACKGROUND = 1, BLURRED = 2, CONTROLS = 3 };
MainWindow::MainWindow() : m_stack(new QskStackBox(contentItem()))
{
constexpr auto width = 1280;
constexpr auto height = 720;
constexpr QSize size = { width, height };
setMinimumSize( size );
setMaximumSize( size );
setTitle( tr( "Blurring" ) );
m_stack->setAutoLayoutChildren(true);
createBackground();
QskShortcutMap::addShortcut( Qt::CTRL | Qt::Key_O, false, contentItem(), [this](){
createOverlay();
});
}
void MainWindow::createBackground()
{
// create a brackground image
auto* const graphic = new QskGraphicLabel( m_stack );
graphic->setZ(BACKGROUND);
graphic->setFillMode( QskGraphicLabel::FillMode::Stretch );
graphic->setAlignment( Qt::AlignCenter );
static int index = 0;
const QImage image( QString( ":/backgrounds/background%1.jpg" ).arg( 1 + index++ ) );
graphic->setGraphic( QskGraphic::fromImage( image ) );
m_stack->addItem(graphic);
update();
}
void MainWindow::createBlurDirectionsControls( BlurredBox* blurred, QskLinearBox* layout )
{
auto* const label = new QskTextLabel( layout );
label->setTextColor( Qt::white );
label->setFontRole( QskSkin::MediumFont );
auto* const slider = new QskSlider( Qt::Horizontal, layout );
slider->setMinimum( 16.0 );
slider->setMaximum( 32.0 );
connect( slider, &QskSlider::valueChanged, slider, [ blurred, label ]( qreal value ) {
blurred->setBlurDirections( static_cast< float >( value ) );
label->setText( QString( tr( "Blur Directions" ) + " ( %1 )" ).arg( value ) );
} );
slider->setValue( blurred->blurDirections() );
}
void MainWindow::createBlurQualityControls( BlurredBox* blurred, QskLinearBox* layout )
{
auto* const label = new QskTextLabel( layout );
label->setTextColor( Qt::white );
label->setFontRole( QskSkin::MediumFont );
auto* const slider = new QskSlider( Qt::Horizontal, layout );
slider->setMinimum( 4.0 );
slider->setMaximum( 16.0 );
connect( slider, &QskSlider::valueChanged, slider, [ blurred, label ]( qreal value ) {
blurred->setBlurQuality( static_cast< float >( value ) );
label->setText( QString( tr( "Blur Quality" ) + " ( %1 )" ).arg( value ) );
} );
slider->setValue( blurred->blurQuality() );
}
void MainWindow::createBlurSizeControls( BlurredBox* blurred, QskLinearBox* layout )
{
auto* const label = new QskTextLabel( layout );
label->setTextColor( Qt::white );
label->setFontRole( QskSkin::MediumFont );
auto* const slider = new QskSlider( Qt::Horizontal, layout );
slider->setMinimum( 0.0 );
slider->setMaximum( 32.0 );
connect( slider, &QskSlider::valueChanged, slider, [ blurred, label ]( qreal value ) {
blurred->setBlurSize( static_cast< float >( value ) );
label->setText( QString( tr( "Blur Size" ) + " ( %1 )" ).arg( value ) );
} );
slider->setValue( blurred->blurSize() );
}
void MainWindow::createBlurOpacityControls( BlurredBox* blurred, QskLinearBox* layout )
{
auto* const label = new QskTextLabel( layout );
label->setTextColor( Qt::white );
label->setFontRole( QskSkin::MediumFont );
auto* const slider = new QskSlider( Qt::Horizontal, layout );
slider->setMinimum( 0.0 );
slider->setMaximum( 1.0 );
connect( slider, &QskSlider::valueChanged, slider, [ blurred, label ]( qreal value ) {
blurred->setOpacity( value );
label->setText( QString( tr( "Blur Opacity" ) + " ( %1 )" ).arg( value ) );
} );
slider->setValue( blurred->opacity() );
}
void MainWindow::createBlurCornerRadiiControls( BlurredBox* blurred, QskLinearBox* layout )
{
auto* const label = new QskTextLabel( layout );
label->setTextColor( Qt::white );
label->setFontRole( QskSkin::MediumFont );
auto* const bar = new QskSegmentedBar( Qt::Horizontal, layout );
enum
{
TL = 0,
TR = 1,
BR = 2,
BL = 3
};
bar->addText( "TL" );
bar->addText( "TR" );
bar->addText( "BR" );
bar->addText( "BL" );
auto* const slider = new QskSlider( Qt::Horizontal, layout );
slider->setMinimum( 0.0 );
slider->setMaximum( 80.0 );
connect( slider, &QskSlider::valueChanged, slider, [ blurred, bar, label ]( qreal value ) {
auto shape = blurred->boxShapeHint(BlurredBox::Panel);
const auto format = tr( "Corner Radius" ) + " ( %1 )";
switch ( bar->currentIndex() )
{
case TL:
shape.setTopLeft( { value, value } );
break;
case TR:
shape.setTopRight( { value, value } );
break;
case BR:
shape.setBottomRight( { value, value } );
break;
case BL:
shape.setBottomLeft( { value, value } );
break;
}
label->setText( format.arg( value ) );
blurred->setBoxShapeHint(BlurredBox::Panel, shape );
blurred->update();
} );
connect( bar, &QskSegmentedBar::currentIndexChanged, slider, [ blurred, slider ]( int index ) {
const auto shape = blurred->boxShapeHint(BlurredBox::Panel);
switch ( index )
{
case TL:
slider->setValue( shape.topLeft().width() );
break;
case TR:
slider->setValue( shape.topRight().width() );
break;
case BR:
slider->setValue( shape.bottomRight().width() );
break;
case BL:
slider->setValue( shape.bottomLeft().width() );
break;
}
} );
slider->setValue( blurred->boxShapeHint(BlurredBox::Panel).topLeft().width() );
bar->setSelectedIndex( TL );
bar->setCurrentIndex( TL );
}
void MainWindow::createShortcutNote( QskLinearBox* layout )
{
const auto text = tr( "Press 'Ctrl + Space' to change the background" );
auto* const label = new QskTextLabel( text, layout );
label->setTextColor( Qt::white );
label->setFontRole( QskSkin::LargeFont );
}
void MainWindow::createOverlay()
{
auto* const skinlet = new BlurredBoxSkinlet(std::make_shared<BlurredBoxTextureProvider>(this));
skinlet->setOwnedBySkinnable(true);
auto* blurredLayout = new QskLinearBox(m_stack);
blurredLayout->setZ(BLURRED);
auto* const blurred = new BlurredBox(blurredLayout);
blurred->setBoxShapeHint(BlurredBox::Panel, { 40, 40, 40, 40 });
blurred->setBlurQuality(20);
blurred->setBlurDirections(32);
blurred->setBlurSize(16);
blurred->setSkinlet(skinlet);
blurred->setMargins(80);
auto* const animator = new BlurredBoxAnimator(*blurred);
animator->setDuration(200);
animator->setWindow(this);
animator->start();
auto* const controlsLayout = new QskLinearBox( Qt::Vertical, m_stack );
controlsLayout->setZ(CONTROLS);
controlsLayout->setMargins(80);
// create controls to change the rectangle
controlsLayout->addSpacer( 10, 1 );
createBlurDirectionsControls( blurred, controlsLayout );
createBlurQualityControls( blurred, controlsLayout );
createBlurSizeControls( blurred, controlsLayout );
createBlurOpacityControls( blurred, controlsLayout );
createBlurCornerRadiiControls( blurred, controlsLayout );
controlsLayout->addSpacer( 10, 1 );
createShortcutNote( controlsLayout );
controlsLayout->addSpacer( 10, 1 );
update();
}
#include "moc_MainWindow.cpp"