Skip to content

Commit

Permalink
code duplication eliminated
Browse files Browse the repository at this point in the history
  • Loading branch information
uwerat committed Sep 4, 2024
1 parent 16dcddd commit 11df0bb
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 227 deletions.
180 changes: 1 addition & 179 deletions examples/iotdashboard/CircularProgressBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,193 +5,15 @@

#include "CircularProgressBar.h"

#include <QskAnimator.h>
#include <QskFunctions.h>

QSK_SUBCONTROL( CircularProgressBar, Groove )
QSK_SUBCONTROL( CircularProgressBar, Bar )

namespace
{
class PositionAnimator : public QskAnimator
{
public:
PositionAnimator( CircularProgressBar* progressBar )
: m_progressBar( progressBar )
{
setAutoRepeat( true );
setDuration( 1300 );

setWindow( progressBar->window() );
}

void advance( qreal value ) override
{
const auto aspect = CircularProgressBar::Bar | QskAspect::Position;

m_progressBar->setMetric( aspect, value );
m_progressBar->update();
}

private:
CircularProgressBar* m_progressBar;
};
}

class CircularProgressBar::PrivateData
{
public:
void updateIndeterminateAnimator( CircularProgressBar* progressBar )
{
if ( !isIndeterminate )
{
delete animator;
animator = nullptr;

return;
}

if ( progressBar->window() && progressBar->isVisible() )
{
if ( animator == nullptr )
animator = new PositionAnimator( progressBar );

animator->start();
}
else
{
if ( animator )
animator->stop();
}
}

PositionAnimator* animator = nullptr;

qreal value = 0.0;
qreal origin = 0.0;

bool hasOrigin = false;
bool isIndeterminate = false;
};

CircularProgressBar::~CircularProgressBar() = default;

CircularProgressBar::CircularProgressBar( qreal min, qreal max, QQuickItem* parent )
: QskBoundedControl( min, max, parent )
, m_data( new PrivateData )
: Inherited( min, max, parent )
{
m_data->value = minimum();

initSizePolicy( QskSizePolicy::MinimumExpanding, QskSizePolicy::MinimumExpanding );

connect( this, &QskBoundedControl::boundariesChanged,
this, &CircularProgressBar::adjustValue );
}

CircularProgressBar::CircularProgressBar( QQuickItem* parent )
: CircularProgressBar( 0.0, 100.0, parent )
{
}

bool CircularProgressBar::isIndeterminate() const
{
return m_data->isIndeterminate;
}

void CircularProgressBar::setIndeterminate( bool on )
{
if ( on == m_data->isIndeterminate )
return;

m_data->isIndeterminate = on;
m_data->updateIndeterminateAnimator( this );

update();
Q_EMIT indeterminateChanged( on );
}

void CircularProgressBar::resetOrigin()
{
if ( m_data->hasOrigin )
{
m_data->hasOrigin = false;

update();
Q_EMIT originChanged( origin() );
}
}

qreal CircularProgressBar::origin() const
{
if ( m_data->hasOrigin )
{
return boundedValue( m_data->origin );
}

return minimum();
}

qreal CircularProgressBar::value() const
{
return m_data->value;
}

qreal CircularProgressBar::valueAsRatio() const
{
return QskBoundedControl::valueAsRatio( m_data->value );
}

void CircularProgressBar::setValue( qreal value )
{
if ( isComponentComplete() )
value = boundedValue( value );

setValueInternal( value );
}

void CircularProgressBar::setValueAsRatio( qreal ratio )
{
ratio = qBound( 0.0, ratio, 1.0 );
setValue( minimum() + ratio * boundaryLength() );
}

void CircularProgressBar::setOrigin( qreal origin )
{
if ( isComponentComplete() )
origin = boundedValue( origin );

if( !m_data->hasOrigin || !qskFuzzyCompare( m_data->origin, origin ) )
{
m_data->hasOrigin = true;
m_data->origin = origin;

update();
Q_EMIT originChanged( origin );
}
}

void CircularProgressBar::componentComplete()
{
Inherited::componentComplete();
adjustValue();
}

void CircularProgressBar::setValueInternal( qreal value )
{
if ( !qskFuzzyCompare( value, m_data->value ) )
{
m_data->value = value;

Q_EMIT valueChanged( value );

update();
}
}

