mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#6245 Shift labels to left side for negative tornado plot bars
This commit is contained in:
parent
eee30f3d1d
commit
7241132256
@ -92,8 +92,24 @@ public:
|
|||||||
class RiuBarChartScaleDraw : public QwtScaleDraw
|
class RiuBarChartScaleDraw : public QwtScaleDraw
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RiuBarChartScaleDraw( const std::map<double, std::pair<QwtScaleDiv::TickType, QString>>& posTickTypeAndTexts,
|
struct RiuBarChartTick
|
||||||
int labelFontPointSize )
|
{
|
||||||
|
RiuBarChartTick() = default;
|
||||||
|
RiuBarChartTick( const RiuBarChartTick& rhs ) = default;
|
||||||
|
RiuBarChartTick( QwtScaleDiv::TickType tickType, const QString& label, bool oppositeSide = false )
|
||||||
|
: tickType( tickType )
|
||||||
|
, label( label )
|
||||||
|
, oppositeSide( oppositeSide )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QwtScaleDiv::TickType tickType;
|
||||||
|
QString label;
|
||||||
|
bool oppositeSide;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
RiuBarChartScaleDraw( const std::map<double, RiuBarChartTick>& posTickTypeAndTexts, int labelFontPointSize )
|
||||||
: m_posTickTypeAndTexts( posTickTypeAndTexts )
|
: m_posTickTypeAndTexts( posTickTypeAndTexts )
|
||||||
, m_labelFontPointSize( labelFontPointSize )
|
, m_labelFontPointSize( labelFontPointSize )
|
||||||
{
|
{
|
||||||
@ -108,15 +124,15 @@ public:
|
|||||||
|
|
||||||
for ( const auto& posTickTypeText : m_posTickTypeAndTexts )
|
for ( const auto& posTickTypeText : m_posTickTypeAndTexts )
|
||||||
{
|
{
|
||||||
if ( posTickTypeText.second.first == QwtScaleDiv::MediumTick )
|
if ( posTickTypeText.second.tickType == QwtScaleDiv::MediumTick )
|
||||||
{
|
{
|
||||||
hasMediumTickText = true;
|
hasMediumTickText = true;
|
||||||
medTickMaxTextSize = std::max( posTickTypeText.second.second.size(), medTickMaxTextSize );
|
medTickMaxTextSize = std::max( posTickTypeText.second.label.size(), medTickMaxTextSize );
|
||||||
}
|
}
|
||||||
if ( posTickTypeText.second.first == QwtScaleDiv::MinorTick )
|
if ( posTickTypeText.second.tickType == QwtScaleDiv::MinorTick )
|
||||||
{
|
{
|
||||||
hasMinorTickText = true;
|
hasMinorTickText = true;
|
||||||
minTickMaxTextSize = std::max( posTickTypeText.second.second.size(), minTickMaxTextSize );
|
minTickMaxTextSize = std::max( posTickTypeText.second.label.size(), minTickMaxTextSize );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,43 +155,43 @@ public:
|
|||||||
|
|
||||||
QwtText label( double v ) const override
|
QwtText label( double v ) const override
|
||||||
{
|
{
|
||||||
auto posTypeTextPairIt = m_posTickTypeAndTexts.find( v );
|
auto posTickIt = m_posTickTypeAndTexts.find( v );
|
||||||
if ( posTypeTextPairIt != m_posTickTypeAndTexts.end() )
|
if ( posTickIt != m_posTickTypeAndTexts.end() )
|
||||||
{
|
{
|
||||||
if ( this->alignment() == BottomScale )
|
if ( this->alignment() == BottomScale )
|
||||||
{
|
{
|
||||||
if ( posTypeTextPairIt->second.first == QwtScaleDiv::MediumTick )
|
if ( posTickIt->second.tickType == QwtScaleDiv::MediumTick )
|
||||||
{
|
{
|
||||||
return createLabelFromString( m_medLineBreak + posTypeTextPairIt->second.second );
|
return createLabelFromString( m_medLineBreak + posTickIt->second.label );
|
||||||
}
|
}
|
||||||
else if ( posTypeTextPairIt->second.first == QwtScaleDiv::MajorTick )
|
else if ( posTickIt->second.tickType == QwtScaleDiv::MajorTick )
|
||||||
{
|
{
|
||||||
return createLabelFromString( m_majLineBreak + posTypeTextPairIt->second.second );
|
return createLabelFromString( m_majLineBreak + posTickIt->second.label );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return createLabelFromString( posTypeTextPairIt->second.second );
|
return createLabelFromString( posTickIt->second.label );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( this->alignment() == LeftScale )
|
else if ( this->alignment() == LeftScale )
|
||||||
{
|
{
|
||||||
if ( posTypeTextPairIt->second.first == QwtScaleDiv::MediumTick )
|
if ( posTickIt->second.tickType == QwtScaleDiv::MediumTick )
|
||||||
{
|
{
|
||||||
return createLabelFromString( posTypeTextPairIt->second.second + m_medSpacing );
|
return createLabelFromString( posTickIt->second.label + m_medSpacing );
|
||||||
}
|
}
|
||||||
else if ( posTypeTextPairIt->second.first == QwtScaleDiv::MajorTick )
|
else if ( posTickIt->second.tickType == QwtScaleDiv::MajorTick )
|
||||||
{
|
{
|
||||||
return createLabelFromString( posTypeTextPairIt->second.second + m_majSpacing );
|
return createLabelFromString( posTickIt->second.label + m_majSpacing );
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return createLabelFromString( posTypeTextPairIt->second.second );
|
return createLabelFromString( posTickIt->second.label );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return createLabelFromString( posTypeTextPairIt->second.second );
|
return createLabelFromString( posTickIt->second.label );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -184,8 +200,25 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override to draw text labels at medium and minor ticks also
|
QPoint translateToOppositeSide( QPainter* painter, double value ) const
|
||||||
|
{
|
||||||
|
QwtText lbl = tickLabel( painter->font(), value );
|
||||||
|
QSizeF labelSize = lbl.textSize( painter->font() );
|
||||||
|
QPointF localLabelPos = labelPosition( value ) - pos();
|
||||||
|
|
||||||
|
// Only support shifting labels for horizontal bars.
|
||||||
|
if ( alignment() == RightScale )
|
||||||
|
{
|
||||||
|
return QPoint( -2 * localLabelPos.x() - labelSize.width(), 0 );
|
||||||
|
}
|
||||||
|
else if ( alignment() == LeftScale )
|
||||||
|
{
|
||||||
|
return QPoint( 2 * localLabelPos.x() + labelSize.width(), 0 );
|
||||||
|
}
|
||||||
|
return QPoint( 0, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override to draw text labels at medium and minor ticks also
|
||||||
void draw( QPainter* painter, const QPalette& palette ) const override
|
void draw( QPainter* painter, const QPalette& palette ) const override
|
||||||
{
|
{
|
||||||
QwtScaleDraw::draw( painter, palette );
|
QwtScaleDraw::draw( painter, palette );
|
||||||
@ -200,7 +233,21 @@ public:
|
|||||||
for ( int i = 0; i < mediumTicks.count(); i++ )
|
for ( int i = 0; i < mediumTicks.count(); i++ )
|
||||||
{
|
{
|
||||||
const double v = mediumTicks[i];
|
const double v = mediumTicks[i];
|
||||||
if ( scaleDiv().contains( v ) ) drawLabel( painter, mediumTicks[i] );
|
if ( scaleDiv().contains( v ) )
|
||||||
|
{
|
||||||
|
auto it = m_posTickTypeAndTexts.find( v );
|
||||||
|
bool oppositeSide = it != m_posTickTypeAndTexts.end() ? it->second.oppositeSide : false;
|
||||||
|
if ( oppositeSide )
|
||||||
|
{
|
||||||
|
painter->save();
|
||||||
|
painter->translate( translateToOppositeSide( painter, v ) );
|
||||||
|
}
|
||||||
|
drawLabel( painter, mediumTicks[i] );
|
||||||
|
if ( oppositeSide )
|
||||||
|
{
|
||||||
|
painter->restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<double>& minorTicks = scaleDiv().ticks( QwtScaleDiv::MinorTick );
|
const QList<double>& minorTicks = scaleDiv().ticks( QwtScaleDiv::MinorTick );
|
||||||
@ -208,7 +255,22 @@ public:
|
|||||||
for ( int i = 0; i < minorTicks.count(); i++ )
|
for ( int i = 0; i < minorTicks.count(); i++ )
|
||||||
{
|
{
|
||||||
const double v = minorTicks[i];
|
const double v = minorTicks[i];
|
||||||
if ( scaleDiv().contains( v ) ) drawLabel( painter, minorTicks[i] );
|
if ( scaleDiv().contains( v ) )
|
||||||
|
{
|
||||||
|
auto it = m_posTickTypeAndTexts.find( v );
|
||||||
|
bool oppositeSide = it != m_posTickTypeAndTexts.end() ? it->second.oppositeSide : false;
|
||||||
|
if ( oppositeSide )
|
||||||
|
{
|
||||||
|
painter->save();
|
||||||
|
painter->translate( translateToOppositeSide( painter, v ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
drawLabel( painter, minorTicks[i] );
|
||||||
|
if ( oppositeSide )
|
||||||
|
{
|
||||||
|
painter->restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->restore();
|
painter->restore();
|
||||||
@ -219,7 +281,7 @@ protected:
|
|||||||
virtual void drawBackbone( QPainter* ) const override {}
|
virtual void drawBackbone( QPainter* ) const override {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<double, std::pair<QwtScaleDiv::TickType, QString>> m_posTickTypeAndTexts;
|
std::map<double, RiuBarChartTick> m_posTickTypeAndTexts;
|
||||||
|
|
||||||
QString m_medLineBreak;
|
QString m_medLineBreak;
|
||||||
QString m_majLineBreak;
|
QString m_majLineBreak;
|
||||||
@ -285,8 +347,8 @@ void RiuGroupedBarChartBuilder::addBarChartToPlot( QwtPlot* plot, Qt::Orientatio
|
|||||||
|
|
||||||
std::map<QString, QVector<QPointF>> legendToBarPointsMap;
|
std::map<QString, QVector<QPointF>> legendToBarPointsMap;
|
||||||
|
|
||||||
std::map<double, std::pair<QwtScaleDiv::TickType, QString>> groupPositionedAxisTexts;
|
std::map<double, RiuBarChartScaleDraw::RiuBarChartTick> groupPositionedAxisTexts;
|
||||||
std::map<double, std::pair<QwtScaleDiv::TickType, QString>> positionedBarLabels;
|
std::map<double, RiuBarChartScaleDraw::RiuBarChartTick> positionedBarLabels;
|
||||||
|
|
||||||
QList<double> majTickPositions;
|
QList<double> majTickPositions;
|
||||||
QList<double> midTickPositions;
|
QList<double> midTickPositions;
|
||||||
@ -407,7 +469,7 @@ void RiuGroupedBarChartBuilder::addBarChartToPlot( QwtPlot* plot, Qt::Orientatio
|
|||||||
if( ttyp == QwtScaleDiv::MinorTick ) tickPos += 2e-4;
|
if( ttyp == QwtScaleDiv::MinorTick ) tickPos += 2e-4;
|
||||||
if( ttyp == QwtScaleDiv::MediumTick ) tickPos += 1e-4;
|
if( ttyp == QwtScaleDiv::MediumTick ) tickPos += 1e-4;
|
||||||
|
|
||||||
groupPositionedAxisTexts[tickPos] = { ttyp, tickText };
|
groupPositionedAxisTexts[tickPos] = RiuBarChartScaleDraw::RiuBarChartTick(ttyp, tickText, true);
|
||||||
|
|
||||||
groupTickPosList.push_back( tickPos );
|
groupTickPosList.push_back( tickPos );
|
||||||
};
|
};
|
||||||
@ -527,7 +589,8 @@ void RiuGroupedBarChartBuilder::addBarChartToPlot( QwtPlot* plot, Qt::Orientatio
|
|||||||
barPoints->push_back( {currentBarPosition, barDef.m_value} );
|
barPoints->push_back( {currentBarPosition, barDef.m_value} );
|
||||||
if ( !barDef.m_barText.isEmpty() )
|
if ( !barDef.m_barText.isEmpty() )
|
||||||
{
|
{
|
||||||
positionedBarLabels[currentBarPosition] = {QwtScaleDiv::MinorTick, barDef.m_barText};
|
positionedBarLabels[currentBarPosition] =
|
||||||
|
RiuBarChartScaleDraw::RiuBarChartTick( QwtScaleDiv::MinorTick, barDef.m_barText, barDef.m_value < 0.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increment the bar position for the next bar
|
// Increment the bar position for the next bar
|
||||||
|
Loading…
Reference in New Issue
Block a user