Kaydet (Commit) 99226f34 authored tarafından Jochen Nitschke's avatar Jochen Nitschke

try auto rotate tick labels only when useful tdf#99883

By default we try to fit as many tick labels as possible on an axis.
One way is (auto) rotating the labels at 45 degrees.

But rotating only works for horizontal axes with horizontal text or
vertical axes with vertical text, else rotated tick labels need more space.

Join the check for this prerequisite with isAutoStaggeringOfLabelsAllowed.

while here make isAutoStaggeringOfLabelsAllowed local
and wrap stuff in anonymous namespaces

Change-Id: I5784d0e5aa42ff90927e19d0bd2c6fed488d39f4
Reviewed-on: https://gerrit.libreoffice.org/25792Reviewed-by: 's avatarJochen Nitschke <j.nitschke+logerrit@ok.de>
Tested-by: 's avatarJochen Nitschke <j.nitschke+logerrit@ok.de>
üst ffac8e3a
......@@ -497,20 +497,21 @@ bool VCartesianAxis::isBreakOfLabelsAllowed(
//break only for horizontal axis
return bIsHorizontalAxis;
}
namespace{
bool VCartesianAxis::isAutoStaggeringOfLabelsAllowed(
const AxisLabelProperties& rAxisLabelProperties, bool bIsHorizontalAxis, bool bIsVerticalAxis )
bool canAutoAdjustLabelPlacement(
const AxisLabelProperties& rAxisLabelProperties, bool bIsHorizontalAxis, bool bIsVerticalAxis)
{
if( rAxisLabelProperties.eStaggering != STAGGER_AUTO )
return false;
// joined prerequisite checks for auto rotate and auto stagger
if( rAxisLabelProperties.bOverlapAllowed )
return false;
if( rAxisLabelProperties.bLineBreakAllowed ) //auto line break or auto staggering, doing both automatisms they may conflict...
if( rAxisLabelProperties.bLineBreakAllowed ) // auto line break may conflict with...
return false;
if( !::rtl::math::approxEqual( rAxisLabelProperties.fRotationAngleDegree, 0.0 ) )
return false;
//automatic staggering only for horizontal axis with horizontal text
//or vertical axis with vertical text
// automatic adjusting labels only works for
// horizontal axis with horizontal text
// or vertical axis with vertical text
if( bIsHorizontalAxis )
return !rAxisLabelProperties.bStackCharacters;
if( bIsVerticalAxis )
......@@ -518,6 +519,18 @@ bool VCartesianAxis::isAutoStaggeringOfLabelsAllowed(
return false;
}
bool isAutoStaggeringOfLabelsAllowed(
const AxisLabelProperties& rAxisLabelProperties, bool bIsHorizontalAxis, bool bIsVerticalAxis )
{
if( rAxisLabelProperties.eStaggering != STAGGER_AUTO )
return false;
return canAutoAdjustLabelPlacement(rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis);
}
// make clear that we check for auto rotation prerequisites
const auto& isAutoRotatingOfLabelsAllowed = canAutoAdjustLabelPlacement;
} // namespace
void VCartesianAxis::createAllTickInfosFromComplexCategories( TickInfoArraysType& rAllTickInfos, bool bShiftedPosition )
{
//no minor tickmarks will be generated!
......@@ -827,7 +840,8 @@ bool VCartesianAxis::createTextShapes(
{
// Compatibility option: starting from LibreOffice 5.1 the rotated
// layout is preferred to staggering for axis labels.
if( m_aAxisProperties.m_bTryStaggeringFirst || !(::rtl::math::approxEqual( rAxisLabelProperties.fRotationAngleDegree, 0.0 ) ) )
if( !isAutoRotatingOfLabelsAllowed(rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis)
|| m_aAxisProperties.m_bTryStaggeringFirst )
{
bIsStaggered = true;
rAxisLabelProperties.eStaggering = STAGGER_EVEN;
......@@ -844,7 +858,7 @@ bool VCartesianAxis::createTextShapes(
if (bOverlapsAfterAutoStagger)
{
// Staggering didn't solve the overlap.
if( !rAxisLabelProperties.bOverlapAllowed && ::rtl::math::approxEqual( rAxisLabelProperties.fRotationAngleDegree, 0.0 ) )
if( isAutoRotatingOfLabelsAllowed(rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis) )
{
// Try auto-rotating the labels at 45 degrees and
// start over. This rotation angle will be stored for
......@@ -986,7 +1000,7 @@ bool VCartesianAxis::createTextShapesSimple(
if( doesOverlap( pLastVisibleNeighbourTickInfo->xTextShape, pTickInfo->xTextShape, rAxisLabelProperties.fRotationAngleDegree ) )
{
// It overlaps.
if( !rAxisLabelProperties.bOverlapAllowed && ::rtl::math::approxEqual( rAxisLabelProperties.fRotationAngleDegree, 0.0 ) )
if( isAutoRotatingOfLabelsAllowed(rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis) )
{
// Try auto-rotating the labels at 45 degrees and
// start over. This rotation angle will be stored for
......
......@@ -146,13 +146,6 @@ private: //methods
void doStaggeringOfLabels( const AxisLabelProperties& rAxisLabelProperties
, TickFactory2D* pTickFactory2D );
/**
* @return true if we can try to stagger labels in order to avoid
* overlaps, otherwise false.
*/
static bool isAutoStaggeringOfLabelsAllowed(
const AxisLabelProperties& rAxisLabelProperties, bool bIsHorizontalAxis, bool bIsVerticalAxis );
/**
* @return true if we can break a single line label text into multiple
* lines for better fitting, otherwise false.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment