mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-29 00:05:09 -04:00
190 lines
11 KiB
C++
190 lines
11 KiB
C++
/***************************************************************************
|
|
qgslayoutobject.cpp
|
|
-------------------
|
|
begin : June 2017
|
|
copyright : (C) 2017 by Nyall Dawson
|
|
email : nyall dot dawson at gmail dot com
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include <QPainter>
|
|
|
|
#include "qgslayout.h"
|
|
#include "qgslayoutrendercontext.h"
|
|
#include "qgslayoutreportcontext.h"
|
|
#include "qgslayoutobject.h"
|
|
|
|
|
|
QgsPropertiesDefinition QgsLayoutObject::sPropertyDefinitions;
|
|
|
|
void QgsLayoutObject::initPropertyDefinitions()
|
|
{
|
|
if ( !sPropertyDefinitions.isEmpty() )
|
|
return;
|
|
|
|
sPropertyDefinitions = QgsPropertiesDefinition
|
|
{
|
|
{ QgsLayoutObject::TestProperty, QgsPropertyDefinition( "dataDefinedProperty", QgsPropertyDefinition::DataTypeString, "invalid property", QString() ) },
|
|
{
|
|
QgsLayoutObject::PresetPaperSize, QgsPropertyDefinition( "dataDefinedPaperSize", QgsPropertyDefinition::DataTypeString, QObject::tr( "Paper size" ), QObject::tr( "string " ) + QLatin1String( "[<b>A5</b>|<b>A4</b>|<b>A3</b>|<b>A2</b>|<b>A1</b>|<b>A0</b>"
|
|
"<b>B5</b>|<b>B4</b>|<b>B3</b>|<b>B2</b>|<b>B1</b>|<b>B0</b>"
|
|
"<b>Legal</b>|<b>Ansi A</b>|<b>Ansi B</b>|<b>Ansi C</b>|<b>Ansi D</b>|<b>Ansi E</b>"
|
|
"<b>Arch A</b>|<b>Arch B</b>|<b>Arch C</b>|<b>Arch D</b>|<b>Arch E</b>|<b>Arch E1</b>]"
|
|
) )
|
|
},
|
|
{ QgsLayoutObject::PaperWidth, QgsPropertyDefinition( "dataDefinedPaperWidth", QObject::tr( "Page width" ), QgsPropertyDefinition::DoublePositive ) },
|
|
{ QgsLayoutObject::PaperHeight, QgsPropertyDefinition( "dataDefinedPaperHeight", QObject::tr( "Page height" ), QgsPropertyDefinition::DoublePositive ) },
|
|
{ QgsLayoutObject::NumPages, QgsPropertyDefinition( "dataDefinedNumPages", QObject::tr( "Number of pages" ), QgsPropertyDefinition::IntegerPositive ) },
|
|
{ QgsLayoutObject::PaperOrientation, QgsPropertyDefinition( "dataDefinedPaperOrientation", QgsPropertyDefinition::DataTypeString, QObject::tr( "Symbol size" ), QObject::tr( "string " ) + QLatin1String( "[<b>portrait</b>|<b>landscape</b>]" ) ) },
|
|
{ QgsLayoutObject::PageNumber, QgsPropertyDefinition( "dataDefinedPageNumber", QObject::tr( "Page number" ), QgsPropertyDefinition::IntegerPositive ) },
|
|
{ QgsLayoutObject::PositionX, QgsPropertyDefinition( "dataDefinedPositionX", QObject::tr( "Position (X)" ), QgsPropertyDefinition::Double ) },
|
|
{ QgsLayoutObject::PositionY, QgsPropertyDefinition( "dataDefinedPositionY", QObject::tr( "Position (Y)" ), QgsPropertyDefinition::Double ) },
|
|
{ QgsLayoutObject::ItemWidth, QgsPropertyDefinition( "dataDefinedWidth", QObject::tr( "Width" ), QgsPropertyDefinition::DoublePositive ) },
|
|
{ QgsLayoutObject::ItemHeight, QgsPropertyDefinition( "dataDefinedHeight", QObject::tr( "Height" ), QgsPropertyDefinition::DoublePositive ) },
|
|
{ QgsLayoutObject::ItemRotation, QgsPropertyDefinition( "dataDefinedRotation", QObject::tr( "Rotation angle" ), QgsPropertyDefinition::Rotation ) },
|
|
{ QgsLayoutObject::Transparency, QgsPropertyDefinition( "dataDefinedTransparency", QObject::tr( "Transparency" ), QgsPropertyDefinition::Opacity ) },
|
|
{ QgsLayoutObject::Opacity, QgsPropertyDefinition( "dataDefinedOpacity", QObject::tr( "Opacity" ), QgsPropertyDefinition::Opacity ) },
|
|
{ QgsLayoutObject::BlendMode, QgsPropertyDefinition( "dataDefinedBlendMode", QObject::tr( "Blend mode" ), QgsPropertyDefinition::BlendMode ) },
|
|
{ QgsLayoutObject::ExcludeFromExports, QgsPropertyDefinition( "dataDefinedExcludeExports", QObject::tr( "Exclude item from exports" ), QgsPropertyDefinition::Boolean ) },
|
|
{ QgsLayoutObject::FrameColor, QgsPropertyDefinition( "dataDefinedFrameColor", QObject::tr( "Frame color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::BackgroundColor, QgsPropertyDefinition( "dataDefinedBackgroundColor", QObject::tr( "Background color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::MapRotation, QgsPropertyDefinition( "dataDefinedMapRotation", QObject::tr( "Map rotation" ), QgsPropertyDefinition::Rotation ) },
|
|
{ QgsLayoutObject::MapScale, QgsPropertyDefinition( "dataDefinedMapScale", QObject::tr( "Map scale" ), QgsPropertyDefinition::DoublePositive ) },
|
|
{ QgsLayoutObject::MapXMin, QgsPropertyDefinition( "dataDefinedMapXMin", QObject::tr( "Extent minimum X" ), QgsPropertyDefinition::Double ) },
|
|
{ QgsLayoutObject::MapYMin, QgsPropertyDefinition( "dataDefinedMapYMin", QObject::tr( "Extent minimum Y" ), QgsPropertyDefinition::Double ) },
|
|
{ QgsLayoutObject::MapXMax, QgsPropertyDefinition( "dataDefinedMapXMax", QObject::tr( "Extent maximum X" ), QgsPropertyDefinition::Double ) },
|
|
{ QgsLayoutObject::MapYMax, QgsPropertyDefinition( "dataDefinedMapYMax", QObject::tr( "Extent maximum Y" ), QgsPropertyDefinition::Double ) },
|
|
{ QgsLayoutObject::MapAtlasMargin, QgsPropertyDefinition( "dataDefinedMapAtlasMargin", QObject::tr( "Atlas margin" ), QgsPropertyDefinition::DoublePositive ) },
|
|
{ QgsLayoutObject::MapLayers, QgsPropertyDefinition( "dataDefinedMapLayers", QgsPropertyDefinition::DataTypeString, QObject::tr( "Symbol size" ), tr( "list of map layer names separated by | characters" ) ) },
|
|
{ QgsLayoutObject::MapStylePreset, QgsPropertyDefinition( "dataDefinedMapStylePreset", QgsPropertyDefinition::DataTypeString, QObject::tr( "Symbol size" ), tr( "list of map layer names separated by | characters" ) ) },
|
|
{ QgsLayoutObject::PictureSource, QgsPropertyDefinition( "dataDefinedSource", QObject::tr( "Picture source (URL)" ), QgsPropertyDefinition::String ) },
|
|
{ QgsLayoutObject::SourceUrl, QgsPropertyDefinition( "dataDefinedSourceUrl", QObject::tr( "Source URL" ), QgsPropertyDefinition::String ) },
|
|
{ QgsLayoutObject::PictureSvgBackgroundColor, QgsPropertyDefinition( "dataDefinedSvgBackgroundColor", QObject::tr( "SVG background color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::PictureSvgStrokeColor, QgsPropertyDefinition( "dataDefinedSvgStrokeColor", QObject::tr( "SVG stroke color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::PictureSvgStrokeWidth, QgsPropertyDefinition( "dataDefinedSvgStrokeWidth", QObject::tr( "SVG stroke width" ), QgsPropertyDefinition::StrokeWidth ) },
|
|
{ QgsLayoutObject::LegendTitle, QgsPropertyDefinition( "dataDefinedLegendTitle", QObject::tr( "Legend title" ), QgsPropertyDefinition::String ) },
|
|
{ QgsLayoutObject::LegendColumnCount, QgsPropertyDefinition( "dataDefinedLegendColumns", QObject::tr( "Number of columns" ), QgsPropertyDefinition::IntegerPositiveGreaterZero ) },
|
|
{ QgsLayoutObject::ScalebarFillColor, QgsPropertyDefinition( "dataDefinedScalebarFill", QObject::tr( "Fill color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::ScalebarFillColor2, QgsPropertyDefinition( "dataDefinedScalebarFill2", QObject::tr( "Secondary fill color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::ScalebarLineColor, QgsPropertyDefinition( "dataDefinedScalebarLineColor", QObject::tr( "Line color" ), QgsPropertyDefinition::ColorWithAlpha ) },
|
|
{ QgsLayoutObject::ScalebarLineWidth, QgsPropertyDefinition( "dataDefinedScalebarLineWidth", QObject::tr( "Line width" ), QgsPropertyDefinition::StrokeWidth ) },
|
|
};
|
|
}
|
|
|
|
const QgsPropertiesDefinition &QgsLayoutObject::propertyDefinitions()
|
|
{
|
|
QgsLayoutObject::initPropertyDefinitions();
|
|
return sPropertyDefinitions;
|
|
}
|
|
|
|
QgsLayoutObject::QgsLayoutObject( QgsLayout *layout )
|
|
: QObject( nullptr )
|
|
, mLayout( layout )
|
|
{
|
|
initPropertyDefinitions();
|
|
|
|
if ( mLayout )
|
|
{
|
|
connect( mLayout, &QgsLayout::refreshed, this, &QgsLayoutObject::refresh );
|
|
connect( &mLayout->reportContext(), &QgsLayoutReportContext::changed, this, &QgsLayoutObject::refresh );
|
|
}
|
|
}
|
|
|
|
const QgsLayout *QgsLayoutObject::layout() const
|
|
{
|
|
return mLayout.data();
|
|
}
|
|
|
|
QgsLayout *QgsLayoutObject::layout()
|
|
{
|
|
return mLayout.data();
|
|
}
|
|
|
|
void QgsLayoutObject::setCustomProperty( const QString &key, const QVariant &value )
|
|
{
|
|
mCustomProperties.setValue( key, value );
|
|
}
|
|
|
|
QVariant QgsLayoutObject::customProperty( const QString &key, const QVariant &defaultValue ) const
|
|
{
|
|
return mCustomProperties.value( key, defaultValue );
|
|
}
|
|
|
|
void QgsLayoutObject::removeCustomProperty( const QString &key )
|
|
{
|
|
mCustomProperties.remove( key );
|
|
}
|
|
|
|
QStringList QgsLayoutObject::customProperties() const
|
|
{
|
|
return mCustomProperties.keys();
|
|
}
|
|
|
|
QgsExpressionContext QgsLayoutObject::createExpressionContext() const
|
|
{
|
|
if ( mLayout )
|
|
{
|
|
return mLayout->createExpressionContext();
|
|
}
|
|
else
|
|
{
|
|
return QgsExpressionContext() << QgsExpressionContextUtils::globalScope();
|
|
}
|
|
}
|
|
|
|
bool QgsLayoutObject::writeObjectPropertiesToElement( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext & ) const
|
|
{
|
|
if ( parentElement.isNull() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//create object element
|
|
QDomElement objectElement = document.createElement( QStringLiteral( "LayoutObject" ) );
|
|
|
|
QDomElement ddPropsElement = document.createElement( QStringLiteral( "dataDefinedProperties" ) );
|
|
mDataDefinedProperties.writeXml( ddPropsElement, sPropertyDefinitions );
|
|
objectElement.appendChild( ddPropsElement );
|
|
|
|
//custom properties
|
|
mCustomProperties.writeXml( objectElement, document );
|
|
|
|
parentElement.appendChild( objectElement );
|
|
return true;
|
|
}
|
|
|
|
bool QgsLayoutObject::readObjectPropertiesFromElement( const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext & )
|
|
{
|
|
Q_UNUSED( document );
|
|
if ( parentElement.isNull() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
QDomNodeList objectNodeList = parentElement.elementsByTagName( QStringLiteral( "LayoutObject" ) );
|
|
if ( objectNodeList.size() < 1 )
|
|
{
|
|
return false;
|
|
}
|
|
QDomElement objectElement = objectNodeList.at( 0 ).toElement();
|
|
|
|
QDomNode propsNode = objectElement.namedItem( QStringLiteral( "dataDefinedProperties" ) );
|
|
if ( !propsNode.isNull() )
|
|
{
|
|
mDataDefinedProperties.readXml( propsNode.toElement(), sPropertyDefinitions );
|
|
}
|
|
|
|
//custom properties
|
|
mCustomProperties.readXml( objectElement );
|
|
|
|
return true;
|
|
}
|