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

View File

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