22using namespace Qt::StringLiterals;
43 QVariant input = value;
44 if ( !input.isValid() )
52 if ( input.typeId() == QMetaType::Type::QVariantList )
54 const QVariantList list = input.toList();
55 for (
const QVariant &item : list )
57 if ( item.typeId() != QMetaType::Type::QVariantMap )
62 const QVariantMap map = item.toMap();
63 if ( !map.contains( u
"extent"_s ) || !map.contains( u
"max_zoom"_s ) )
70 else if ( input.typeId() == QMetaType::Type::QString )
72 const QStringList regionStrings = input.toString().split(
"::|::"_L1 );
73 QList<QgsTileExtentMaxZoomRegion> regions;
74 regions.reserve( regionStrings.size() );
75 for (
const QString ®ionString : regionStrings )
77 const int sepPos = regionString.indexOf(
':' );
81 const QString zoomPart = regionString.left( sepPos );
83 ( void ) zoomPart.toInt( &ok );
87 const QString extentPart = regionString.mid( sepPos + 1 );
88 if ( extentPart.isEmpty() )
103 QStringList listItems;
104 listItems.reserve( regions.size() );
107 const QString regionExtentString = u
"'%1, %3, %2, %4 [%5]'"_s.arg(
112 region.extent.crs().authid()
114 listItems.append( u
"{'extent': %1, 'max_zoom': %2}"_s.arg( regionExtentString ).arg( region.maxZoom ) );
117 return u
"[%1]"_s.arg( listItems.join(
", "_L1 ) );
127 QStringList stringListItems;
128 stringListItems.reserve( regions.size() );
131 const QString regionExtentString = u
"%1,%3,%2,%4 [%5]"_s.arg(
136 region.extent.crs().authid()
138 stringListItems.append( u
"%1:%2"_s.arg( region.maxZoom ).arg( regionExtentString ) );
141 return stringListItems.join(
"::|::"_L1 );
150 QVariantList jsonListItems;
151 jsonListItems.reserve( regions.size() );
154 const QString regionExtentString = u
"'%1,%3,%2,%4 [%5]'"_s.arg(
159 region.extent.crs().authid()
161 QVariantMap regionMap;
162 regionMap[u
"extent"_s] = regionExtentString;
163 regionMap[u
"max_zoom"_s] = region.maxZoom;
164 jsonListItems.append( regionMap );
167 return jsonListItems;
175 if ( variant.typeId() == QMetaType::Type::QVariantList )
177 QList<QgsTileExtentMaxZoomRegion> regions;
178 const QVariantList list = variant.toList();
179 regions.reserve( list.size() );
181 for (
const QVariant &item : list )
183 if ( item.typeId() == QMetaType::Type::QVariantMap )
185 regions.append( regionFromVariantMap( item.toMap(), context ) );
190 else if ( variant.typeId() == QMetaType::Type::QString )
192 const QStringList regionStrings = variant.toString().split(
"::|::"_L1 );
193 QList<QgsTileExtentMaxZoomRegion> regions;
194 regions.reserve( regionStrings.size() );
195 for (
const QString ®ionString : regionStrings )
201 regions.append( region );
211 res.reserve( regions.size() );
214 res.append( regionToVariantMap( region ) );
221 if ( variant.userType() == QVariant::Map )
223 return regionFromVariantMap( variant.toMap(), context );
225 else if ( variant.userType() == QVariant::String )
227 const QString regionString = variant.toString();
228 const int sepPos = regionString.indexOf(
':' );
232 const QString zoomPart = regionString.left( sepPos );
233 const QString extentPart = regionString.mid( sepPos + 1 );
235 region.
maxZoom = zoomPart.toInt();
246 int effectiveMaxZoom = -1;
250 if ( region.extent.intersects( tileExtent ) )
252 effectiveMaxZoom = std::max( effectiveMaxZoom, region.maxZoom );
256 return ( effectiveMaxZoom >= 0 ) ? effectiveMaxZoom : defaultMaxZoom;
262 const QString regionExtentString = u
"%1,%3,%2,%4 [%5]"_s.arg(
270 map.insert( u
"extent"_s, regionExtentString );
271 map.insert( u
"max_zoom"_s, region.
maxZoom );
277 QgsTileExtentMaxZoomRegion region;
278 region.
maxZoom = map.value( u
"max_zoom"_s, 0 ).toInt();
282 region.
extent = QgsReferencedRectangle( rect, crs );
@ Optional
Parameter is optional.
Represents a coordinate reference system (CRS).
Contains information about the context in which a processing algorithm is executed.
QVariant defaultValue() const
Returns the default value for the parameter.
Qgis::ProcessingParameterFlags mFlags
Parameter flags.
QString description() const
Returns the description for the parameter.
QgsProcessingParameterDefinition(const QString &name, const QString &description=QString(), const QVariant &defaultValue=QVariant(), bool optional=false, const QString &help=QString())
Constructor for QgsProcessingParameterDefinition.
QString name() const
Returns the name of the parameter.
QList< QgsTileExtentMaxZoomRegion > parameterAsRegionList(const QVariant &variant, QgsProcessingContext &context) const
Converts a parameter variant value to a list of QgsTileExtentMaxZoomRegion objects.
QString valueAsPythonString(const QVariant &value, QgsProcessingContext &context) const override
Returns a string version of the parameter input value, which is suitable for use as an input paramete...
QString valueAsString(const QVariant &value, QgsProcessingContext &context, bool &ok) const override
Returns a string version of the parameter input value (if possible).
QString type() const override
Unique parameter type name.
bool checkValueIsAcceptable(const QVariant &input, QgsProcessingContext *context=nullptr) const override
Checks whether the specified input value is acceptable for the parameter.
static QVariant toVariant(const QList< QgsTileExtentMaxZoomRegion > ®ions)
Converts a list of regions to variant value.
static QString typeName()
Returns the type name for the parameter class.
QgsProcessingParameterTileExtentMaxZoomList(const QString &name, const QString &description=QString(), const QVariant &defaultValue=QVariant(), bool optional=false)
Constructor for QgsProcessingParameterTileExtentMaxZoomList.
QgsProcessingParameterTileExtentMaxZoomList * clone() const override
Creates a clone of the parameter definition.
QVariant valueAsJsonObject(const QVariant &value, QgsProcessingContext &context) const override
Returns a version of the parameter input value, which is suitable for use in a JSON object.
QgsTileExtentMaxZoomRegion regionFromVariant(const QVariant &variant, QgsProcessingContext &context) const
Converts a variant to a region value.
static int maxZoomForTile(const QgsRectangle &tileExtent, const QList< QgsTileExtentMaxZoomRegion > ®ions, int defaultMaxZoom)
Evaluates the effective maximum zoom level for a given tileExtent.
static QgsRectangle parameterAsExtent(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Evaluates the parameter with matching definition to a rectangular extent.
static QgsCoordinateReferenceSystem parameterAsExtentCrs(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Returns the coordinate reference system associated with an extent parameter value.
A rectangle specified with double values.
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsRectangle with associated coordinate reference system.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Represents a spatial region paired with a custom maximum zoom level.
int maxZoom
Maximum zoom level applied within this extent.
QgsReferencedRectangle extent
Bounding box extent and associated CRS.