add pie chart
This commit is contained in:
parent
f3a1517593
commit
0e8b31ab2f
|
@ -7,6 +7,6 @@ Card::Card(const QString &title, QskControl *content, QQuickItem *parent ) : Qsk
|
||||||
{
|
{
|
||||||
m_label = new QskTextLabel( m_title, this );
|
m_label = new QskTextLabel( m_title, this );
|
||||||
m_content = content;
|
m_content = content;
|
||||||
m_content->setParentItem( this );
|
m_content->setParentItem( this ); // ### maybe do it differently
|
||||||
m_content->setParent( this );
|
m_content->setParent( this );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "MainContent.h"
|
#include "MainContent.h"
|
||||||
|
|
||||||
#include "Card.h"
|
#include "Card.h"
|
||||||
|
#include "PieChart.h"
|
||||||
|
|
||||||
#include <QskTextLabel.h>
|
#include <QskTextLabel.h>
|
||||||
|
|
||||||
|
@ -14,7 +15,9 @@ MainContent::MainContent( QQuickItem *parent ) : QskLinearBox( Qt::Horizontal, p
|
||||||
m_columns.append( column );
|
m_columns.append( column );
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* pieChart = new QskTextLabel( "here pie chart" );
|
auto* pieChart = new PieChart;
|
||||||
|
QVector< float > angles = { 60, 90, 150, 60 };
|
||||||
|
pieChart->setAngles( angles );
|
||||||
addCard( "Sample usage", pieChart, 0 );
|
addCard( "Sample usage", pieChart, 0 );
|
||||||
|
|
||||||
auto* barGraph = new QskTextLabel( "here bar graph" );
|
auto* barGraph = new QskTextLabel( "here bar graph" );
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include "PieChart.h"
|
||||||
|
|
||||||
|
QSK_SUBCONTROL( PieChart, Panel )
|
||||||
|
QSK_SUBCONTROL( PieChart, Labels )
|
||||||
|
|
||||||
|
PieChart::PieChart( QQuickItem *parent ) : QskControl( parent )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector< float > PieChart::angles() const
|
||||||
|
{
|
||||||
|
return m_angles;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PieChart::setAngles( const QVector< float >& angles )
|
||||||
|
{
|
||||||
|
m_angles = angles;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector< QString > PieChart::labels() const
|
||||||
|
{
|
||||||
|
return m_labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PieChart::setLabels( const QVector< QString >& labels )
|
||||||
|
{
|
||||||
|
m_labels = labels;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef PIECHART_H
|
||||||
|
#define PIECHART_H
|
||||||
|
|
||||||
|
#include <QskControl.h>
|
||||||
|
|
||||||
|
class PieChart : public QskControl
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
QSK_SUBCONTROLS( Panel, Labels )
|
||||||
|
|
||||||
|
PieChart( QQuickItem* parent = nullptr );
|
||||||
|
|
||||||
|
QVector< float > angles() const;
|
||||||
|
void setAngles( const QVector< float >& angles );
|
||||||
|
|
||||||
|
QVector< QString > labels() const;
|
||||||
|
void setLabels( const QVector< QString >& labels );
|
||||||
|
|
||||||
|
private:
|
||||||
|
QVector< float > m_angles;
|
||||||
|
QVector< QString > m_labels;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PIECHART_H
|
|
@ -0,0 +1,69 @@
|
||||||
|
#include "PieChartSkinlet.h"
|
||||||
|
#include "PieChart.h"
|
||||||
|
|
||||||
|
#include <QskBoxNode.h>
|
||||||
|
#include <QskBoxShapeMetrics.h>
|
||||||
|
#include <QskBoxBorderMetrics.h>
|
||||||
|
#include <QskBoxBorderColors.h>
|
||||||
|
|
||||||
|
PieChartSkinlet::PieChartSkinlet( QskSkin* skin ) : QskSkinlet( skin )
|
||||||
|
{
|
||||||
|
setNodeRoles( { PanelRole, LabelsRole } );
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF PieChartSkinlet::subControlRect( const QskSkinnable*, const QRectF& contentsRect, QskAspect::Subcontrol ) const
|
||||||
|
{
|
||||||
|
return contentsRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* PieChartSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const
|
||||||
|
{
|
||||||
|
const auto pieChart = static_cast< const PieChart* >( skinnable );
|
||||||
|
|
||||||
|
switch ( nodeRole )
|
||||||
|
{
|
||||||
|
case PanelRole:
|
||||||
|
return updatePanelNode( pieChart, node );
|
||||||
|
|
||||||
|
case LabelsRole:
|
||||||
|
return updateLabelsNode( pieChart, node );
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* PieChartSkinlet::updatePanelNode( const PieChart* pieChart, QSGNode* node ) const
|
||||||
|
{
|
||||||
|
auto boxNode = static_cast< QskBoxNode* >( node );
|
||||||
|
|
||||||
|
if ( boxNode == nullptr )
|
||||||
|
{
|
||||||
|
boxNode = new QskBoxNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto panelRect = subControlRect( pieChart, pieChart->contentsRect(), PieChart::Panel );
|
||||||
|
|
||||||
|
const qreal radius = panelRect.width() / 2;
|
||||||
|
|
||||||
|
QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius );
|
||||||
|
QskBoxBorderMetrics borderMetrics = pieChart->boxBorderMetricsHint( PieChart::Panel );
|
||||||
|
QskBoxBorderColors borderColors = pieChart->boxBorderColorsHint( PieChart::Panel );
|
||||||
|
QskGradient gradient = pieChart->gradientHint( PieChart::Panel );
|
||||||
|
boxNode->setBoxData( panelRect, shapeMetrics, borderMetrics, borderColors, gradient );
|
||||||
|
|
||||||
|
return boxNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* PieChartSkinlet::updateLabelsNode( const PieChart* pieChart, QSGNode* node ) const
|
||||||
|
{
|
||||||
|
const int labelsCount = pieChart->labels().count();
|
||||||
|
|
||||||
|
// ### actually, we could draw labels with only one entry
|
||||||
|
if ( labelsCount <= 1 )
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
#ifndef PIECHARTSKINLET_H
|
||||||
|
#define PIECHARTSKINLET_H
|
||||||
|
|
||||||
|
#include <QskSkinlet.h>
|
||||||
|
|
||||||
|
class PieChart;
|
||||||
|
|
||||||
|
class PieChartSkinlet : public QskSkinlet
|
||||||
|
{
|
||||||
|
Q_GADGET
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum NodeRole
|
||||||
|
{
|
||||||
|
PanelRole,
|
||||||
|
LabelsRole
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_INVOKABLE PieChartSkinlet( QskSkin* skin = nullptr );
|
||||||
|
|
||||||
|
QRectF subControlRect( const QskSkinnable*, const QRectF&, QskAspect::Subcontrol ) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* node ) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSGNode* updatePanelNode( const PieChart*, QSGNode* ) const;
|
||||||
|
QSGNode* updateLabelsNode( const PieChart*, QSGNode* ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PIECHARTSKINLET_H
|
|
@ -4,6 +4,8 @@ SOURCES += \
|
||||||
Card.cpp \
|
Card.cpp \
|
||||||
MainContent.cpp \
|
MainContent.cpp \
|
||||||
MenuBar.cpp \
|
MenuBar.cpp \
|
||||||
|
PieChart.cpp \
|
||||||
|
PieChartSkinlet.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
MainWindow.cpp
|
MainWindow.cpp
|
||||||
|
|
||||||
|
@ -11,7 +13,9 @@ HEADERS += \
|
||||||
Card.h \
|
Card.h \
|
||||||
MainContent.h \
|
MainContent.h \
|
||||||
MainWindow.h \
|
MainWindow.h \
|
||||||
MenuBar.h
|
MenuBar.h \
|
||||||
|
PieChart.h \
|
||||||
|
PieChartSkinlet.h
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
images.qrc
|
images.qrc
|
||||||
|
|
Loading…
Reference in New Issue