This commit is contained in:
Uwe Rathmann 2022-03-24 11:14:46 +01:00
parent d285b7e85c
commit d81e8991af
2 changed files with 63 additions and 38 deletions

View File

@ -4,14 +4,18 @@
*****************************************************************************/ *****************************************************************************/
#include "QskScaleRenderer.h" #include "QskScaleRenderer.h"
#include "QskScaleTickmarks.h"
#include "QskSkinlet.h" #include "QskSkinlet.h"
#include "QskSGNode.h" #include "QskSGNode.h"
#include "QskTickmarksNode.h" #include "QskTickmarksNode.h"
#include "QskTextNode.h" #include "QskTextNode.h"
#include "QskGraphicNode.h" #include "QskGraphicNode.h"
#include "QskTextOptions.h" #include "QskTextOptions.h"
#include "QskTextColors.h"
#include "QskGraphic.h" #include "QskGraphic.h"
#include "QskColorFilter.h"
#include "QskControl.h" #include "QskControl.h"
#include "QskIntervalF.h"
#include "QskFunctions.h" #include "QskFunctions.h"
#include <qstring.h> #include <qstring.h>
@ -45,44 +49,70 @@ static inline void qskInsertRemoveChild( QSGNode* parentNode,
} }
} }
class QskScaleRenderer::PrivateData
{
public:
QskIntervalF boundaries;
QskScaleTickmarks tickmarks;
QColor tickColor = Qt::black;
qreal tickWidth = 1.0;
QFont font;
QskTextColors textColors;
QskColorFilter colorFilter;
Qt::Orientation orientation = Qt::Horizontal;
};
QskScaleRenderer::QskScaleRenderer()
: m_data( new PrivateData() )
{
}
QskScaleRenderer::~QskScaleRenderer()
{
}
void QskScaleRenderer::setOrientation( Qt::Orientation orientation ) void QskScaleRenderer::setOrientation( Qt::Orientation orientation )
{ {
m_orientation = orientation; m_data->orientation = orientation;
} }
void QskScaleRenderer::setBoundaries( const QskIntervalF& boundaries ) void QskScaleRenderer::setBoundaries( const QskIntervalF& boundaries )
{ {
m_boundaries = boundaries; m_data->boundaries = boundaries;
} }
void QskScaleRenderer::setTickmarks( const QskScaleTickmarks& tickmarks ) void QskScaleRenderer::setTickmarks( const QskScaleTickmarks& tickmarks )
{ {
m_tickmarks = tickmarks; m_data->tickmarks = tickmarks;
} }
void QskScaleRenderer::setTickColor( const QColor& color ) void QskScaleRenderer::setTickColor( const QColor& color )
{ {
m_tickColor = color; m_data->tickColor = color;
} }
void QskScaleRenderer::setTickWidth( qreal width ) void QskScaleRenderer::setTickWidth( qreal width )
{ {
m_tickWidth = width; m_data->tickWidth = width;
} }
void QskScaleRenderer::setFont( const QFont& font ) void QskScaleRenderer::setFont( const QFont& font )
{ {
m_font = font; m_data->font = font;
} }
void QskScaleRenderer::setTextColors( const QskTextColors& textColors ) void QskScaleRenderer::setTextColors( const QskTextColors& textColors )
{ {
m_textColors = textColors; m_data->textColors = textColors;
} }
void QskScaleRenderer::setColorFilter( const QskColorFilter& colorFilter ) void QskScaleRenderer::setColorFilter( const QskColorFilter& colorFilter )
{ {
m_colorFilter = colorFilter; m_data->colorFilter = colorFilter;
} }
QSGNode* QskScaleRenderer::updateScaleNode( QSGNode* QskScaleRenderer::updateScaleNode(
@ -140,8 +170,8 @@ QSGNode* QskScaleRenderer::updateTicksNode(
if( ticksNode == nullptr ) if( ticksNode == nullptr )
ticksNode = new QskTickmarksNode; ticksNode = new QskTickmarksNode;
ticksNode->update( m_tickColor, rect, m_boundaries, ticksNode->update( m_data->tickColor, rect, m_data->boundaries,
m_tickmarks, m_tickWidth, m_orientation ); m_data->tickmarks, m_data->tickWidth, m_data->orientation );
return ticksNode; return ticksNode;
} }
@ -153,18 +183,18 @@ QSGNode* QskScaleRenderer::updateLabelsNode(
if ( labelsRect.isEmpty() || tickmarksRect.isEmpty() ) if ( labelsRect.isEmpty() || tickmarksRect.isEmpty() )
return nullptr; return nullptr;
const auto ticks = m_tickmarks.majorTicks(); const auto ticks = m_data->tickmarks.majorTicks();
if ( ticks.isEmpty() ) if ( ticks.isEmpty() )
return nullptr; return nullptr;
if( node == nullptr ) if( node == nullptr )
node = new QSGNode; node = new QSGNode;
const QFontMetricsF fm( m_font ); const QFontMetricsF fm( m_data->font );
const qreal length = ( m_orientation == Qt::Horizontal ) const qreal length = ( m_data->orientation == Qt::Horizontal )
? tickmarksRect.width() : tickmarksRect.height(); ? tickmarksRect.width() : tickmarksRect.height();
const qreal ratio = length / m_boundaries.width(); const qreal ratio = length / m_data->boundaries.width();
auto nextNode = node->firstChild(); auto nextNode = node->firstChild();
@ -182,7 +212,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode(
if ( label.isNull() ) if ( label.isNull() )
continue; continue;
const qreal tickPos = ratio * ( tick - m_boundaries.lowerBound() ); const qreal tickPos = ratio * ( tick - m_data->boundaries.lowerBound() );
if ( label.canConvert< QString >() ) if ( label.canConvert< QString >() )
{ {
@ -193,7 +223,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode(
QRectF r; QRectF r;
Qt::Alignment alignment; Qt::Alignment alignment;
if( m_orientation == Qt::Horizontal ) if( m_data->orientation == Qt::Horizontal )
{ {
const auto w = qskHorizontalAdvance( fm, text ); const auto w = qskHorizontalAdvance( fm, text );
@ -261,8 +291,8 @@ QSGNode* QskScaleRenderer::updateLabelsNode(
} }
auto textNode = static_cast< QskTextNode* >( nextNode ); auto textNode = static_cast< QskTextNode* >( nextNode );
textNode->setTextData( skinnable->owningControl(), text, r, m_font, textNode->setTextData( skinnable->owningControl(), text, r, m_data->font,
QskTextOptions(), m_textColors, alignment, Qsk::Normal ); QskTextOptions(), m_data->textColors, alignment, Qsk::Normal );
nextNode = nextNode->nextSibling(); nextNode = nextNode->nextSibling();
} }
@ -277,7 +307,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode(
Qt::Alignment alignment; Qt::Alignment alignment;
if( m_orientation == Qt::Horizontal ) if( m_data->orientation == Qt::Horizontal )
{ {
auto pos = tickmarksRect.x() + tickPos - 0.5 * w; auto pos = tickmarksRect.x() + tickPos - 0.5 * w;
pos = qBound( labelsRect.left(), pos, labelsRect.right() - w ); pos = qBound( labelsRect.left(), pos, labelsRect.right() - w );
@ -310,7 +340,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode(
QskSkinlet::updateGraphicNode( QskSkinlet::updateGraphicNode(
skinnable->owningControl(), graphicNode, skinnable->owningControl(), graphicNode,
graphic, m_colorFilter, labelRect, alignment ); graphic, m_data->colorFilter, labelRect, alignment );
nextNode = nextNode->nextSibling(); nextNode = nextNode->nextSibling();
} }
@ -328,11 +358,11 @@ QVariant QskScaleRenderer::labelAt( qreal pos ) const
QSizeF QskScaleRenderer::boundingLabelSize() const QSizeF QskScaleRenderer::boundingLabelSize() const
{ {
const auto ticks = m_tickmarks.majorTicks(); const auto ticks = m_data->tickmarks.majorTicks();
if ( ticks.isEmpty() ) if ( ticks.isEmpty() )
return QSizeF( 0.0, 0.0 ); return QSizeF( 0.0, 0.0 );
const QFontMetricsF fm( m_font ); const QFontMetricsF fm( m_data->font );
qreal maxWidth = 0.0; qreal maxWidth = 0.0;
const qreal h = fm.height(); const qreal h = fm.height();

View File

@ -7,16 +7,18 @@
#define QSK_SCALE_RENDERER_H #define QSK_SCALE_RENDERER_H
#include "QskGlobal.h" #include "QskGlobal.h"
#include "QskIntervalF.h"
#include "QskScaleTickmarks.h"
#include "QskTextColors.h"
#include "QskColorFilter.h"
#include <qnamespace.h> #include <qnamespace.h>
#include <qfont.h> #include <qfont.h>
#include <qcolor.h> #include <qcolor.h>
#include <memory>
class QskSkinnable; class QskSkinnable;
class QskIntervalF;
class QskScaleTickmarks;
class QskTextColors;
class QskColorFilter;
class QSGNode; class QSGNode;
class QVariant; class QVariant;
@ -25,6 +27,9 @@ class QRectF;
class QSK_EXPORT QskScaleRenderer class QSK_EXPORT QskScaleRenderer
{ {
public: public:
QskScaleRenderer();
~QskScaleRenderer();
void setOrientation( Qt::Orientation ); void setOrientation( Qt::Orientation );
void setBoundaries( const QskIntervalF& ); void setBoundaries( const QskIntervalF& );
@ -54,18 +59,8 @@ class QSK_EXPORT QskScaleRenderer
private: private:
Q_DISABLE_COPY( QskScaleRenderer ) Q_DISABLE_COPY( QskScaleRenderer )
Qt::Orientation m_orientation = Qt::Horizontal; class PrivateData;
std::unique_ptr< PrivateData > m_data;
QskIntervalF m_boundaries;
QskScaleTickmarks m_tickmarks;
QColor m_tickColor = Qt::black;
qreal m_tickWidth = 1.0;
QFont m_font;
QskTextColors m_textColors;
QskColorFilter m_colorFilter;
}; };
#endif #endif