void CircularProgressBar::adjustValue()
{
if ( isComponentComplete() )
setValueInternal( boundedValue( m_data->value ) );
}

#include "moc_CircularProgressBar.cpp"
48 changes: 4 additions & 44 deletions examples/iotdashboard/CircularProgressBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,57 +5,17 @@

#pragma once

#include <QskBoundedControl.h>
#include <QskProgressIndicator.h>

class CircularProgressBar : public QskBoundedControl
class CircularProgressBar : public QskProgressIndicator
{
Q_OBJECT

Q_PROPERTY( bool indeterminate READ isIndeterminate
WRITE setIndeterminate NOTIFY indeterminateChanged )

Q_PROPERTY( qreal origin READ origin
WRITE setOrigin RESET resetOrigin NOTIFY originChanged )

Q_PROPERTY( qreal value READ value WRITE setValue NOTIFY valueChanged )
Q_PROPERTY( qreal valueAsRatio READ valueAsRatio
WRITE setValueAsRatio NOTIFY valueChanged )

using Inherited = QskBoundedControl;
using Inherited = QskProgressIndicator;

public:
QSK_SUBCONTROLS( Groove, Bar )

CircularProgressBar( qreal min, qreal max, QQuickItem* parent = nullptr );
CircularProgressBar( QQuickItem* parent = nullptr );
~CircularProgressBar() override;

bool isIndeterminate() const;
void setIndeterminate( bool on = true );

void resetOrigin();
qreal origin() const;

qreal value() const;
qreal valueAsRatio() const; // [0.0, 1.0]

public Q_SLOTS:
void setValue( qreal );
void setValueAsRatio( qreal );
void setOrigin( qreal );

Q_SIGNALS:
void indeterminateChanged( bool );
void valueChanged( qreal );
void originChanged( qreal );

protected:
void componentComplete() override;

private:
void setValueInternal( qreal value );
void adjustValue();

class PrivateData;
std::unique_ptr< PrivateData > m_data;
~CircularProgressBar() override = default;
};
2 changes: 1 addition & 1 deletion examples/iotdashboard/CircularProgressBarSkinlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ QSGNode* CircularProgressBarSkinlet::updateSubNode(
const qreal spanAngle = 360.0 * bar->valueAsRatio();

return updateArcNode( skinnable, node, startAngle, -spanAngle,
CircularProgressBar::Bar );
CircularProgressBar::Fill );
}
}

Expand Down
2 changes: 1 addition & 1 deletion examples/iotdashboard/EnergyMeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ EnergyMeter::EnergyMeter( const QColor& textColor,
setAutoLayoutChildren( true );

auto valueBar = new CircularProgressBar( this );
valueBar->setGradientHint( CircularProgressBar::Bar, gradient );
valueBar->setGradientHint( CircularProgressBar::Fill, gradient );
valueBar->setValue( value );

auto valueLabel = new ValueLabel( this );
Expand Down
2 changes: 1 addition & 1 deletion examples/iotdashboard/Skin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ void Skin::initHints()
ed.setArcMetrics( CircularProgressBar::Groove, 90, -360, 8.53 );
// the span angle will be set in the progress bar, we just give a dummy
// value here:
ed.setArcMetrics( CircularProgressBar::Bar, 90, -180, 8.53 );
ed.setArcMetrics( CircularProgressBar::Fill, 90, -180, 8.53 );

ed.setFontRole( TimeTitleLabel::Text, { QskFontRole::Caption, QskFontRole::High } );

Expand Down
2 changes: 1 addition & 1 deletion examples/iotdashboard/StorageMeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void StorageMeter::setValue( const qreal value )
{
const auto gradient = gradientHint( StorageMeter::Status );
const auto color = gradient.extracted( value / 100.0, value / 100.0 ).startColor();
setGradientHint( StorageMeter::Bar, { color, color.lighter() } );
setGradientHint( StorageMeter::Fill, { color, color.lighter() } );
CircularProgressBar::setValue( value );
label->setTextColor( color );
label->setText( make_text( locale(), value ) );
Expand Down

0 comments on commit 11df0bb

Please sign in to comment.