mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
Merge pull request #4389 from nyalldawson/scalebar
Refactor scalebar renderer, split from composer
This commit is contained in:
commit
fea6bff707
1
doc/CMakeLists.txt
Normal file → Executable file
1
doc/CMakeLists.txt
Normal file → Executable file
@ -66,6 +66,7 @@ IF(WITH_APIDOC)
|
||||
${CMAKE_SOURCE_DIR}/src/core/pal
|
||||
${CMAKE_SOURCE_DIR}/src/core/processing
|
||||
${CMAKE_SOURCE_DIR}/src/core/raster
|
||||
${CMAKE_SOURCE_DIR}/src/core/scalebar
|
||||
${CMAKE_SOURCE_DIR}/src/core/symbology-ng
|
||||
${CMAKE_SOURCE_DIR}/src/gui
|
||||
${CMAKE_SOURCE_DIR}/src/gui/auth
|
||||
|
@ -85,6 +85,7 @@ Renamed Classes {#qgis_api_break_3_0_renamed_classes}
|
||||
<tr><td>QgsCurveV2<td>QgsCurve
|
||||
<tr><td>QgsDbFilterProxyModel<td>QgsDatabaseFilterProxyModel
|
||||
<tr><td>QgsDiagramRendererV2<td>QgsDiagramRenderer
|
||||
<tr><td>QgsDoubleBoxBarStyle<td>QgsDoubleBoxScaleBarRenderer
|
||||
<tr><td>QgsEditorWidgetV2<td>QgsEditorWidget
|
||||
<tr><td>QgsEllipseSymbolLayerV2<td>QgsEllipseSymbolLayer
|
||||
<tr><td>QgsEllipseSymbolLayerV2Widget<td>QgsEllipseSymbolLayerWidget
|
||||
@ -115,6 +116,7 @@ Renamed Classes {#qgis_api_break_3_0_renamed_classes}
|
||||
<tr><td>QgsMultiCurveV2<td>QgsMultiCurve
|
||||
<tr><td>QgsMultiLineStringV2<td>QgsMultiLineString
|
||||
<tr><td>QgsMultiSurfaceV2<td>QgsMultiSurface
|
||||
<tr><td>QgsNumericScaleBarStyle<td>QgsNumericScaleBarRenderer
|
||||
<tr><td>QgsPointSequenceV2<td>QgsPointSequence
|
||||
<tr><td>QgsProperty<td>QgsProjectProperty
|
||||
<tr><td>QgsPropertyKey<td>QgsProjectPropertyKey
|
||||
@ -140,6 +142,7 @@ Renamed Classes {#qgis_api_break_3_0_renamed_classes}
|
||||
<tr><td>QgsRuleBasedRendererV2Count<td>QgsRuleBasedRendererCount
|
||||
<tr><td>QgsRuleBasedRendererV2Model<td>QgsRuleBasedRendererModel
|
||||
<tr><td>QgsRuleBasedRendererV2Widget<td>QgsRuleBasedRendererWidget
|
||||
<tr><td>QgsScaleBarStyle<td>QgsScaleBarRenderer
|
||||
<tr><td>QgsShapeburstFillSymbolLayerV2<td>QgsShapeburstFillSymbolLayer
|
||||
<tr><td>QgsShapeburstFillSymbolLayerV2Widget<td>QgsShapeburstFillSymbolLayerWidget
|
||||
<tr><td>QgsSimpleFillSymbolLayerV2<td>QgsSimpleFillSymbolLayer
|
||||
@ -148,6 +151,7 @@ Renamed Classes {#qgis_api_break_3_0_renamed_classes}
|
||||
<tr><td>QgsSimpleLineSymbolLayerV2Widget<td>QgsSimpleLineSymbolLayerWidget
|
||||
<tr><td>QgsSimpleMarkerSymbolLayerV2<td>QgsSimpleMarkerSymbolLayer
|
||||
<tr><td>QgsSimpleMarkerSymbolLayerV2Widget<td>QgsSimpleMarkerSymbolLayerWidget
|
||||
<tr><td>QgsSingleBoxScaleBarStyle<td>QgsSingleBoxScaleBarRenderer
|
||||
<tr><td>QgsSingleSymbolRendererV2<td>QgsSingleSymbolRenderer
|
||||
<tr><td>QgsSingleSymbolRendererV2Widget<td>QgsSingleSymbolRendererWidget
|
||||
<tr><td>QgsStyleV2<td>QgsStyle
|
||||
@ -171,6 +175,7 @@ Renamed Classes {#qgis_api_break_3_0_renamed_classes}
|
||||
<tr><td>QgsSymbolV2RenderContext<td>QgsSymbolRenderContext
|
||||
<tr><td>QgsSymbolV2SelectorDialog<td>QgsSymbolSelectorDialog
|
||||
<tr><td>QgsSymbolV2SelectorWidget<td>QgsSymbolSelectorWidget
|
||||
<tr><td>QgsTicksScaleBarStyle<td>QgsTicksScaleBarRenderer
|
||||
<tr><td>QgsVectorColorBrewerColorRampV2<td>QgsColorBrewerColorRamp
|
||||
<tr><td>QgsVectorColorBrewerColorRampV2Dialog<td>QgsColorBrewerColorRampDialog
|
||||
<tr><td>QgsVectorColorBrewerColorRampV2DialogBase<td>QgsColorBrewerColorRampDialogBase
|
||||
@ -684,9 +689,12 @@ QgsComposerObject::setDataDefinedProperty() instead.
|
||||
QgsComposerScaleBar {#qgis_api_break_3_0_QgsComposerScaleBar}
|
||||
-------------------
|
||||
|
||||
- The Alignment and SegmentSizeMode enums were moved to QgsScaleBarSettings
|
||||
- The ScaleBarUnits enum was removed. Use QgsUnitTypes::DistanceUnit instead.
|
||||
- setBrush() was removed. Use setFillColor() instead.
|
||||
- setBrush2() was removed. Use setFillColor2() instead.
|
||||
- setPen() was removed. Use setLineColor() and setLineWidth() instead.
|
||||
- segmentMillimeters() and firstLabelString() were removed.
|
||||
|
||||
|
||||
QgsComposerTable {#qgis_api_break_3_0_QgsComposerTable}
|
||||
@ -1837,6 +1845,11 @@ QgsRuntimeProfiler {#qgis_api_break_3_0_QgsRuntimeProfiler}
|
||||
|
||||
- This class is no longer a singleton and instance() has been removed. Instead use QgsApplication::profiler() to access an application-wide profiler.
|
||||
|
||||
QgsScaleBarStyle {#qgis_api_break_3_0_QgsScaleBarStyle}
|
||||
----------------
|
||||
|
||||
- The interface for QgsScaleBarStyle has been completely rewritten - any code using QgsScaleBarStyle or subclasses will need to update
|
||||
to the new draw() and calculateBoxSize() methods.
|
||||
|
||||
QgsServer {#qgis_api_break_3_0_QgsServer}
|
||||
----------
|
||||
|
1
python/CMakeLists.txt
Normal file → Executable file
1
python/CMakeLists.txt
Normal file → Executable file
@ -107,6 +107,7 @@ INCLUDE_DIRECTORIES(
|
||||
../src/core/layertree
|
||||
../src/core/processing
|
||||
../src/core/raster
|
||||
../src/core/scalebar
|
||||
../src/core/symbology-ng
|
||||
|
||||
../src/gui/raster
|
||||
|
@ -10,29 +10,6 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
|
||||
public:
|
||||
|
||||
enum Alignment
|
||||
{
|
||||
Left,
|
||||
Middle,
|
||||
Right
|
||||
};
|
||||
|
||||
enum ScaleBarUnits
|
||||
{
|
||||
MapUnits,
|
||||
Meters,
|
||||
Feet,
|
||||
NauticalMiles
|
||||
};
|
||||
|
||||
/** Modes for setting size for scale bar segments
|
||||
*/
|
||||
enum SegmentSizeMode
|
||||
{
|
||||
SegmentSizeFixed, /*!< Scale bar segment size is fixed to a map unit*/
|
||||
SegmentSizeFitWidth /*!< Scale bar segment size is calculated to fit a size range*/
|
||||
};
|
||||
|
||||
QgsComposerScaleBar( QgsComposition* composition /TransferThis/ );
|
||||
~QgsComposerScaleBar();
|
||||
|
||||
@ -58,7 +35,7 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
* @see maxBarWidth
|
||||
* @note added in QGIS 2.9
|
||||
*/
|
||||
SegmentSizeMode segmentSizeMode() const;
|
||||
QgsScaleBarSettings::SegmentSizeMode segmentSizeMode() const;
|
||||
|
||||
/** Sets the size mode for scale bar segments.
|
||||
* @param mode size mode
|
||||
@ -67,7 +44,7 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
* @see setMaxBarWidth
|
||||
* @note added in QGIS 2.9
|
||||
*/
|
||||
void setSegmentSizeMode( SegmentSizeMode mode );
|
||||
void setSegmentSizeMode( QgsScaleBarSettings::SegmentSizeMode mode );
|
||||
|
||||
/** Returns the minimum size (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the @link segmentSizeMode @endlink is set
|
||||
@ -212,8 +189,8 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
double height() const;
|
||||
void setHeight( double h );
|
||||
|
||||
void setComposerMap( const QgsComposerMap* map );
|
||||
const QgsComposerMap* composerMap();
|
||||
void setComposerMap( QgsComposerMap* map );
|
||||
QgsComposerMap* composerMap();
|
||||
|
||||
double labelBarSpace() const;
|
||||
void setLabelBarSpace( double space );
|
||||
@ -221,16 +198,14 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
double boxContentSpace() const;
|
||||
void setBoxContentSpace( double space );
|
||||
|
||||
double segmentMillimeters() const;
|
||||
|
||||
/** Left / Middle/ Right */
|
||||
Alignment alignment() const;
|
||||
QgsScaleBarSettings::Alignment alignment() const;
|
||||
|
||||
void setAlignment( Alignment a );
|
||||
void setAlignment( QgsScaleBarSettings::Alignment a );
|
||||
|
||||
ScaleBarUnits units() const;
|
||||
QgsUnitTypes::DistanceUnit units() const;
|
||||
|
||||
void setUnits( ScaleBarUnits u );
|
||||
void setUnits( QgsUnitTypes::DistanceUnit u );
|
||||
|
||||
/** Returns the join style used for drawing lines in the scalebar
|
||||
* @returns Join style for lines
|
||||
@ -263,7 +238,7 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
/** Apply default settings*/
|
||||
void applyDefaultSettings();
|
||||
/** Apply default size (scale bar 1/5 of map item width) */
|
||||
void applyDefaultSize( ScaleBarUnits u = Meters );
|
||||
void applyDefaultSize( QgsUnitTypes::DistanceUnit u = QgsUnitTypes::DistanceMeters );
|
||||
|
||||
/** Sets style by name
|
||||
@param styleName (untranslated) style name. Possibilities are: 'Single Box', 'Double Box', 'Line Ticks Middle', 'Line Ticks Down', 'Line Ticks Up', 'Numeric'*/
|
||||
@ -272,21 +247,12 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
/** Returns style name*/
|
||||
QString style() const;
|
||||
|
||||
/** Returns the x - positions of the segment borders (in item coordinates) and the width
|
||||
* of the segment
|
||||
* @note not available in Python bindings
|
||||
*/
|
||||
// void segmentPositions( QList<QPair<double, double> >& posWidthList ) const;
|
||||
|
||||
/** Sets box size suitable to content*/
|
||||
void adjustBoxSize();
|
||||
|
||||
/** Adjusts box size and calls QgsComposerItem::update()*/
|
||||
void update();
|
||||
|
||||
/** Returns string of first label (important for drawing, labeling, size calculation*/
|
||||
QString firstLabelString() const;
|
||||
|
||||
/** Stores state in Dom element
|
||||
* @param elem is Dom element corresponding to 'Composer' tag
|
||||
* @param doc Dom document
|
||||
@ -311,11 +277,4 @@ class QgsComposerScaleBar: QgsComposerItem
|
||||
void invalidateCurrentMap();
|
||||
virtual void refreshDataDefinedProperty( const QgsComposerObject::DataDefinedProperty property = QgsComposerObject::AllProperties, const QgsExpressionContext* context = nullptr );
|
||||
|
||||
protected:
|
||||
/** Calculates with of a segment in mm and stores it in mSegmentMillimeters*/
|
||||
void refreshSegmentMillimeters();
|
||||
|
||||
/** Returns diagonal of composer map in selected units (map units / meters / feet / nautical miles)*/
|
||||
double mapWidth() const;
|
||||
|
||||
};
|
||||
|
@ -1,13 +0,0 @@
|
||||
class QgsDoubleBoxScaleBarStyle: QgsScaleBarStyle
|
||||
{
|
||||
%TypeHeaderCode
|
||||
#include <qgsdoubleboxscalebarstyle.h>
|
||||
%End
|
||||
public:
|
||||
QgsDoubleBoxScaleBarStyle( const QgsComposerScaleBar* bar );
|
||||
~QgsDoubleBoxScaleBarStyle();
|
||||
|
||||
QString name() const;
|
||||
|
||||
void draw( QPainter* p, double xOffset = 0 ) const;
|
||||
};
|
@ -1,16 +0,0 @@
|
||||
class QgsNumericScaleBarStyle : QgsScaleBarStyle
|
||||
{
|
||||
%TypeHeaderCode
|
||||
#include <qgsnumericscalebarstyle.h>
|
||||
%End
|
||||
public:
|
||||
QgsNumericScaleBarStyle( QgsComposerScaleBar* bar );
|
||||
~QgsNumericScaleBarStyle();
|
||||
|
||||
QString name() const;
|
||||
|
||||
void draw( QPainter* p, double xOffset = 0 ) const;
|
||||
|
||||
//calculation of box size is different compared to segment based scale bars
|
||||
QRectF calculateBoxSize() const;
|
||||
};
|
@ -1,21 +0,0 @@
|
||||
/** \ingroup core
|
||||
* Abstraction of composer scale bar style. Subclasses draw themselves, have the
|
||||
possibility to implement custom labeling and calculate corresponding box size.
|
||||
*/
|
||||
class QgsScaleBarStyle
|
||||
{
|
||||
%TypeHeaderCode
|
||||
#include "qgsscalebarstyle.h"
|
||||
%End
|
||||
public:
|
||||
QgsScaleBarStyle( const QgsComposerScaleBar* bar );
|
||||
virtual ~QgsScaleBarStyle();
|
||||
|
||||
/** Draws the style
|
||||
@param p painter object
|
||||
@param xOffset offset to account for centered labeling*/
|
||||
virtual void draw( QPainter* p, double xOffset = 0 ) const = 0; //to do by every subclass
|
||||
virtual void drawLabels( QPainter* p ) const; //default implementation provided
|
||||
virtual QRectF calculateBoxSize() const; //default implementation provided
|
||||
virtual QString name() const = 0; //return name of the style
|
||||
};
|
@ -1,17 +0,0 @@
|
||||
class QgsSingleBoxScaleBarStyle : QgsScaleBarStyle
|
||||
{
|
||||
%TypeHeaderCode
|
||||
#include <qgssingleboxscalebarstyle.h>
|
||||
%End
|
||||
public:
|
||||
QgsSingleBoxScaleBarStyle( const QgsComposerScaleBar* bar );
|
||||
~QgsSingleBoxScaleBarStyle();
|
||||
|
||||
QString name() const;
|
||||
|
||||
/** Draw method
|
||||
@param p painter object
|
||||
@param xOffset x offset
|
||||
*/
|
||||
void draw( QPainter* p, double xOffset = 0 ) const;
|
||||
};
|
@ -1,26 +0,0 @@
|
||||
class QgsTicksScaleBarStyle: QgsScaleBarStyle
|
||||
{
|
||||
%TypeHeaderCode
|
||||
#include <qgsticksscalebarstyle.h>
|
||||
%End
|
||||
public:
|
||||
enum TickPosition
|
||||
{
|
||||
TicksUp,
|
||||
TicksDown,
|
||||
TicksMiddle
|
||||
};
|
||||
|
||||
QgsTicksScaleBarStyle( const QgsComposerScaleBar* bar );
|
||||
~QgsTicksScaleBarStyle();
|
||||
|
||||
QString name() const;
|
||||
|
||||
/** Draw method
|
||||
@param p painter object
|
||||
@param xOffset offset
|
||||
*/
|
||||
void draw( QPainter* p, double xOffset = 0 ) const;
|
||||
|
||||
void setTickPosition( TickPosition p );
|
||||
};
|
@ -231,13 +231,9 @@
|
||||
%Include composer/qgscomposertexttable.sip
|
||||
%Include composer/qgscomposerutils.sip
|
||||
%Include composer/qgscomposition.sip
|
||||
%Include composer/qgsdoubleboxscalebarstyle.sip
|
||||
%Include composer/qgslayoutmanager.sip
|
||||
%Include composer/qgsnumericscalebarstyle.sip
|
||||
%Include composer/qgspaperitem.sip
|
||||
%Include composer/qgsscalebarstyle.sip
|
||||
%Include composer/qgssingleboxscalebarstyle.sip
|
||||
%Include composer/qgsticksscalebarstyle.sip
|
||||
|
||||
|
||||
%Include diagram/qgsdiagram.sip
|
||||
%Include diagram/qgshistogramdiagram.sip
|
||||
@ -328,6 +324,13 @@
|
||||
%Include raster/qgssinglebandpseudocolorrenderer.sip
|
||||
%Include raster/qgshillshaderenderer.sip
|
||||
|
||||
%Include scalebar/qgsdoubleboxscalebarrenderer.sip
|
||||
%Include scalebar/qgsnumericscalebarrenderer.sip
|
||||
%Include scalebar/qgsscalebarrenderer.sip
|
||||
%Include scalebar/qgsscalebarsettings.sip
|
||||
%Include scalebar/qgssingleboxscalebarrenderer.sip
|
||||
%Include scalebar/qgsticksscalebarrenderer.sip
|
||||
|
||||
%Include symbology-ng/qgscolorbrewerpalette.sip
|
||||
%Include symbology-ng/qgscptcityarchive.sip
|
||||
%Include symbology-ng/qgsstyle.sip
|
||||
|
42
python/core/scalebar/qgsdoubleboxscalebarrenderer.sip
Normal file
42
python/core/scalebar/qgsdoubleboxscalebarrenderer.sip
Normal file
@ -0,0 +1,42 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsdoubleboxscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
class QgsDoubleBoxScaleBarRenderer: QgsScaleBarRenderer
|
||||
{
|
||||
%Docstring
|
||||
Double box with alternating colors.
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsdoubleboxscalebarrenderer.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
QgsDoubleBoxScaleBarRenderer();
|
||||
%Docstring
|
||||
Constructor for QgsDoubleBoxScaleBarRenderer.
|
||||
%End
|
||||
|
||||
virtual QString name() const;
|
||||
|
||||
virtual void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsdoubleboxscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
45
python/core/scalebar/qgsnumericscalebarrenderer.sip
Normal file
45
python/core/scalebar/qgsnumericscalebarrenderer.sip
Normal file
@ -0,0 +1,45 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsnumericscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
class QgsNumericScaleBarRenderer: QgsScaleBarRenderer
|
||||
{
|
||||
%Docstring
|
||||
A scale bar style that draws text in the form of '1:XXXXX'.
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsnumericscalebarrenderer.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
QgsNumericScaleBarRenderer();
|
||||
%Docstring
|
||||
Constructor for QgsNumericScaleBarRenderer.
|
||||
%End
|
||||
|
||||
virtual QString name() const;
|
||||
|
||||
virtual void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
virtual QSizeF calculateBoxSize( const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsnumericscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
116
python/core/scalebar/qgsscalebarrenderer.sip
Normal file
116
python/core/scalebar/qgsscalebarrenderer.sip
Normal file
@ -0,0 +1,116 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
class QgsScaleBarRenderer
|
||||
{
|
||||
%Docstring
|
||||
Abstract base class for scale bar renderers.
|
||||
|
||||
Scalebar renderer subclasses implement custom drawing logic, with the possibility to implement
|
||||
custom labeling.
|
||||
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsscalebarrenderer.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
struct ScaleBarContext
|
||||
{
|
||||
double segmentWidth;
|
||||
%Docstring
|
||||
Width of each individual segment (in millimeters)
|
||||
%End
|
||||
|
||||
QSizeF size;
|
||||
%Docstring
|
||||
Destination size for scalebar. This is used for scalebars which
|
||||
alter their appearance or alignment based on the desired scalebar
|
||||
size (e.g. correctly aligning text in a numeric scale bar).
|
||||
%End
|
||||
|
||||
double scale;
|
||||
%Docstring
|
||||
Scale denominator
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
QgsScaleBarRenderer();
|
||||
%Docstring
|
||||
Constructor for QgsScaleBarRenderer.
|
||||
%End
|
||||
virtual ~QgsScaleBarRenderer();
|
||||
|
||||
virtual QString name() const = 0;
|
||||
%Docstring
|
||||
Returns the unique name for this style.
|
||||
:rtype: str
|
||||
%End
|
||||
|
||||
virtual void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const = 0;
|
||||
%Docstring
|
||||
Draws the scalebar using the specified ``settings`` and ``scaleContext`` to a destination render ``context``.
|
||||
%End
|
||||
|
||||
virtual QSizeF calculateBoxSize( const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
%Docstring
|
||||
Calculates the required box size (in millimeters) for a scalebar using the specified ``settings`` and ``scaleContext``.
|
||||
:rtype: QSizeF
|
||||
%End
|
||||
|
||||
protected:
|
||||
|
||||
void drawDefaultLabels( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
%Docstring
|
||||
Draws default scalebar labels using the specified ``settings`` and ``scaleContext`` to a destination render ``context``.
|
||||
%End
|
||||
|
||||
QString firstLabelString( const QgsScaleBarSettings &settings ) const;
|
||||
%Docstring
|
||||
Returns the text used for the first label in the scalebar.
|
||||
:rtype: str
|
||||
%End
|
||||
|
||||
double firstLabelXOffset( const QgsScaleBarSettings &settings ) const;
|
||||
%Docstring
|
||||
Returns the x-offset (in millimeters) used for the first label in the scalebar.
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
QList<double> segmentPositions( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const;
|
||||
%Docstring
|
||||
Returns a list of positions for each segment within the scalebar.
|
||||
:rtype: list of float
|
||||
%End
|
||||
|
||||
QList<double> segmentWidths( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const;
|
||||
%Docstring
|
||||
Returns a list of widths of each segment of the scalebar.
|
||||
:rtype: list of float
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
397
python/core/scalebar/qgsscalebarsettings.sip
Normal file
397
python/core/scalebar/qgsscalebarsettings.sip
Normal file
@ -0,0 +1,397 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsscalebarsettings.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
class QgsScaleBarSettings
|
||||
{
|
||||
%Docstring
|
||||
The QgsScaleBarSettings class stores the appearance and layout settings
|
||||
for scalebar drawing with QgsScaleBarRenderer.
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsscalebarsettings.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
enum Alignment
|
||||
{
|
||||
AlignLeft,
|
||||
AlignMiddle,
|
||||
AlignRight,
|
||||
};
|
||||
|
||||
enum SegmentSizeMode
|
||||
{
|
||||
SegmentSizeFixed,
|
||||
SegmentSizeFitWidth
|
||||
};
|
||||
|
||||
QgsScaleBarSettings();
|
||||
%Docstring
|
||||
Constructor for QgsScaleBarSettings.
|
||||
%End
|
||||
int numberOfSegments() const;
|
||||
%Docstring
|
||||
Returns the number of segments included in the scalebar.
|
||||
\see setNumberOfSegments()
|
||||
\see numberOfSegmentsLeft()
|
||||
:rtype: int
|
||||
%End
|
||||
|
||||
void setNumberOfSegments( int segments );
|
||||
%Docstring
|
||||
Sets the number of ``segments`` included in the scalebar.
|
||||
\see numberOfSegments()
|
||||
\see setNumberOfSegmentsLeft()
|
||||
%End
|
||||
|
||||
int numberOfSegmentsLeft() const;
|
||||
%Docstring
|
||||
Returns the number of segments included in the left part of the scalebar.
|
||||
\see setNumberOfSegmentsLeft()
|
||||
\see numberOfSegments()
|
||||
:rtype: int
|
||||
%End
|
||||
|
||||
void setNumberOfSegmentsLeft( int segments );
|
||||
%Docstring
|
||||
Sets the number of ``segments`` included in the left part of the scalebar.
|
||||
\see numberOfSegmentsLeft()
|
||||
\see setNumberOfSegments()
|
||||
%End
|
||||
|
||||
double unitsPerSegment() const;
|
||||
%Docstring
|
||||
Returns the number of scalebar units per segment.
|
||||
\see setUnitsPerSegment()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setUnitsPerSegment( double units );
|
||||
%Docstring
|
||||
Sets the number of scalebar ``units`` per segment.
|
||||
\see unitsPerSegment()
|
||||
%End
|
||||
|
||||
SegmentSizeMode segmentSizeMode() const;
|
||||
%Docstring
|
||||
Returns the size mode for the scale bar segments.
|
||||
\see setSegmentSizeMode()
|
||||
\see minBarWidth()
|
||||
\see maxBarWidth()
|
||||
:rtype: SegmentSizeMode
|
||||
%End
|
||||
|
||||
void setSegmentSizeMode( SegmentSizeMode mode );
|
||||
%Docstring
|
||||
Sets the size ``mode`` for scale bar segments.
|
||||
\see segmentSizeMode()
|
||||
\see setMinimumBarWidth()
|
||||
\see setMaximumBarWidth()
|
||||
%End
|
||||
|
||||
double minimumBarWidth() const;
|
||||
%Docstring
|
||||
Returns the minimum width (in millimeters) for scale bar segments. This
|
||||
property is only effective if the segmentSizeMode() is set
|
||||
to SegmentSizeFitWidth.
|
||||
\see segmentSizeMode()
|
||||
\see setMinimumBarWidth()
|
||||
\see maximumBarWidth()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setMinimumBarWidth( double width );
|
||||
%Docstring
|
||||
Sets the minimum ``width`` (in millimeters) for scale bar segments. This
|
||||
property is only effective if the segmentSizeMode() is set
|
||||
to SegmentSizeFitWidth.
|
||||
\see minimumBarWidth()
|
||||
\see setMaximumBarWidth()
|
||||
\see setSegmentSizeMode()
|
||||
%End
|
||||
|
||||
double maximumBarWidth() const;
|
||||
%Docstring
|
||||
Returns the maximum width (in millimeters) for scale bar segments. This
|
||||
property is only effective if the segmentSizeMode() is set
|
||||
to SegmentSizeFitWidth.
|
||||
\see segmentSizeMode()
|
||||
\see setMaximumBarWidth()
|
||||
\see minimumBarWidth()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setMaximumBarWidth( double width );
|
||||
%Docstring
|
||||
Sets the maximum ``width`` (in millimeters) for scale bar segments. This
|
||||
property is only effective if the segmentSizeMode() is set
|
||||
to SegmentSizeFitWidth.
|
||||
\see minimumBarWidth()
|
||||
\see setMinimumBarWidth()
|
||||
\see setSegmentSizeMode()
|
||||
%End
|
||||
|
||||
QgsUnitTypes::DistanceUnit units() const;
|
||||
%Docstring
|
||||
Returns the distance units used by the scalebar.
|
||||
\see setUnits()
|
||||
:rtype: QgsUnitTypes.DistanceUnit
|
||||
%End
|
||||
|
||||
void setUnits( QgsUnitTypes::DistanceUnit units );
|
||||
%Docstring
|
||||
Sets the distance ``units`` used by the scalebar.
|
||||
\see units()
|
||||
%End
|
||||
|
||||
double mapUnitsPerScaleBarUnit() const;
|
||||
%Docstring
|
||||
Returns the number of map units per scale bar unit used by the scalebar.
|
||||
\see setMapUnitsPerScaleBarUnit()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setMapUnitsPerScaleBarUnit( double units );
|
||||
%Docstring
|
||||
Sets the number of map ``units`` per scale bar unit used by the scalebar.
|
||||
\see mapUnitsPerScaleBarUnit()
|
||||
%End
|
||||
|
||||
QString unitLabel() const;
|
||||
%Docstring
|
||||
Returns the label for units.
|
||||
\see setUnitLabel()
|
||||
:rtype: str
|
||||
%End
|
||||
|
||||
void setUnitLabel( const QString &label );
|
||||
%Docstring
|
||||
Sets the ``label`` for units.
|
||||
\see unitLabel()
|
||||
%End
|
||||
|
||||
QFont font() const;
|
||||
%Docstring
|
||||
Returns the font used for drawing text in the scalebar.
|
||||
\see setFont()
|
||||
:rtype: QFont
|
||||
%End
|
||||
|
||||
void setFont( const QFont &font );
|
||||
%Docstring
|
||||
Sets the ``font`` used for drawing text in the scalebar.
|
||||
\see setFont()
|
||||
%End
|
||||
|
||||
QColor fontColor() const;
|
||||
%Docstring
|
||||
Returns the color used for drawing text in the scalebar.
|
||||
\see setFontColor()
|
||||
\see font()
|
||||
:rtype: QColor
|
||||
%End
|
||||
|
||||
void setFontColor( const QColor &color );
|
||||
%Docstring
|
||||
Sets the ``color`` used for drawing text in the scalebar.
|
||||
\see fontColor()
|
||||
\see setFont()
|
||||
%End
|
||||
|
||||
QColor fillColor() const;
|
||||
%Docstring
|
||||
Returns the color used for fills in the scalebar.
|
||||
\see setFillColor()
|
||||
\see fillColor2()
|
||||
:rtype: QColor
|
||||
%End
|
||||
|
||||
void setFillColor( const QColor &color );
|
||||
%Docstring
|
||||
Sets the ``color`` used for fills in the scalebar.
|
||||
\see fillColor()
|
||||
\see setFillColor2()
|
||||
%End
|
||||
|
||||
QColor fillColor2() const;
|
||||
%Docstring
|
||||
Returns the secondary color used for fills in the scalebar.
|
||||
\see setFillColor2()
|
||||
\see fillColor()
|
||||
:rtype: QColor
|
||||
%End
|
||||
|
||||
void setFillColor2( const QColor &color );
|
||||
%Docstring
|
||||
Sets the secondary ``color`` used for fills in the scalebar.
|
||||
\see fillColor2()
|
||||
\see setFillColor2()
|
||||
%End
|
||||
|
||||
QColor lineColor() const;
|
||||
%Docstring
|
||||
Returns the color used for lines in the scalebar.
|
||||
\see setLineColor()
|
||||
:rtype: QColor
|
||||
%End
|
||||
|
||||
void setLineColor( const QColor &color );
|
||||
%Docstring
|
||||
Sets the ``color`` used for lines in the scalebar.
|
||||
\see lineColor()
|
||||
%End
|
||||
|
||||
double lineWidth() const;
|
||||
%Docstring
|
||||
Returns the line width in millimeters for lines in the scalebar.
|
||||
\see setLineWidth()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setLineWidth( double width );
|
||||
%Docstring
|
||||
Sets the line ``width`` in millimeters for lines in the scalebar.
|
||||
\see lineWidth()
|
||||
%End
|
||||
|
||||
QPen pen() const;
|
||||
%Docstring
|
||||
Returns the pen used for drawing outlines in the scalebar.
|
||||
\see setPen()
|
||||
\see brush()
|
||||
:rtype: QPen
|
||||
%End
|
||||
|
||||
void setPen( const QPen &pen );
|
||||
%Docstring
|
||||
Sets the pen used for drawing outlines in the scalebar.
|
||||
\see pen()
|
||||
%End
|
||||
|
||||
QBrush brush() const;
|
||||
%Docstring
|
||||
Returns the primary brush used for filling the scalebar.
|
||||
\see setBrush()
|
||||
\see brush2()
|
||||
\see pen()
|
||||
:rtype: QBrush
|
||||
%End
|
||||
|
||||
void setBrush( const QBrush &brush );
|
||||
%Docstring
|
||||
Sets the primary brush used for filling the scalebar.
|
||||
\see brush()
|
||||
%End
|
||||
|
||||
QBrush brush2() const;
|
||||
%Docstring
|
||||
Returns the secondary brush for the scalebar. This is used for alternating color style scalebars, such
|
||||
as single and double box styles.
|
||||
\see setBrush2()
|
||||
\see brush()
|
||||
:rtype: QBrush
|
||||
%End
|
||||
|
||||
void setBrush2( const QBrush &brush );
|
||||
%Docstring
|
||||
Sets the secondary brush used for filling the scalebar.
|
||||
\see brush()
|
||||
%End
|
||||
|
||||
double height() const;
|
||||
%Docstring
|
||||
Returns the scalebar height (in millimeters).
|
||||
\see setHeight()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setHeight( double height );
|
||||
%Docstring
|
||||
Sets the scalebar ``height`` (in millimeters).
|
||||
\see height()
|
||||
%End
|
||||
|
||||
double labelBarSpace() const;
|
||||
%Docstring
|
||||
Returns the spacing (in millimeters) between labels and the scalebar.
|
||||
\see setLabelBarSpace()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setLabelBarSpace( double space );
|
||||
%Docstring
|
||||
Sets the spacing (in millimeters) between labels and the scalebar.
|
||||
\see labelBarSpace()
|
||||
%End
|
||||
|
||||
double boxContentSpace() const;
|
||||
%Docstring
|
||||
Returns the spacing (margin) between the scalebar box and content in millimeters.
|
||||
\see setBoxContentSpace()
|
||||
:rtype: float
|
||||
%End
|
||||
|
||||
void setBoxContentSpace( double space );
|
||||
%Docstring
|
||||
Sets the ``space`` (margin) between the scalebar box and content in millimeters.
|
||||
\see boxContentSpace()
|
||||
%End
|
||||
|
||||
Alignment alignment() const;
|
||||
%Docstring
|
||||
Returns the scalebar alignment.
|
||||
\see setAlignment()
|
||||
:rtype: Alignment
|
||||
%End
|
||||
|
||||
void setAlignment( Alignment alignment );
|
||||
%Docstring
|
||||
Sets the scalebar ``alignment``.
|
||||
\see alignment()
|
||||
%End
|
||||
|
||||
Qt::PenJoinStyle lineJoinStyle() const;
|
||||
%Docstring
|
||||
Returns the join style used for drawing lines in the scalebar.
|
||||
\see setLineJoinStyle()
|
||||
:rtype: Qt.PenJoinStyle
|
||||
%End
|
||||
|
||||
void setLineJoinStyle( Qt::PenJoinStyle style );
|
||||
%Docstring
|
||||
Sets the join ``style`` used when drawing the lines in the scalebar
|
||||
\see lineJoinStyle()
|
||||
%End
|
||||
|
||||
Qt::PenCapStyle lineCapStyle() const;
|
||||
%Docstring
|
||||
Returns the cap style used for drawing lines in the scalebar.
|
||||
\see setLineCapStyle()
|
||||
:rtype: Qt.PenCapStyle
|
||||
%End
|
||||
|
||||
void setLineCapStyle( Qt::PenCapStyle style );
|
||||
%Docstring
|
||||
Sets the cap ``style`` used when drawing the lines in the scalebar.
|
||||
\see lineCapStyle()
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsscalebarsettings.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
43
python/core/scalebar/qgssingleboxscalebarrenderer.sip
Normal file
43
python/core/scalebar/qgssingleboxscalebarrenderer.sip
Normal file
@ -0,0 +1,43 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgssingleboxscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
class QgsSingleBoxScaleBarRenderer: QgsScaleBarRenderer
|
||||
{
|
||||
%Docstring
|
||||
Scalebar style that draws a single box with alternating
|
||||
color for the segments.
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgssingleboxscalebarrenderer.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
QgsSingleBoxScaleBarRenderer();
|
||||
%Docstring
|
||||
Constructor for QgsSingleBoxScaleBarRenderer.
|
||||
%End
|
||||
|
||||
virtual QString name() const;
|
||||
|
||||
virtual void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgssingleboxscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
63
python/core/scalebar/qgsticksscalebarrenderer.sip
Normal file
63
python/core/scalebar/qgsticksscalebarrenderer.sip
Normal file
@ -0,0 +1,63 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsticksscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
class QgsTicksScaleBarRenderer: QgsScaleBarRenderer
|
||||
{
|
||||
%Docstring
|
||||
A scale bar that draws segments using short ticks.
|
||||
.. versionadded:: 3.0
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgsticksscalebarrenderer.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
enum TickPosition
|
||||
{
|
||||
TicksUp,
|
||||
TicksDown,
|
||||
TicksMiddle,
|
||||
};
|
||||
|
||||
QgsTicksScaleBarRenderer();
|
||||
%Docstring
|
||||
Constructor for QgsTicksScaleBarRenderer.
|
||||
%End
|
||||
|
||||
virtual QString name() const;
|
||||
|
||||
|
||||
virtual void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
void setTickPosition( TickPosition position );
|
||||
%Docstring
|
||||
Sets the ``position`` for tick marks in the scalebar.
|
||||
\see tickPosition()
|
||||
%End
|
||||
|
||||
TickPosition tickPosition() const;
|
||||
%Docstring
|
||||
Returns the position for tick marks in the scalebar.
|
||||
\see setTickPosition()
|
||||
:rtype: TickPosition
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/scalebar/qgsticksscalebarrenderer.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
@ -560,6 +560,7 @@ INCLUDE_DIRECTORIES(
|
||||
../core/geometry
|
||||
../core/layertree
|
||||
../core/raster
|
||||
../core/scalebar
|
||||
../core/symbology-ng
|
||||
../gui
|
||||
../gui/symbology-ng
|
||||
|
@ -55,10 +55,10 @@ QgsComposerScaleBarWidget::QgsComposerScaleBarWidget( QgsComposerScaleBar *scale
|
||||
mAlignmentComboBox->insertItem( 2, tr( "Right" ) );
|
||||
|
||||
//units combo box
|
||||
mUnitsComboBox->insertItem( 0, tr( "Map units" ), 0 );
|
||||
mUnitsComboBox->insertItem( 1, tr( "Meters" ), 1 );
|
||||
mUnitsComboBox->insertItem( 2, tr( "Feet" ), 2 );
|
||||
mUnitsComboBox->insertItem( 3, tr( "Nautical Miles" ), 3 );
|
||||
mUnitsComboBox->insertItem( 0, tr( "Map units" ), QgsUnitTypes::DistanceUnknownUnit );
|
||||
mUnitsComboBox->insertItem( 1, tr( "Meters" ), QgsUnitTypes::DistanceMeters );
|
||||
mUnitsComboBox->insertItem( 2, tr( "Feet" ), QgsUnitTypes::DistanceFeet );
|
||||
mUnitsComboBox->insertItem( 3, tr( "Nautical Miles" ), QgsUnitTypes::DistanceNauticalMiles );
|
||||
|
||||
mFillColorButton->setColorDialogTitle( tr( "Select fill color" ) );
|
||||
mFillColorButton->setAllowAlpha( true );
|
||||
@ -143,7 +143,7 @@ void QgsComposerScaleBarWidget::setGuiElements()
|
||||
//units
|
||||
mUnitsComboBox->setCurrentIndex( mUnitsComboBox->findData( ( int )mComposerScaleBar->units() ) );
|
||||
|
||||
if ( mComposerScaleBar->segmentSizeMode() == QgsComposerScaleBar::SegmentSizeFixed )
|
||||
if ( mComposerScaleBar->segmentSizeMode() == QgsScaleBarSettings::SegmentSizeFixed )
|
||||
{
|
||||
mFixedSizeRadio->setChecked( true );
|
||||
mSegmentSizeSpinBox->setEnabled( true );
|
||||
@ -480,7 +480,7 @@ void QgsComposerScaleBarWidget::on_mAlignmentComboBox_currentIndexChanged( int i
|
||||
|
||||
mComposerScaleBar->beginCommand( tr( "Scalebar alignment" ) );
|
||||
disconnectUpdateSignal();
|
||||
mComposerScaleBar->setAlignment( ( QgsComposerScaleBar::Alignment ) index );
|
||||
mComposerScaleBar->setAlignment( ( QgsScaleBarSettings::Alignment ) index );
|
||||
connectUpdateSignal();
|
||||
mComposerScaleBar->endCommand();
|
||||
}
|
||||
@ -499,32 +499,32 @@ void QgsComposerScaleBarWidget::on_mUnitsComboBox_currentIndexChanged( int index
|
||||
}
|
||||
|
||||
disconnectUpdateSignal();
|
||||
mComposerScaleBar->setUnits( ( QgsComposerScaleBar::ScaleBarUnits )unitData.toInt() );
|
||||
mComposerScaleBar->setUnits( ( QgsUnitTypes::DistanceUnit )unitData.toInt() );
|
||||
switch ( mUnitsComboBox->currentIndex() )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
mComposerScaleBar->beginCommand( tr( "Scalebar changed to map units" ) );
|
||||
mComposerScaleBar->applyDefaultSize( QgsComposerScaleBar::MapUnits );
|
||||
mComposerScaleBar->applyDefaultSize( QgsUnitTypes::DistanceUnknownUnit );
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
mComposerScaleBar->beginCommand( tr( "Scalebar changed to feet" ) );
|
||||
mComposerScaleBar->applyDefaultSize( QgsComposerScaleBar::Feet );
|
||||
mComposerScaleBar->applyDefaultSize( QgsUnitTypes::DistanceFeet );
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
mComposerScaleBar->beginCommand( tr( "Scalebar changed to nautical miles" ) );
|
||||
mComposerScaleBar->applyDefaultSize( QgsComposerScaleBar::NauticalMiles );
|
||||
mComposerScaleBar->applyDefaultSize( QgsUnitTypes::DistanceNauticalMiles );
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
default:
|
||||
{
|
||||
mComposerScaleBar->beginCommand( tr( "Scalebar changed to meters" ) );
|
||||
mComposerScaleBar->applyDefaultSize( QgsComposerScaleBar::Meters );
|
||||
mComposerScaleBar->applyDefaultSize( QgsUnitTypes::DistanceMeters );
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -621,12 +621,12 @@ void QgsComposerScaleBarWidget::segmentSizeRadioChanged( QAbstractButton *radio
|
||||
disconnectUpdateSignal();
|
||||
if ( mFixedSizeRadio->isChecked() )
|
||||
{
|
||||
mComposerScaleBar->setSegmentSizeMode( QgsComposerScaleBar::SegmentSizeFixed );
|
||||
mComposerScaleBar->setSegmentSizeMode( QgsScaleBarSettings::SegmentSizeFixed );
|
||||
mComposerScaleBar->setNumUnitsPerSegment( mSegmentSizeSpinBox->value() );
|
||||
}
|
||||
else /*if(mFitWidthRadio->isChecked())*/
|
||||
{
|
||||
mComposerScaleBar->setSegmentSizeMode( QgsComposerScaleBar::SegmentSizeFitWidth );
|
||||
mComposerScaleBar->setSegmentSizeMode( QgsScaleBarSettings::SegmentSizeFitWidth );
|
||||
}
|
||||
mComposerScaleBar->update();
|
||||
connectUpdateSignal();
|
||||
|
@ -89,6 +89,12 @@ SET(QGIS_CORE_SRCS
|
||||
processing/qgsprocessingregistry.cpp
|
||||
processing/qgsprocessingutils.cpp
|
||||
|
||||
scalebar/qgsdoubleboxscalebarrenderer.cpp
|
||||
scalebar/qgsnumericscalebarrenderer.cpp
|
||||
scalebar/qgsscalebarrenderer.cpp
|
||||
scalebar/qgssingleboxscalebarrenderer.cpp
|
||||
scalebar/qgsticksscalebarrenderer.cpp
|
||||
|
||||
qgis.cpp
|
||||
qgsapplication.cpp
|
||||
qgsaction.cpp
|
||||
@ -305,14 +311,9 @@ SET(QGIS_CORE_SRCS
|
||||
composer/qgscomposertexttable.cpp
|
||||
composer/qgscomposerutils.cpp
|
||||
composer/qgscomposition.cpp
|
||||
composer/qgsdoubleboxscalebarstyle.cpp
|
||||
composer/qgsgroupungroupitemscommand.cpp
|
||||
composer/qgslayoutmanager.cpp
|
||||
composer/qgsnumericscalebarstyle.cpp
|
||||
composer/qgspaperitem.cpp
|
||||
composer/qgsscalebarstyle.cpp
|
||||
composer/qgssingleboxscalebarstyle.cpp
|
||||
composer/qgsticksscalebarstyle.cpp
|
||||
|
||||
dxf/qgsdxfexport.cpp
|
||||
dxf/qgsdxfpaintdevice.cpp
|
||||
@ -848,12 +849,7 @@ SET(QGIS_CORE_HDRS
|
||||
composer/qgscomposeritemcommand.h
|
||||
composer/qgscomposermultiframecommand.h
|
||||
composer/qgscomposertexttable.h
|
||||
composer/qgsdoubleboxscalebarstyle.h
|
||||
composer/qgsnumericscalebarstyle.h
|
||||
composer/qgspaperitem.h
|
||||
composer/qgsscalebarstyle.h
|
||||
composer/qgssingleboxscalebarstyle.h
|
||||
composer/qgsticksscalebarstyle.h
|
||||
|
||||
processing/qgsprocessingalgorithm.h
|
||||
processing/qgsprocessingutils.h
|
||||
@ -898,6 +894,13 @@ SET(QGIS_CORE_HDRS
|
||||
raster/qgssinglebandpseudocolorrenderer.h
|
||||
raster/qgshillshaderenderer.h
|
||||
|
||||
scalebar/qgsdoubleboxscalebarrenderer.h
|
||||
scalebar/qgsnumericscalebarrenderer.h
|
||||
scalebar/qgsscalebarsettings.h
|
||||
scalebar/qgsscalebarrenderer.h
|
||||
scalebar/qgssingleboxscalebarrenderer.h
|
||||
scalebar/qgsticksscalebarrenderer.h
|
||||
|
||||
symbology-ng/qgs25drenderer.h
|
||||
symbology-ng/qgscategorizedsymbolrenderer.h
|
||||
symbology-ng/qgscolorbrewerpalette.h
|
||||
@ -985,6 +988,7 @@ INCLUDE_DIRECTORIES(
|
||||
processing
|
||||
raster
|
||||
renderer
|
||||
scalebar
|
||||
symbology-ng
|
||||
gps/qextserialport
|
||||
)
|
||||
|
@ -19,12 +19,12 @@
|
||||
#include "qgscomposition.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include "qgsdistancearea.h"
|
||||
#include "qgsscalebarstyle.h"
|
||||
#include "qgsdoubleboxscalebarstyle.h"
|
||||
#include "qgsscalebarrenderer.h"
|
||||
#include "qgsdoubleboxscalebarrenderer.h"
|
||||
#include "qgsmapsettings.h"
|
||||
#include "qgsnumericscalebarstyle.h"
|
||||
#include "qgssingleboxscalebarstyle.h"
|
||||
#include "qgsticksscalebarstyle.h"
|
||||
#include "qgsnumericscalebarrenderer.h"
|
||||
#include "qgssingleboxscalebarrenderer.h"
|
||||
#include "qgsticksscalebarrenderer.h"
|
||||
#include "qgsrectangle.h"
|
||||
#include "qgsproject.h"
|
||||
#include "qgssymbollayerutils.h"
|
||||
@ -42,17 +42,8 @@
|
||||
QgsComposerScaleBar::QgsComposerScaleBar( QgsComposition *composition )
|
||||
: QgsComposerItem( composition )
|
||||
, mComposerMap( nullptr )
|
||||
, mNumUnitsPerSegment( 0 )
|
||||
, mSegmentSizeMode( SegmentSizeFixed )
|
||||
, mMinBarWidth( 50 )
|
||||
, mMaxBarWidth( 150 )
|
||||
, mFontColor( QColor( 0, 0, 0 ) )
|
||||
, mStyle( nullptr )
|
||||
, mSegmentMillimeters( 0.0 )
|
||||
, mAlignment( Left )
|
||||
, mUnits( MapUnits )
|
||||
, mLineJoinStyle( Qt::MiterJoin )
|
||||
, mLineCapStyle( Qt::SquareCap )
|
||||
{
|
||||
applyDefaultSettings();
|
||||
applyDefaultSize();
|
||||
@ -78,11 +69,9 @@ void QgsComposerScaleBar::paint( QPainter *painter, const QStyleOptionGraphicsIt
|
||||
|
||||
drawBackground( painter );
|
||||
|
||||
//x-offset is half of first label width because labels are drawn centered
|
||||
QString firstLabel = firstLabelString();
|
||||
double firstLabelWidth = QgsComposerUtils::textWidthMM( mFont, firstLabel );
|
||||
QgsRenderContext c = QgsComposerUtils::createRenderContextForMap( mComposerMap, painter );
|
||||
|
||||
mStyle->draw( painter, firstLabelWidth / 2 );
|
||||
mStyle->draw( c, mSettings, createScaleContext() );
|
||||
|
||||
//draw frame and selection boxes if necessary
|
||||
drawFrame( painter );
|
||||
@ -96,12 +85,12 @@ void QgsComposerScaleBar::setNumSegments( int nSegments )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mNumSegments = nSegments;
|
||||
mSettings.setNumberOfSegments( nSegments );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mNumSegments = nSegments;
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setNumberOfSegments( nSegments );
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -110,28 +99,28 @@ void QgsComposerScaleBar::setNumUnitsPerSegment( double units )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mNumUnitsPerSegment = units;
|
||||
mSettings.setUnitsPerSegment( units );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mNumUnitsPerSegment = units;
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setUnitsPerSegment( units );
|
||||
refreshSegmentMillimeters();
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setSegmentSizeMode( SegmentSizeMode mode )
|
||||
void QgsComposerScaleBar::setSegmentSizeMode( QgsScaleBarSettings::SegmentSizeMode mode )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mSegmentSizeMode = mode;
|
||||
mSettings.setSegmentSizeMode( mode );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mSegmentSizeMode = mode;
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setSegmentSizeMode( mode );
|
||||
refreshSegmentMillimeters();
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -140,13 +129,13 @@ void QgsComposerScaleBar::setMinBarWidth( double minWidth )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mMinBarWidth = minWidth;
|
||||
mSettings.setMinimumBarWidth( minWidth );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mMinBarWidth = minWidth;
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setMinimumBarWidth( minWidth );
|
||||
refreshSegmentMillimeters();
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -155,13 +144,13 @@ void QgsComposerScaleBar::setMaxBarWidth( double maxWidth )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mMaxBarWidth = maxWidth;
|
||||
mSettings.setMaximumBarWidth( maxWidth );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mMaxBarWidth = maxWidth;
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setMaximumBarWidth( maxWidth );
|
||||
refreshSegmentMillimeters();
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -170,12 +159,12 @@ void QgsComposerScaleBar::setNumSegmentsLeft( int nSegmentsLeft )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mNumSegmentsLeft = nSegmentsLeft;
|
||||
mSettings.setNumberOfSegmentsLeft( nSegmentsLeft );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mNumSegmentsLeft = nSegmentsLeft;
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setNumberOfSegmentsLeft( nSegmentsLeft );
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -184,17 +173,17 @@ void QgsComposerScaleBar::setBoxContentSpace( double space )
|
||||
{
|
||||
if ( !mStyle )
|
||||
{
|
||||
mBoxContentSpace = space;
|
||||
mSettings.setBoxContentSpace( space );
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
mBoxContentSpace = space;
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
mSettings.setBoxContentSpace( space );
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setComposerMap( const QgsComposerMap *map )
|
||||
void QgsComposerScaleBar::setComposerMap( QgsComposerMap *map )
|
||||
{
|
||||
if ( mComposerMap )
|
||||
{
|
||||
@ -236,22 +225,30 @@ void QgsComposerScaleBar::refreshDataDefinedProperty( const QgsComposerObject::D
|
||||
//updates data defined properties and redraws item to match
|
||||
if ( property == QgsComposerObject::ScalebarFillColor || property == QgsComposerObject::AllProperties )
|
||||
{
|
||||
mBrush.setColor( mDataDefinedProperties.valueAsColor( QgsComposerObject::ScalebarFillColor, *evalContext, mFillColor ) );
|
||||
QBrush b = mSettings.brush();
|
||||
b.setColor( mDataDefinedProperties.valueAsColor( QgsComposerObject::ScalebarFillColor, *evalContext, mSettings.fillColor() ) );
|
||||
mSettings.setBrush( b );
|
||||
forceUpdate = true;
|
||||
}
|
||||
if ( property == QgsComposerObject::ScalebarFillColor2 || property == QgsComposerObject::AllProperties )
|
||||
{
|
||||
mBrush2.setColor( mDataDefinedProperties.valueAsColor( QgsComposerObject::ScalebarFillColor2, *evalContext, mFillColor2 ) );
|
||||
QBrush b = mSettings.brush2();
|
||||
b.setColor( mDataDefinedProperties.valueAsColor( QgsComposerObject::ScalebarFillColor2, *evalContext, mSettings.fillColor2() ) );
|
||||
mSettings.setBrush2( b );
|
||||
forceUpdate = true;
|
||||
}
|
||||
if ( property == QgsComposerObject::ScalebarLineColor || property == QgsComposerObject::AllProperties )
|
||||
{
|
||||
mPen.setColor( mDataDefinedProperties.valueAsColor( QgsComposerObject::ScalebarLineColor, *evalContext, mLineColor ) );
|
||||
QPen p = mSettings.pen();
|
||||
p.setColor( mDataDefinedProperties.valueAsColor( QgsComposerObject::ScalebarLineColor, *evalContext, mSettings.lineColor() ) );
|
||||
mSettings.setPen( p );
|
||||
forceUpdate = true;
|
||||
}
|
||||
if ( property == QgsComposerObject::ScalebarLineWidth || property == QgsComposerObject::AllProperties )
|
||||
{
|
||||
mPen.setWidthF( mDataDefinedProperties.valueAsDouble( QgsComposerObject::ScalebarLineWidth, *evalContext, mLineWidth ) );
|
||||
QPen p = mSettings.pen();
|
||||
p.setWidthF( mDataDefinedProperties.valueAsDouble( QgsComposerObject::ScalebarLineWidth, *evalContext, mSettings.lineWidth() ) );
|
||||
mSettings.setPen( p );
|
||||
forceUpdate = true;
|
||||
}
|
||||
if ( forceUpdate )
|
||||
@ -283,23 +280,23 @@ void QgsComposerScaleBar::refreshSegmentMillimeters()
|
||||
//get mm dimension of composer map
|
||||
QRectF composerItemRect = mComposerMap->rect();
|
||||
|
||||
if ( mSegmentSizeMode == SegmentSizeFixed )
|
||||
if ( mSettings.segmentSizeMode() == QgsScaleBarSettings::SegmentSizeFixed )
|
||||
{
|
||||
//calculate size depending on mNumUnitsPerSegment
|
||||
mSegmentMillimeters = composerItemRect.width() / mapWidth() * mNumUnitsPerSegment;
|
||||
mSegmentMillimeters = composerItemRect.width() / mapWidth() * mSettings.unitsPerSegment();
|
||||
}
|
||||
else /*if(mSegmentSizeMode == SegmentSizeFitWidth)*/
|
||||
{
|
||||
if ( mMaxBarWidth < mMinBarWidth )
|
||||
if ( mSettings.maximumBarWidth() < mSettings.minimumBarWidth() )
|
||||
{
|
||||
mSegmentMillimeters = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
double nSegments = ( mNumSegmentsLeft != 0 ) + mNumSegments;
|
||||
double nSegments = ( mSettings.numberOfSegmentsLeft() != 0 ) + mSettings.numberOfSegments();
|
||||
// unitsPerSegments which fit minBarWidth resp. maxBarWidth
|
||||
double minUnitsPerSeg = ( mMinBarWidth * mapWidth() ) / ( nSegments * composerItemRect.width() );
|
||||
double maxUnitsPerSeg = ( mMaxBarWidth * mapWidth() ) / ( nSegments * composerItemRect.width() );
|
||||
double minUnitsPerSeg = ( mSettings.minimumBarWidth() * mapWidth() ) / ( nSegments * composerItemRect.width() );
|
||||
double maxUnitsPerSeg = ( mSettings.maximumBarWidth() * mapWidth() ) / ( nSegments * composerItemRect.width() );
|
||||
|
||||
// Start with coarsest "nice" number closest to minUnitsPerSeg resp
|
||||
// maxUnitsPerSeg, then proceed to finer numbers as long as neither
|
||||
@ -317,8 +314,8 @@ void QgsComposerScaleBar::refreshSegmentMillimeters()
|
||||
}
|
||||
|
||||
// Pick mNumUnitsPerSegment from {lowerNiceUnitsPerSeg, upperNiceUnitsPerSeg}, use the larger if possible
|
||||
mNumUnitsPerSegment = upperNiceUnitsPerSeg < minUnitsPerSeg ? lowerNiceUnitsPerSeg : upperNiceUnitsPerSeg;
|
||||
mSegmentMillimeters = composerItemRect.width() / mapWidth() * mNumUnitsPerSegment;
|
||||
mSettings.setUnitsPerSegment( upperNiceUnitsPerSeg < minUnitsPerSeg ? lowerNiceUnitsPerSeg : upperNiceUnitsPerSeg );
|
||||
mSegmentMillimeters = composerItemRect.width() / mapWidth() * mSettings.unitsPerSegment();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -332,7 +329,7 @@ double QgsComposerScaleBar::mapWidth() const
|
||||
}
|
||||
|
||||
QgsRectangle composerMapRect = *( mComposerMap->currentMapExtent() );
|
||||
if ( mUnits == MapUnits )
|
||||
if ( mSettings.units() == QgsUnitTypes::DistanceUnknownUnit )
|
||||
{
|
||||
return composerMapRect.width();
|
||||
}
|
||||
@ -345,108 +342,84 @@ double QgsComposerScaleBar::mapWidth() const
|
||||
QgsUnitTypes::DistanceUnit units = da.lengthUnits();
|
||||
double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMinimum() ),
|
||||
QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ) );
|
||||
switch ( mUnits )
|
||||
{
|
||||
case QgsComposerScaleBar::Feet:
|
||||
measure /= QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::DistanceFeet, units );
|
||||
break;
|
||||
case QgsComposerScaleBar::NauticalMiles:
|
||||
measure /= QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::DistanceNauticalMiles, units );
|
||||
break;
|
||||
case QgsComposerScaleBar::Meters:
|
||||
measure /= QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::DistanceMeters, units );
|
||||
break;
|
||||
case QgsComposerScaleBar::MapUnits:
|
||||
//avoid warning
|
||||
break;
|
||||
}
|
||||
measure /= QgsUnitTypes::fromUnitToUnitFactor( mSettings.units(), units );
|
||||
return measure;
|
||||
}
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setAlignment( Alignment a )
|
||||
QgsScaleBarRenderer::ScaleBarContext QgsComposerScaleBar::createScaleContext() const
|
||||
{
|
||||
mAlignment = a;
|
||||
QgsScaleBarRenderer::ScaleBarContext scaleContext;
|
||||
scaleContext.size = rect().size();
|
||||
scaleContext.segmentWidth = mSegmentMillimeters;
|
||||
scaleContext.scale = mComposerMap ? mComposerMap->scale() : 1.0;
|
||||
return scaleContext;
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setAlignment( QgsScaleBarSettings::Alignment a )
|
||||
{
|
||||
mSettings.setAlignment( a );
|
||||
update();
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setUnits( ScaleBarUnits u )
|
||||
void QgsComposerScaleBar::setUnits( QgsUnitTypes::DistanceUnit u )
|
||||
{
|
||||
mUnits = u;
|
||||
mSettings.setUnits( u );
|
||||
refreshSegmentMillimeters();
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setLineJoinStyle( Qt::PenJoinStyle style )
|
||||
{
|
||||
if ( mLineJoinStyle == style )
|
||||
if ( mSettings.lineJoinStyle() == style )
|
||||
{
|
||||
//no change
|
||||
return;
|
||||
}
|
||||
mLineJoinStyle = style;
|
||||
mPen.setJoinStyle( mLineJoinStyle );
|
||||
mSettings.setLineJoinStyle( style );
|
||||
update();
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setLineCapStyle( Qt::PenCapStyle style )
|
||||
{
|
||||
if ( mLineCapStyle == style )
|
||||
if ( mSettings.lineCapStyle() == style )
|
||||
{
|
||||
//no change
|
||||
return;
|
||||
}
|
||||
mLineCapStyle = style;
|
||||
mPen.setCapStyle( mLineCapStyle );
|
||||
mSettings.setLineCapStyle( style );
|
||||
update();
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::applyDefaultSettings()
|
||||
{
|
||||
mNumSegments = 2;
|
||||
mNumSegmentsLeft = 0;
|
||||
|
||||
mNumMapUnitsPerScaleBarUnit = 1.0;
|
||||
|
||||
//style
|
||||
delete mStyle;
|
||||
mStyle = new QgsSingleBoxScaleBarStyle( this );
|
||||
|
||||
mHeight = 3;
|
||||
mStyle = new QgsSingleBoxScaleBarRenderer();
|
||||
|
||||
//default to no background
|
||||
setBackgroundEnabled( false );
|
||||
|
||||
mPen = QPen( mLineColor );
|
||||
mPen.setJoinStyle( mLineJoinStyle );
|
||||
mPen.setCapStyle( mLineCapStyle );
|
||||
mPen.setWidthF( mLineWidth );
|
||||
|
||||
mBrush.setColor( mFillColor );
|
||||
mBrush.setStyle( Qt::SolidPattern );
|
||||
|
||||
mBrush2.setColor( mFillColor2 );
|
||||
mBrush2.setStyle( Qt::SolidPattern );
|
||||
|
||||
//get default composer font from settings
|
||||
QgsSettings settings;
|
||||
QString defaultFontString = settings.value( QStringLiteral( "Composer/defaultFont" ) ).toString();
|
||||
QFont f;
|
||||
if ( !defaultFontString.isEmpty() )
|
||||
{
|
||||
mFont.setFamily( defaultFontString );
|
||||
f.setFamily( defaultFontString );
|
||||
}
|
||||
mFont.setPointSizeF( 12.0 );
|
||||
mFontColor = QColor( 0, 0, 0 );
|
||||
f.setPointSizeF( 12.0 );
|
||||
mSettings.setFont( f );
|
||||
|
||||
mSettings.setUnits( QgsUnitTypes::DistanceUnknownUnit );
|
||||
|
||||
mLabelBarSpace = 3.0;
|
||||
mBoxContentSpace = 1.0;
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::applyDefaultSize( QgsComposerScaleBar::ScaleBarUnits u )
|
||||
void QgsComposerScaleBar::applyDefaultSize( QgsUnitTypes::DistanceUnit u )
|
||||
{
|
||||
if ( mComposerMap )
|
||||
{
|
||||
@ -456,15 +429,15 @@ void QgsComposerScaleBar::applyDefaultSize( QgsComposerScaleBar::ScaleBarUnits u
|
||||
double initialUnitsPerSegment = widthInSelectedUnits / 10.0; //default scalebar width equals half the map width
|
||||
setNumUnitsPerSegment( initialUnitsPerSegment );
|
||||
|
||||
switch ( mUnits )
|
||||
switch ( u )
|
||||
{
|
||||
case MapUnits:
|
||||
case QgsUnitTypes::DistanceUnknownUnit:
|
||||
{
|
||||
upperMagnitudeMultiplier = 1.0;
|
||||
setUnitLabeling( tr( "units" ) );
|
||||
break;
|
||||
}
|
||||
case Meters:
|
||||
case QgsUnitTypes::DistanceMeters:
|
||||
{
|
||||
if ( initialUnitsPerSegment > 1000.0 )
|
||||
{
|
||||
@ -478,7 +451,7 @@ void QgsComposerScaleBar::applyDefaultSize( QgsComposerScaleBar::ScaleBarUnits u
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Feet:
|
||||
case QgsUnitTypes::DistanceFeet:
|
||||
{
|
||||
if ( initialUnitsPerSegment > 5419.95 )
|
||||
{
|
||||
@ -492,12 +465,11 @@ void QgsComposerScaleBar::applyDefaultSize( QgsComposerScaleBar::ScaleBarUnits u
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NauticalMiles:
|
||||
{
|
||||
|
||||
default:
|
||||
setUnitLabeling( QgsUnitTypes::toAbbreviatedString( u ) );
|
||||
upperMagnitudeMultiplier = 1;
|
||||
setUnitLabeling( tr( "Nm" ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
double segmentWidth = initialUnitsPerSegment / upperMagnitudeMultiplier;
|
||||
@ -528,7 +500,7 @@ void QgsComposerScaleBar::adjustBoxSize()
|
||||
return;
|
||||
}
|
||||
|
||||
QRectF box = mStyle->calculateBoxSize();
|
||||
QRectF box = QRectF( pos(), mStyle->calculateBoxSize( mSettings, createScaleContext() ) );
|
||||
if ( rect().height() > box.height() )
|
||||
{
|
||||
//keep user specified item height if higher than minimum scale bar height
|
||||
@ -553,7 +525,7 @@ void QgsComposerScaleBar::adjustBoxSize()
|
||||
|
||||
void QgsComposerScaleBar::setSceneRect( const QRectF &rectangle )
|
||||
{
|
||||
QRectF box = mStyle->calculateBoxSize();
|
||||
QRectF box = QRectF( pos(), mStyle->calculateBoxSize( mSettings, createScaleContext() ) );
|
||||
if ( rectangle.height() > box.height() )
|
||||
{
|
||||
//keep user specified item height if higher than minimum scale bar height
|
||||
@ -593,35 +565,14 @@ void QgsComposerScaleBar::updateSegmentSize()
|
||||
{
|
||||
return;
|
||||
}
|
||||
double width = mStyle->calculateBoxSize().width();
|
||||
double width = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
refreshSegmentMillimeters();
|
||||
double widthAfter = mStyle->calculateBoxSize().width();
|
||||
double widthAfter = mStyle->calculateBoxSize( mSettings, createScaleContext() ).width();
|
||||
correctXPositionAlignment( width, widthAfter );
|
||||
update();
|
||||
emit itemChanged();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::segmentPositions( QList<QPair<double, double> > &posWidthList ) const
|
||||
{
|
||||
posWidthList.clear();
|
||||
double mCurrentXCoord = mPen.widthF() + mBoxContentSpace;
|
||||
|
||||
//left segments
|
||||
double leftSegmentSize = mSegmentMillimeters / mNumSegmentsLeft;
|
||||
for ( int i = 0; i < mNumSegmentsLeft; ++i )
|
||||
{
|
||||
posWidthList.push_back( qMakePair( mCurrentXCoord, leftSegmentSize ) );
|
||||
mCurrentXCoord += leftSegmentSize;
|
||||
}
|
||||
|
||||
//right segments
|
||||
for ( int i = 0; i < mNumSegments; ++i )
|
||||
{
|
||||
posWidthList.push_back( qMakePair( mCurrentXCoord, mSegmentMillimeters ) );
|
||||
mCurrentXCoord += mSegmentMillimeters;
|
||||
}
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setStyle( const QString &styleName )
|
||||
{
|
||||
delete mStyle;
|
||||
@ -630,32 +581,32 @@ void QgsComposerScaleBar::setStyle( const QString &styleName )
|
||||
//switch depending on style name
|
||||
if ( styleName == QLatin1String( "Single Box" ) )
|
||||
{
|
||||
mStyle = new QgsSingleBoxScaleBarStyle( this );
|
||||
mStyle = new QgsSingleBoxScaleBarRenderer();
|
||||
}
|
||||
else if ( styleName == QLatin1String( "Double Box" ) )
|
||||
{
|
||||
mStyle = new QgsDoubleBoxScaleBarStyle( this );
|
||||
mStyle = new QgsDoubleBoxScaleBarRenderer();
|
||||
}
|
||||
else if ( styleName == QLatin1String( "Line Ticks Middle" ) || styleName == QLatin1String( "Line Ticks Down" ) || styleName == QLatin1String( "Line Ticks Up" ) )
|
||||
{
|
||||
QgsTicksScaleBarStyle *tickStyle = new QgsTicksScaleBarStyle( this );
|
||||
QgsTicksScaleBarRenderer *tickStyle = new QgsTicksScaleBarRenderer();
|
||||
if ( styleName == QLatin1String( "Line Ticks Middle" ) )
|
||||
{
|
||||
tickStyle->setTickPosition( QgsTicksScaleBarStyle::TicksMiddle );
|
||||
tickStyle->setTickPosition( QgsTicksScaleBarRenderer::TicksMiddle );
|
||||
}
|
||||
else if ( styleName == QLatin1String( "Line Ticks Down" ) )
|
||||
{
|
||||
tickStyle->setTickPosition( QgsTicksScaleBarStyle::TicksDown );
|
||||
tickStyle->setTickPosition( QgsTicksScaleBarRenderer::TicksDown );
|
||||
}
|
||||
else if ( styleName == QLatin1String( "Line Ticks Up" ) )
|
||||
{
|
||||
tickStyle->setTickPosition( QgsTicksScaleBarStyle::TicksUp );
|
||||
tickStyle->setTickPosition( QgsTicksScaleBarRenderer::TicksUp );
|
||||
}
|
||||
mStyle = tickStyle;
|
||||
}
|
||||
else if ( styleName == QLatin1String( "Numeric" ) )
|
||||
{
|
||||
mStyle = new QgsNumericScaleBarStyle( this );
|
||||
mStyle = new QgsNumericScaleBarRenderer();
|
||||
}
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -672,26 +623,14 @@ QString QgsComposerScaleBar::style() const
|
||||
}
|
||||
}
|
||||
|
||||
QString QgsComposerScaleBar::firstLabelString() const
|
||||
{
|
||||
if ( mNumSegmentsLeft > 0 )
|
||||
{
|
||||
return QString::number( mNumUnitsPerSegment / mNumMapUnitsPerScaleBarUnit );
|
||||
}
|
||||
else
|
||||
{
|
||||
return QStringLiteral( "0" );
|
||||
}
|
||||
}
|
||||
|
||||
QFont QgsComposerScaleBar::font() const
|
||||
{
|
||||
return mFont;
|
||||
return mSettings.font();
|
||||
}
|
||||
|
||||
void QgsComposerScaleBar::setFont( const QFont &font )
|
||||
{
|
||||
mFont = font;
|
||||
mSettings.setFont( font );
|
||||
update();
|
||||
emit itemChanged();
|
||||
}
|
||||
@ -704,23 +643,23 @@ bool QgsComposerScaleBar::writeXml( QDomElement &elem, QDomDocument &doc ) const
|
||||
}
|
||||
|
||||
QDomElement composerScaleBarElem = doc.createElement( QStringLiteral( "ComposerScaleBar" ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "height" ), QString::number( mHeight ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "labelBarSpace" ), QString::number( mLabelBarSpace ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "boxContentSpace" ), QString::number( mBoxContentSpace ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numSegments" ), mNumSegments );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numSegmentsLeft" ), mNumSegmentsLeft );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numUnitsPerSegment" ), QString::number( mNumUnitsPerSegment ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "segmentSizeMode" ), mSegmentSizeMode );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "minBarWidth" ), mMinBarWidth );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "maxBarWidth" ), mMaxBarWidth );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "height" ), QString::number( mSettings.height() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "labelBarSpace" ), QString::number( mSettings.labelBarSpace() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "boxContentSpace" ), QString::number( mSettings.boxContentSpace() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numSegments" ), mSettings.numberOfSegments() );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numSegmentsLeft" ), mSettings.numberOfSegmentsLeft() );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numUnitsPerSegment" ), QString::number( mSettings.unitsPerSegment() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "segmentSizeMode" ), mSettings.segmentSizeMode() );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "minBarWidth" ), mSettings.minimumBarWidth() );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "maxBarWidth" ), mSettings.maximumBarWidth() );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "segmentMillimeters" ), QString::number( mSegmentMillimeters ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numMapUnitsPerScaleBarUnit" ), QString::number( mNumMapUnitsPerScaleBarUnit ) );
|
||||
composerScaleBarElem.appendChild( QgsFontUtils::toXmlElement( mFont, doc, QStringLiteral( "scaleBarFont" ) ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "outlineWidth" ), QString::number( mLineWidth ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "unitLabel" ), mUnitLabeling );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "units" ), mUnits );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "lineJoinStyle" ), QgsSymbolLayerUtils::encodePenJoinStyle( mLineJoinStyle ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "lineCapStyle" ), QgsSymbolLayerUtils::encodePenCapStyle( mLineCapStyle ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "numMapUnitsPerScaleBarUnit" ), QString::number( mSettings.mapUnitsPerScaleBarUnit() ) );
|
||||
composerScaleBarElem.appendChild( QgsFontUtils::toXmlElement( mSettings.font(), doc, QStringLiteral( "scaleBarFont" ) ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "outlineWidth" ), QString::number( mSettings.lineWidth() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "unitLabel" ), mSettings.unitLabel() );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "unitType" ), QgsUnitTypes::encodeUnit( mSettings.units() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "lineJoinStyle" ), QgsSymbolLayerUtils::encodePenJoinStyle( mSettings.lineJoinStyle() ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "lineCapStyle" ), QgsSymbolLayerUtils::encodePenCapStyle( mSettings.lineCapStyle() ) );
|
||||
|
||||
//style
|
||||
if ( mStyle )
|
||||
@ -738,38 +677,38 @@ bool QgsComposerScaleBar::writeXml( QDomElement &elem, QDomDocument &doc ) const
|
||||
|
||||
//fill color
|
||||
QDomElement fillColorElem = doc.createElement( QStringLiteral( "fillColor" ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mFillColor.red() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mFillColor.green() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mFillColor.blue() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mFillColor.alpha() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mSettings.fillColor().red() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mSettings.fillColor().green() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mSettings.fillColor().blue() ) );
|
||||
fillColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mSettings.fillColor().alpha() ) );
|
||||
composerScaleBarElem.appendChild( fillColorElem );
|
||||
|
||||
//fill color 2
|
||||
QDomElement fillColor2Elem = doc.createElement( QStringLiteral( "fillColor2" ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "red" ), QString::number( mFillColor2.red() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "green" ), QString::number( mFillColor2.green() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "blue" ), QString::number( mFillColor2.blue() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "alpha" ), QString::number( mFillColor2.alpha() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "red" ), QString::number( mSettings.fillColor2().red() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "green" ), QString::number( mSettings.fillColor2().green() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "blue" ), QString::number( mSettings.fillColor2().blue() ) );
|
||||
fillColor2Elem.setAttribute( QStringLiteral( "alpha" ), QString::number( mSettings.fillColor2().alpha() ) );
|
||||
composerScaleBarElem.appendChild( fillColor2Elem );
|
||||
|
||||
//pen color
|
||||
QDomElement strokeColorElem = doc.createElement( QStringLiteral( "strokeColor" ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mLineColor.red() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mLineColor.green() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mLineColor.blue() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mLineColor.alpha() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mSettings.lineColor().red() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mSettings.lineColor().green() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mSettings.lineColor().blue() ) );
|
||||
strokeColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mSettings.lineColor().alpha() ) );
|
||||
composerScaleBarElem.appendChild( strokeColorElem );
|
||||
|
||||
//font color
|
||||
QDomElement fontColorElem = doc.createElement( QStringLiteral( "textColor" ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mFontColor.red() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mFontColor.green() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mFontColor.blue() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mFontColor.alpha() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mSettings.fontColor().red() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mSettings.fontColor().green() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mSettings.fontColor().blue() ) );
|
||||
fontColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mSettings.fontColor().alpha() ) );
|
||||
composerScaleBarElem.appendChild( fontColorElem );
|
||||
|
||||
//alignment
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "alignment" ), QString::number( static_cast< int >( mAlignment ) ) );
|
||||
composerScaleBarElem.setAttribute( QStringLiteral( "alignment" ), QString::number( static_cast< int >( mSettings.alignment() ) ) );
|
||||
|
||||
elem.appendChild( composerScaleBarElem );
|
||||
return _writeXml( composerScaleBarElem, doc );
|
||||
@ -782,28 +721,27 @@ bool QgsComposerScaleBar::readXml( const QDomElement &itemElem, const QDomDocume
|
||||
return false;
|
||||
}
|
||||
|
||||
mHeight = itemElem.attribute( QStringLiteral( "height" ), QStringLiteral( "5.0" ) ).toDouble();
|
||||
mLabelBarSpace = itemElem.attribute( QStringLiteral( "labelBarSpace" ), QStringLiteral( "3.0" ) ).toDouble();
|
||||
mBoxContentSpace = itemElem.attribute( QStringLiteral( "boxContentSpace" ), QStringLiteral( "1.0" ) ).toDouble();
|
||||
mNumSegments = itemElem.attribute( QStringLiteral( "numSegments" ), QStringLiteral( "2" ) ).toInt();
|
||||
mNumSegmentsLeft = itemElem.attribute( QStringLiteral( "numSegmentsLeft" ), QStringLiteral( "0" ) ).toInt();
|
||||
mNumUnitsPerSegment = itemElem.attribute( QStringLiteral( "numUnitsPerSegment" ), QStringLiteral( "1.0" ) ).toDouble();
|
||||
mSegmentSizeMode = static_cast<SegmentSizeMode>( itemElem.attribute( QStringLiteral( "segmentSizeMode" ), QStringLiteral( "0" ) ).toInt() );
|
||||
mMinBarWidth = itemElem.attribute( QStringLiteral( "minBarWidth" ), QStringLiteral( "50" ) ).toInt();
|
||||
mMaxBarWidth = itemElem.attribute( QStringLiteral( "maxBarWidth" ), QStringLiteral( "150" ) ).toInt();
|
||||
mSettings.setHeight( itemElem.attribute( QStringLiteral( "height" ), QStringLiteral( "5.0" ) ).toDouble() );
|
||||
mSettings.setLabelBarSpace( itemElem.attribute( QStringLiteral( "labelBarSpace" ), QStringLiteral( "3.0" ) ).toDouble() );
|
||||
mSettings.setBoxContentSpace( itemElem.attribute( QStringLiteral( "boxContentSpace" ), QStringLiteral( "1.0" ) ).toDouble() );
|
||||
mSettings.setNumberOfSegments( itemElem.attribute( QStringLiteral( "numSegments" ), QStringLiteral( "2" ) ).toInt() );
|
||||
mSettings.setNumberOfSegmentsLeft( itemElem.attribute( QStringLiteral( "numSegmentsLeft" ), QStringLiteral( "0" ) ).toInt() );
|
||||
mSettings.setUnitsPerSegment( itemElem.attribute( QStringLiteral( "numUnitsPerSegment" ), QStringLiteral( "1.0" ) ).toDouble() );
|
||||
mSettings.setSegmentSizeMode( static_cast<QgsScaleBarSettings::SegmentSizeMode>( itemElem.attribute( QStringLiteral( "segmentSizeMode" ), QStringLiteral( "0" ) ).toInt() ) );
|
||||
mSettings.setMinimumBarWidth( itemElem.attribute( QStringLiteral( "minBarWidth" ), QStringLiteral( "50" ) ).toInt() );
|
||||
mSettings.setMaximumBarWidth( itemElem.attribute( QStringLiteral( "maxBarWidth" ), QStringLiteral( "150" ) ).toInt() );
|
||||
mSegmentMillimeters = itemElem.attribute( QStringLiteral( "segmentMillimeters" ), QStringLiteral( "0.0" ) ).toDouble();
|
||||
mNumMapUnitsPerScaleBarUnit = itemElem.attribute( QStringLiteral( "numMapUnitsPerScaleBarUnit" ), QStringLiteral( "1.0" ) ).toDouble();
|
||||
mLineWidth = itemElem.attribute( QStringLiteral( "outlineWidth" ), QStringLiteral( "0.3" ) ).toDouble();
|
||||
mPen.setWidthF( mLineWidth );
|
||||
mUnitLabeling = itemElem.attribute( QStringLiteral( "unitLabel" ) );
|
||||
mLineJoinStyle = QgsSymbolLayerUtils::decodePenJoinStyle( itemElem.attribute( QStringLiteral( "lineJoinStyle" ), QStringLiteral( "miter" ) ) );
|
||||
mPen.setJoinStyle( mLineJoinStyle );
|
||||
mLineCapStyle = QgsSymbolLayerUtils::decodePenCapStyle( itemElem.attribute( QStringLiteral( "lineCapStyle" ), QStringLiteral( "square" ) ) );
|
||||
mPen.setCapStyle( mLineCapStyle );
|
||||
if ( !QgsFontUtils::setFromXmlChildNode( mFont, itemElem, QStringLiteral( "scaleBarFont" ) ) )
|
||||
mSettings.setMapUnitsPerScaleBarUnit( itemElem.attribute( QStringLiteral( "numMapUnitsPerScaleBarUnit" ), QStringLiteral( "1.0" ) ).toDouble() );
|
||||
mSettings.setLineWidth( itemElem.attribute( QStringLiteral( "outlineWidth" ), QStringLiteral( "0.3" ) ).toDouble() );
|
||||
mSettings.setUnitLabel( itemElem.attribute( QStringLiteral( "unitLabel" ) ) );
|
||||
mSettings.setLineJoinStyle( QgsSymbolLayerUtils::decodePenJoinStyle( itemElem.attribute( QStringLiteral( "lineJoinStyle" ), QStringLiteral( "miter" ) ) ) );
|
||||
mSettings.setLineCapStyle( QgsSymbolLayerUtils::decodePenCapStyle( itemElem.attribute( QStringLiteral( "lineCapStyle" ), QStringLiteral( "square" ) ) ) );
|
||||
QFont f;
|
||||
if ( !QgsFontUtils::setFromXmlChildNode( f, itemElem, QStringLiteral( "scaleBarFont" ) ) )
|
||||
{
|
||||
mFont.fromString( itemElem.attribute( QStringLiteral( "font" ), QLatin1String( "" ) ) );
|
||||
f.fromString( itemElem.attribute( QStringLiteral( "font" ), QLatin1String( "" ) ) );
|
||||
}
|
||||
mSettings.setFont( f );
|
||||
|
||||
//colors
|
||||
//fill color
|
||||
@ -821,14 +759,12 @@ bool QgsComposerScaleBar::readXml( const QDomElement &itemElem, const QDomDocume
|
||||
|
||||
if ( redOk && greenOk && blueOk && alphaOk )
|
||||
{
|
||||
mFillColor = QColor( fillRed, fillGreen, fillBlue, fillAlpha );
|
||||
mBrush.setColor( mFillColor );
|
||||
mSettings.setFillColor( QColor( fillRed, fillGreen, fillBlue, fillAlpha ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mFillColor = QColor( itemElem.attribute( QStringLiteral( "brushColor" ), QStringLiteral( "#000000" ) ) );
|
||||
mBrush.setColor( mFillColor );
|
||||
mSettings.setFillColor( QColor( itemElem.attribute( QStringLiteral( "brushColor" ), QStringLiteral( "#000000" ) ) ) );
|
||||
}
|
||||
|
||||
//fill color 2
|
||||
@ -846,14 +782,12 @@ bool QgsComposerScaleBar::readXml( const QDomElement &itemElem, const QDomDocume
|
||||
|
||||
if ( redOk && greenOk && blueOk && alphaOk )
|
||||
{
|
||||
mFillColor2 = QColor( fillRed, fillGreen, fillBlue, fillAlpha );
|
||||
mBrush2.setColor( mFillColor2 );
|
||||
mSettings.setFillColor2( QColor( fillRed, fillGreen, fillBlue, fillAlpha ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mFillColor2 = QColor( itemElem.attribute( QStringLiteral( "brush2Color" ), QStringLiteral( "#ffffff" ) ) );
|
||||
mBrush2.setColor( mFillColor2 );
|
||||
mSettings.setFillColor2( QColor( itemElem.attribute( QStringLiteral( "brush2Color" ), QStringLiteral( "#ffffff" ) ) ) );
|
||||
}
|
||||
|
||||
//stroke color
|
||||
@ -871,14 +805,18 @@ bool QgsComposerScaleBar::readXml( const QDomElement &itemElem, const QDomDocume
|
||||
|
||||
if ( redOk && greenOk && blueOk && alphaOk )
|
||||
{
|
||||
mLineColor = QColor( strokeRed, strokeGreen, strokeBlue, strokeAlpha );
|
||||
mPen.setColor( mLineColor );
|
||||
mSettings.setLineColor( QColor( strokeRed, strokeGreen, strokeBlue, strokeAlpha ) );
|
||||
QPen p = mSettings.pen();
|
||||
p.setColor( mSettings.lineColor() );
|
||||
mSettings.setPen( p );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mLineColor = QColor( itemElem.attribute( QStringLiteral( "penColor" ), QStringLiteral( "#000000" ) ) );
|
||||
mPen.setColor( mLineColor );
|
||||
mSettings.setLineColor( QColor( itemElem.attribute( QStringLiteral( "penColor" ), QStringLiteral( "#000000" ) ) ) );
|
||||
QPen p = mSettings.pen();
|
||||
p.setColor( mSettings.lineColor() );
|
||||
mSettings.setPen( p );
|
||||
}
|
||||
|
||||
//font color
|
||||
@ -896,12 +834,14 @@ bool QgsComposerScaleBar::readXml( const QDomElement &itemElem, const QDomDocume
|
||||
|
||||
if ( redOk && greenOk && blueOk && alphaOk )
|
||||
{
|
||||
mFontColor = QColor( textRed, textGreen, textBlue, textAlpha );
|
||||
mSettings.setFontColor( QColor( textRed, textGreen, textBlue, textAlpha ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mFontColor.setNamedColor( itemElem.attribute( QStringLiteral( "fontColor" ), QStringLiteral( "#000000" ) ) );
|
||||
QColor c;
|
||||
c.setNamedColor( itemElem.attribute( QStringLiteral( "fontColor" ), QStringLiteral( "#000000" ) ) );
|
||||
mSettings.setFontColor( c );
|
||||
}
|
||||
|
||||
//style
|
||||
@ -910,15 +850,38 @@ bool QgsComposerScaleBar::readXml( const QDomElement &itemElem, const QDomDocume
|
||||
QString styleString = itemElem.attribute( QStringLiteral( "style" ), QLatin1String( "" ) );
|
||||
setStyle( tr( styleString.toLocal8Bit().data() ) );
|
||||
|
||||
mUnits = static_cast< ScaleBarUnits >( itemElem.attribute( QStringLiteral( "units" ) ).toInt() );
|
||||
mAlignment = static_cast< Alignment >( itemElem.attribute( QStringLiteral( "alignment" ), QStringLiteral( "0" ) ).toInt() );
|
||||
if ( itemElem.attribute( QStringLiteral( "unitType" ) ).isEmpty() )
|
||||
{
|
||||
QgsUnitTypes::DistanceUnit u = QgsUnitTypes::DistanceUnknownUnit;
|
||||
switch ( itemElem.attribute( QStringLiteral( "units" ) ).toInt() )
|
||||
{
|
||||
case 0:
|
||||
u = QgsUnitTypes::DistanceUnknownUnit;
|
||||
break;
|
||||
case 1:
|
||||
u = QgsUnitTypes::DistanceMeters;
|
||||
break;
|
||||
case 2:
|
||||
u = QgsUnitTypes::DistanceFeet;
|
||||
break;
|
||||
case 3:
|
||||
u = QgsUnitTypes::DistanceNauticalMiles;
|
||||
break;
|
||||
}
|
||||
mSettings.setUnits( u );
|
||||
}
|
||||
else
|
||||
{
|
||||
mSettings.setUnits( QgsUnitTypes::decodeDistanceUnit( itemElem.attribute( QStringLiteral( "unitType" ) ) ) );
|
||||
}
|
||||
mSettings.setAlignment( static_cast< QgsScaleBarSettings::Alignment >( itemElem.attribute( QStringLiteral( "alignment" ), QStringLiteral( "0" ) ).toInt() ) );
|
||||
|
||||
//map
|
||||
int mapId = itemElem.attribute( QStringLiteral( "mapId" ), QStringLiteral( "-1" ) ).toInt();
|
||||
if ( mapId >= 0 )
|
||||
{
|
||||
const QgsComposerMap *composerMap = mComposition->getComposerMapById( mapId );
|
||||
mComposerMap = composerMap;
|
||||
mComposerMap = const_cast< QgsComposerMap *>( composerMap );
|
||||
if ( mComposerMap )
|
||||
{
|
||||
connect( mComposerMap, &QgsComposerMap::extentChanged, this, &QgsComposerScaleBar::updateSegmentSize );
|
||||
@ -947,11 +910,11 @@ void QgsComposerScaleBar::correctXPositionAlignment( double width, double widthA
|
||||
return;
|
||||
}
|
||||
|
||||
if ( mAlignment == Middle )
|
||||
if ( mSettings.alignment() == QgsScaleBarSettings::AlignMiddle )
|
||||
{
|
||||
move( -( widthAfter - width ) / 2.0, 0 );
|
||||
}
|
||||
else if ( mAlignment == Right )
|
||||
else if ( mSettings.alignment() == QgsScaleBarSettings::AlignRight )
|
||||
{
|
||||
move( -( widthAfter - width ), 0 );
|
||||
}
|
||||
|
@ -18,12 +18,13 @@
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgscomposeritem.h"
|
||||
#include "scalebar/qgsscalebarsettings.h"
|
||||
#include "scalebar/qgsscalebarrenderer.h"
|
||||
#include <QFont>
|
||||
#include <QPen>
|
||||
#include <QColor>
|
||||
|
||||
class QgsComposerMap;
|
||||
class QgsScaleBarStyle;
|
||||
|
||||
/** \ingroup core
|
||||
* A scale bar item that can be added to a map composition.
|
||||
@ -35,29 +36,6 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
|
||||
public:
|
||||
|
||||
enum Alignment
|
||||
{
|
||||
Left = 0,
|
||||
Middle,
|
||||
Right
|
||||
};
|
||||
|
||||
enum ScaleBarUnits
|
||||
{
|
||||
MapUnits = 0,
|
||||
Meters,
|
||||
Feet,
|
||||
NauticalMiles
|
||||
};
|
||||
|
||||
/** Modes for setting size for scale bar segments
|
||||
*/
|
||||
enum SegmentSizeMode
|
||||
{
|
||||
SegmentSizeFixed = 0, //!< Scale bar segment size is fixed to a map unit
|
||||
SegmentSizeFitWidth = 1 //!< Scale bar segment size is calculated to fit a size range
|
||||
};
|
||||
|
||||
QgsComposerScaleBar( QgsComposition *composition );
|
||||
~QgsComposerScaleBar();
|
||||
|
||||
@ -68,13 +46,13 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
void paint( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget ) override;
|
||||
|
||||
//getters and setters
|
||||
int numSegments() const {return mNumSegments;}
|
||||
int numSegments() const {return mSettings.numberOfSegments();}
|
||||
void setNumSegments( int nSegments );
|
||||
|
||||
int numSegmentsLeft() const {return mNumSegmentsLeft;}
|
||||
int numSegmentsLeft() const {return mSettings.numberOfSegmentsLeft();}
|
||||
void setNumSegmentsLeft( int nSegmentsLeft );
|
||||
|
||||
double numUnitsPerSegment() const {return mNumUnitsPerSegment;}
|
||||
double numUnitsPerSegment() const {return mSettings.unitsPerSegment();}
|
||||
void setNumUnitsPerSegment( double units );
|
||||
|
||||
/** Returns the size mode for scale bar segments.
|
||||
@ -83,7 +61,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see maxBarWidth
|
||||
* \since QGIS 2.9
|
||||
*/
|
||||
SegmentSizeMode segmentSizeMode() const { return mSegmentSizeMode; }
|
||||
QgsScaleBarSettings::SegmentSizeMode segmentSizeMode() const { return mSettings.segmentSizeMode(); }
|
||||
|
||||
/** Sets the size mode for scale bar segments.
|
||||
* \param mode size mode
|
||||
@ -92,7 +70,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see setMaxBarWidth
|
||||
* \since QGIS 2.9
|
||||
*/
|
||||
void setSegmentSizeMode( SegmentSizeMode mode );
|
||||
void setSegmentSizeMode( QgsScaleBarSettings::SegmentSizeMode mode );
|
||||
|
||||
/** Returns the minimum size (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
@ -102,7 +80,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see maxBarWidth
|
||||
* \since QGIS 2.9
|
||||
*/
|
||||
double minBarWidth() const { return mMinBarWidth; }
|
||||
double minBarWidth() const { return mSettings.minimumBarWidth(); }
|
||||
|
||||
/** Sets the minimum size (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
@ -123,7 +101,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see minBarWidth
|
||||
* \since QGIS 2.9
|
||||
*/
|
||||
double maxBarWidth() const { return mMaxBarWidth; }
|
||||
double maxBarWidth() const { return mSettings.maximumBarWidth(); }
|
||||
|
||||
/** Sets the maximum size (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
@ -136,11 +114,11 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
*/
|
||||
void setMaxBarWidth( double maxWidth );
|
||||
|
||||
double numMapUnitsPerScaleBarUnit() const {return mNumMapUnitsPerScaleBarUnit;}
|
||||
void setNumMapUnitsPerScaleBarUnit( double d ) {mNumMapUnitsPerScaleBarUnit = d;}
|
||||
double numMapUnitsPerScaleBarUnit() const {return mSettings.mapUnitsPerScaleBarUnit();}
|
||||
void setNumMapUnitsPerScaleBarUnit( double d ) { mSettings.setMapUnitsPerScaleBarUnit( d );}
|
||||
|
||||
QString unitLabeling() const {return mUnitLabeling;}
|
||||
void setUnitLabeling( const QString &label ) {mUnitLabeling = label;}
|
||||
QString unitLabeling() const {return mSettings.unitLabel();}
|
||||
void setUnitLabeling( const QString &label ) { mSettings.setUnitLabel( label );}
|
||||
|
||||
QFont font() const;
|
||||
void setFont( const QFont &font );
|
||||
@ -150,73 +128,73 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see setFontColor
|
||||
* \see font
|
||||
*/
|
||||
QColor fontColor() const {return mFontColor;}
|
||||
QColor fontColor() const {return mSettings.fontColor();}
|
||||
|
||||
/** Sets the color used for drawing text in the scalebar.
|
||||
* \param c font color for scalebar.
|
||||
* \see fontColor
|
||||
* \see setFont
|
||||
*/
|
||||
void setFontColor( const QColor &c ) {mFontColor = c;}
|
||||
void setFontColor( const QColor &c ) {mSettings.setFontColor( c );}
|
||||
|
||||
/** Returns the color used for fills in the scalebar.
|
||||
* \see setFillColor()
|
||||
* \see fillColor2()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
QColor fillColor() const {return mFillColor;}
|
||||
QColor fillColor() const {return mSettings.fillColor();}
|
||||
|
||||
/** Sets the color used for fills in the scalebar.
|
||||
* \see fillColor()
|
||||
* \see setFillColor2()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
void setFillColor( const QColor &color ) {mFillColor = color; mBrush.setColor( color ); }
|
||||
void setFillColor( const QColor &color ) {mSettings.setFillColor( color ); }
|
||||
|
||||
/** Returns the secondary color used for fills in the scalebar.
|
||||
* \see setFillColor2()
|
||||
* \see fillColor()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
QColor fillColor2() const {return mFillColor2;}
|
||||
QColor fillColor2() const {return mSettings.fillColor2();}
|
||||
|
||||
/** Sets the secondary color used for fills in the scalebar.
|
||||
* \see fillColor2()
|
||||
* \see setFillColor2()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
void setFillColor2( const QColor &color ) {mFillColor2 = color; mBrush2.setColor( color ); }
|
||||
void setFillColor2( const QColor &color ) {mSettings.setFillColor2( color ); }
|
||||
|
||||
/** Returns the color used for lines in the scalebar.
|
||||
* \see setLineColor()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
QColor lineColor() const {return mLineColor;}
|
||||
QColor lineColor() const {return mSettings.lineColor();}
|
||||
|
||||
/** Sets the color used for lines in the scalebar.
|
||||
* \see lineColor()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
void setLineColor( const QColor &color ) { mLineColor = color; mPen.setColor( mLineColor ); }
|
||||
void setLineColor( const QColor &color ) { mSettings.setLineColor( color ); }
|
||||
|
||||
/** Returns the line width in millimeters for lines in the scalebar.
|
||||
* \see setLineWidth()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
double lineWidth() const {return mLineWidth;}
|
||||
double lineWidth() const {return mSettings.lineWidth();}
|
||||
|
||||
/** Sets the line width in millimeters for lines in the scalebar.
|
||||
* \see lineWidth()
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
void setLineWidth( double width ) { mLineWidth = width; mPen.setWidthF( width ); }
|
||||
void setLineWidth( double width ) { mSettings.setLineWidth( width ); }
|
||||
|
||||
/** Returns the pen used for drawing the scalebar.
|
||||
* \returns QPen used for drawing the scalebar outlines.
|
||||
* \see setPen
|
||||
* \see brush
|
||||
*/
|
||||
QPen pen() const {return mPen;}
|
||||
QPen pen() const {return mSettings.pen();}
|
||||
|
||||
/** Returns the primary brush for the scalebar.
|
||||
* \returns QBrush used for filling the scalebar
|
||||
@ -224,7 +202,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see brush2
|
||||
* \see pen
|
||||
*/
|
||||
QBrush brush() const {return mBrush;}
|
||||
QBrush brush() const {return mSettings.brush();}
|
||||
|
||||
/** Returns the secondary brush for the scalebar. This is used for alternating color style scalebars, such
|
||||
* as single and double box styles.
|
||||
@ -232,37 +210,53 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \see setBrush2
|
||||
* \see brush
|
||||
*/
|
||||
QBrush brush2() const {return mBrush2;}
|
||||
QBrush brush2() const {return mSettings.brush2(); }
|
||||
|
||||
double height() const {return mHeight;}
|
||||
void setHeight( double h ) {mHeight = h;}
|
||||
double height() const { return mSettings.height(); }
|
||||
void setHeight( double h ) { mSettings.setHeight( h );}
|
||||
|
||||
void setComposerMap( const QgsComposerMap *map );
|
||||
const QgsComposerMap *composerMap() const {return mComposerMap;}
|
||||
/**
|
||||
* Sets the \a map item linked to the scalebar.
|
||||
*/
|
||||
void setComposerMap( QgsComposerMap *map );
|
||||
|
||||
double labelBarSpace() const {return mLabelBarSpace;}
|
||||
void setLabelBarSpace( double space ) {mLabelBarSpace = space;}
|
||||
/**
|
||||
* Returns the map item linked to the scalebar.
|
||||
*/
|
||||
QgsComposerMap *composerMap() const {return mComposerMap;}
|
||||
|
||||
double boxContentSpace() const {return mBoxContentSpace;}
|
||||
double labelBarSpace() const {return mSettings.labelBarSpace();}
|
||||
void setLabelBarSpace( double space ) {mSettings.setLabelBarSpace( space );}
|
||||
|
||||
double boxContentSpace() const {return mSettings.boxContentSpace();}
|
||||
void setBoxContentSpace( double space );
|
||||
|
||||
double segmentMillimeters() const {return mSegmentMillimeters;}
|
||||
/**
|
||||
* Returns the alignment of the scalebar.
|
||||
*/
|
||||
QgsScaleBarSettings::Alignment alignment() const { return mSettings.alignment(); }
|
||||
|
||||
//! Left / Middle/ Right
|
||||
Alignment alignment() const { return mAlignment; }
|
||||
/**
|
||||
* Sets the \a alignment of the scalebar.
|
||||
*/
|
||||
void setAlignment( QgsScaleBarSettings::Alignment alignment );
|
||||
|
||||
void setAlignment( Alignment a );
|
||||
/**
|
||||
* Returns the scalebar distance units.
|
||||
*/
|
||||
QgsUnitTypes::DistanceUnit units() const { return mSettings.units(); }
|
||||
|
||||
ScaleBarUnits units() const { return mUnits; }
|
||||
|
||||
void setUnits( ScaleBarUnits u );
|
||||
/**
|
||||
* Sets the scalebar distance units.
|
||||
*/
|
||||
void setUnits( QgsUnitTypes::DistanceUnit u );
|
||||
|
||||
/** Returns the join style used for drawing lines in the scalebar
|
||||
* \returns Join style for lines
|
||||
* \since QGIS 2.3
|
||||
* \see setLineJoinStyle
|
||||
*/
|
||||
Qt::PenJoinStyle lineJoinStyle() const { return mLineJoinStyle; }
|
||||
Qt::PenJoinStyle lineJoinStyle() const { return mSettings.lineJoinStyle(); }
|
||||
|
||||
/** Sets join style used when drawing the lines in the scalebar
|
||||
* \param style Join style for lines
|
||||
@ -277,7 +271,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
* \since QGIS 2.3
|
||||
* \see setLineCapStyle
|
||||
*/
|
||||
Qt::PenCapStyle lineCapStyle() const { return mLineCapStyle; }
|
||||
Qt::PenCapStyle lineCapStyle() const { return mSettings.lineCapStyle(); }
|
||||
|
||||
/** Sets cap style used when drawing the lines in the scalebar
|
||||
* \param style Cap style for lines
|
||||
@ -290,7 +284,7 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
//! Apply default settings
|
||||
void applyDefaultSettings();
|
||||
//! Apply default size (scale bar 1/5 of map item width)
|
||||
void applyDefaultSize( ScaleBarUnits u = Meters );
|
||||
void applyDefaultSize( QgsUnitTypes::DistanceUnit u = QgsUnitTypes::DistanceMeters );
|
||||
|
||||
/** Sets style by name
|
||||
\param styleName (untranslated) style name. Possibilities are: 'Single Box', 'Double Box', 'Line Ticks Middle', 'Line Ticks Down', 'Line Ticks Up', 'Numeric'*/
|
||||
@ -299,20 +293,12 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
//! Returns style name
|
||||
QString style() const;
|
||||
|
||||
/** Returns the x - positions of the segment borders (in item coordinates) and the width
|
||||
* of the segment
|
||||
* \note not available in Python bindings
|
||||
*/
|
||||
void segmentPositions( QList<QPair<double, double> > &posWidthList ) const;
|
||||
|
||||
//! Sets box size suitable to content
|
||||
void adjustBoxSize();
|
||||
|
||||
//! Adjusts box size and calls QgsComposerItem::update()
|
||||
void update();
|
||||
|
||||
//! Returns string of first label (important for drawing, labeling, size calculation
|
||||
QString firstLabelString() const;
|
||||
|
||||
/** Stores state in Dom element
|
||||
* \param elem is Dom element corresponding to 'Composer' tag
|
||||
@ -338,70 +324,27 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
|
||||
void invalidateCurrentMap();
|
||||
virtual void refreshDataDefinedProperty( const QgsComposerObject::DataDefinedProperty property = QgsComposerObject::AllProperties, const QgsExpressionContext *context = nullptr ) override;
|
||||
|
||||
protected:
|
||||
private:
|
||||
|
||||
//! Reference to composer map object
|
||||
const QgsComposerMap *mComposerMap = nullptr;
|
||||
//! Number of segments on right side
|
||||
int mNumSegments;
|
||||
//! Number of segments on left side
|
||||
int mNumSegmentsLeft;
|
||||
//! Size of a segment (in map units)
|
||||
double mNumUnitsPerSegment;
|
||||
//! Number of map units per scale bar units (e.g. 1000 to have km for a map with m units)
|
||||
double mNumMapUnitsPerScaleBarUnit;
|
||||
//! Either fixed (i.e. mNumUnitsPerSegment) or try to best fit scale bar width (mMinBarWidth, mMaxBarWidth)
|
||||
SegmentSizeMode mSegmentSizeMode;
|
||||
//! Minimum allowed bar width, when mSegmentSizeMode is FitWidth
|
||||
double mMinBarWidth;
|
||||
//! Maximum allowed bar width, when mSegmentSizeMode is FitWidth
|
||||
double mMaxBarWidth;
|
||||
QgsComposerMap *mComposerMap = nullptr;
|
||||
|
||||
QgsScaleBarSettings mSettings;
|
||||
|
||||
//! Labeling of map units
|
||||
QString mUnitLabeling;
|
||||
//! Font
|
||||
QFont mFont;
|
||||
QColor mFontColor;
|
||||
//! Fill color
|
||||
QColor mFillColor = QColor( 0, 0, 0 );
|
||||
//! Secondary fill color
|
||||
QColor mFillColor2 = QColor( 255, 255, 255 );
|
||||
//! Line color
|
||||
QColor mLineColor = QColor( 0, 0, 0 );
|
||||
//! Line width
|
||||
double mLineWidth = 0.3;
|
||||
//! Stroke
|
||||
QPen mPen;
|
||||
//! Fill
|
||||
QBrush mBrush;
|
||||
//! Secondary fill
|
||||
QBrush mBrush2;
|
||||
//! Height of bars/lines
|
||||
double mHeight;
|
||||
//! Scalebar style
|
||||
QgsScaleBarStyle *mStyle = nullptr;
|
||||
|
||||
//! Space between bar and Text labels
|
||||
double mLabelBarSpace;
|
||||
|
||||
//! Space between content and item box
|
||||
double mBoxContentSpace;
|
||||
QgsScaleBarRenderer *mStyle = nullptr;
|
||||
|
||||
//! Width of a segment (in mm)
|
||||
double mSegmentMillimeters;
|
||||
|
||||
Alignment mAlignment;
|
||||
|
||||
ScaleBarUnits mUnits;
|
||||
|
||||
Qt::PenJoinStyle mLineJoinStyle;
|
||||
Qt::PenCapStyle mLineCapStyle;
|
||||
|
||||
//! Calculates with of a segment in mm and stores it in mSegmentMillimeters
|
||||
void refreshSegmentMillimeters();
|
||||
|
||||
//! Returns diagonal of composer map in selected units (map units / meters / feet / nautical miles)
|
||||
double mapWidth() const;
|
||||
|
||||
QgsScaleBarRenderer::ScaleBarContext createScaleContext() const;
|
||||
|
||||
};
|
||||
|
||||
#endif //QGSCOMPOSERSCALEBAR_H
|
||||
|
@ -1,93 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsdoubleboxscalebarstyle.cpp
|
||||
-----------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsdoubleboxscalebarstyle.h"
|
||||
#include "qgscomposerscalebar.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QList>
|
||||
#include <QPainter>
|
||||
|
||||
QgsDoubleBoxScaleBarStyle::QgsDoubleBoxScaleBarStyle( const QgsComposerScaleBar *bar ): QgsScaleBarStyle( bar )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsDoubleBoxScaleBarStyle::QgsDoubleBoxScaleBarStyle(): QgsScaleBarStyle( nullptr )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QString QgsDoubleBoxScaleBarStyle::name() const
|
||||
{
|
||||
return QStringLiteral( "Double Box" );
|
||||
}
|
||||
|
||||
void QgsDoubleBoxScaleBarStyle::draw( QPainter *p, double xOffset ) const
|
||||
{
|
||||
if ( !mScaleBar )
|
||||
{
|
||||
return;
|
||||
}
|
||||
double barTopPosition = QgsComposerUtils::fontAscentMM( mScaleBar->font() ) + mScaleBar->labelBarSpace() + mScaleBar->boxContentSpace();
|
||||
double segmentHeight = mScaleBar->height() / 2;
|
||||
|
||||
p->save();
|
||||
//antialiasing on
|
||||
p->setRenderHint( QPainter::Antialiasing, true );
|
||||
p->setPen( mScaleBar->pen() );
|
||||
|
||||
QList<QPair<double, double> > segmentInfo;
|
||||
mScaleBar->segmentPositions( segmentInfo );
|
||||
|
||||
bool useColor = true; //alternate brush color/white
|
||||
|
||||
QList<QPair<double, double> >::const_iterator segmentIt = segmentInfo.constBegin();
|
||||
for ( ; segmentIt != segmentInfo.constEnd(); ++segmentIt )
|
||||
{
|
||||
//draw top half
|
||||
if ( useColor )
|
||||
{
|
||||
p->setBrush( mScaleBar->brush() );
|
||||
}
|
||||
else //secondary color
|
||||
{
|
||||
p->setBrush( mScaleBar->brush2() );
|
||||
}
|
||||
|
||||
QRectF segmentRectTop( segmentIt->first + xOffset, barTopPosition, segmentIt->second, segmentHeight );
|
||||
p->drawRect( segmentRectTop );
|
||||
|
||||
//draw bottom half
|
||||
if ( useColor )
|
||||
{
|
||||
//secondary color
|
||||
p->setBrush( mScaleBar->brush2() );
|
||||
}
|
||||
else //primary color
|
||||
{
|
||||
p->setBrush( mScaleBar->brush() );
|
||||
}
|
||||
|
||||
QRectF segmentRectBottom( segmentIt->first + xOffset, barTopPosition + segmentHeight, segmentIt->second, segmentHeight );
|
||||
p->drawRect( segmentRectBottom );
|
||||
useColor = !useColor;
|
||||
}
|
||||
|
||||
p->restore();
|
||||
|
||||
//draw labels using the default method
|
||||
drawLabels( p );
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsdoubleboxscalebarstyle.h
|
||||
---------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSDOUBLEBOXSCALEBARSTYLE_H
|
||||
#define QGSDOUBLEBOXSCALEBARSTYLE_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgsscalebarstyle.h"
|
||||
|
||||
/** \ingroup core
|
||||
* Double box with alternating colors
|
||||
*/
|
||||
class CORE_EXPORT QgsDoubleBoxScaleBarStyle: public QgsScaleBarStyle
|
||||
{
|
||||
public:
|
||||
QgsDoubleBoxScaleBarStyle( const QgsComposerScaleBar *bar );
|
||||
|
||||
QString name() const override;
|
||||
|
||||
void draw( QPainter *p, double xOffset = 0 ) const override;
|
||||
|
||||
private:
|
||||
QgsDoubleBoxScaleBarStyle(); //forbidden
|
||||
};
|
||||
|
||||
#endif
|
@ -1,123 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsnumericscalebarstyle.cpp
|
||||
---------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsnumericscalebarstyle.h"
|
||||
#include "qgscomposermap.h"
|
||||
#include "qgscomposerscalebar.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QList>
|
||||
#include <QPainter>
|
||||
|
||||
QgsNumericScaleBarStyle::QgsNumericScaleBarStyle( QgsComposerScaleBar *bar ): QgsScaleBarStyle( bar ), mLastScaleBarWidth( 0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsNumericScaleBarStyle::QgsNumericScaleBarStyle(): QgsScaleBarStyle( nullptr ), mLastScaleBarWidth( 0 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QString QgsNumericScaleBarStyle::name() const
|
||||
{
|
||||
return QStringLiteral( "Numeric" );
|
||||
}
|
||||
|
||||
void QgsNumericScaleBarStyle::draw( QPainter *p, double xOffset ) const
|
||||
{
|
||||
Q_UNUSED( xOffset );
|
||||
if ( !p || !mScaleBar )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
p->save();
|
||||
//antialiasing on
|
||||
p->setRenderHint( QPainter::Antialiasing, true );
|
||||
p->setFont( mScaleBar->font() );
|
||||
|
||||
//call QgsComposerItem's pen() function, since that refers to the frame pen
|
||||
//and QgsComposerScalebar's pen() function refers to the scale bar line width,
|
||||
//which is not used for numeric scale bars. Divide the pen width by 2 since
|
||||
//half the width of the frame is drawn outside the item.
|
||||
double penWidth = mScaleBar->QgsComposerItem::pen().widthF() / 2.0;
|
||||
double margin = mScaleBar->boxContentSpace();
|
||||
//map scalebar alignment to Qt::AlignmentFlag type
|
||||
Qt::AlignmentFlag hAlign;
|
||||
switch ( mScaleBar->alignment() )
|
||||
{
|
||||
case QgsComposerScaleBar::Left:
|
||||
hAlign = Qt::AlignLeft;
|
||||
break;
|
||||
case QgsComposerScaleBar::Middle:
|
||||
hAlign = Qt::AlignHCenter;
|
||||
break;
|
||||
case QgsComposerScaleBar::Right:
|
||||
hAlign = Qt::AlignRight;
|
||||
break;
|
||||
default:
|
||||
hAlign = Qt::AlignLeft;
|
||||
break;
|
||||
}
|
||||
|
||||
//text destination is item's rect, excluding the margin and frame
|
||||
QRectF painterRect( penWidth + margin, penWidth + margin, mScaleBar->rect().width() - 2 * penWidth - 2 * margin, mScaleBar->rect().height() - 2 * penWidth - 2 * margin );
|
||||
QgsComposerUtils::drawText( p, painterRect, scaleText(), mScaleBar->font(), mScaleBar->fontColor(), hAlign, Qt::AlignTop );
|
||||
|
||||
p->restore();
|
||||
}
|
||||
|
||||
QRectF QgsNumericScaleBarStyle::calculateBoxSize() const
|
||||
{
|
||||
QRectF rect;
|
||||
if ( !mScaleBar )
|
||||
{
|
||||
return rect;
|
||||
}
|
||||
|
||||
double textWidth = QgsComposerUtils::textWidthMM( mScaleBar->font(), scaleText() );
|
||||
double textHeight = QgsComposerUtils::fontAscentMM( mScaleBar->font() );
|
||||
|
||||
rect = QRectF( mScaleBar->pos().x(), mScaleBar->pos().y(), 2 * mScaleBar->boxContentSpace()
|
||||
+ 2 * mScaleBar->pen().width() + textWidth,
|
||||
textHeight + 2 * mScaleBar->boxContentSpace() );
|
||||
|
||||
if ( !qgsDoubleNear( mLastScaleBarWidth, rect.width() ) && mLastScaleBarWidth > 0 && rect.width() > 0 )
|
||||
{
|
||||
//hack to move scale bar the left / right in order to keep the bar alignment
|
||||
const_cast<QgsComposerScaleBar *>( mScaleBar )->correctXPositionAlignment( mLastScaleBarWidth, rect.width() );
|
||||
}
|
||||
mLastScaleBarWidth = rect.width();
|
||||
return rect;
|
||||
}
|
||||
|
||||
QString QgsNumericScaleBarStyle::scaleText() const
|
||||
{
|
||||
QString scaleBarText;
|
||||
if ( mScaleBar )
|
||||
{
|
||||
//find out scale
|
||||
double scaleDenominator = 1;
|
||||
const QgsComposerMap *composerMap = mScaleBar->composerMap();
|
||||
if ( composerMap )
|
||||
{
|
||||
scaleDenominator = composerMap->scale();
|
||||
scaleBarText = "1:" + QStringLiteral( "%L1" ).arg( scaleDenominator, 0, 'f', 0 );
|
||||
}
|
||||
scaleBarText = "1:" + QStringLiteral( "%L1" ).arg( scaleDenominator, 0, 'f', 0 );
|
||||
}
|
||||
return scaleBarText;
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsnumericscalebarstyle.h
|
||||
---------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSNUMERICSCALEBARSTYLE_H
|
||||
#define QGSNUMERICSCALEBARSTYLE_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgsscalebarstyle.h"
|
||||
|
||||
/** \ingroup core
|
||||
* A scale bar style that draws text in the form of '1:XXXXX'
|
||||
*/
|
||||
class CORE_EXPORT QgsNumericScaleBarStyle: public QgsScaleBarStyle
|
||||
{
|
||||
public:
|
||||
QgsNumericScaleBarStyle( QgsComposerScaleBar *bar );
|
||||
|
||||
QString name() const override;
|
||||
|
||||
void draw( QPainter *p, double xOffset = 0 ) const override;
|
||||
|
||||
//calculation of box size is different compared to segment based scale bars
|
||||
QRectF calculateBoxSize() const override;
|
||||
|
||||
private:
|
||||
QgsNumericScaleBarStyle(); //forbidden
|
||||
//! Returns the text for the scale bar or an empty string in case of error
|
||||
QString scaleText() const;
|
||||
|
||||
//! Store last width (in mm) to keep alignment to left/middle/right side
|
||||
mutable double mLastScaleBarWidth;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,132 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsscalebarstyle.cpp
|
||||
--------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsscalebarstyle.h"
|
||||
#include "qgscomposerscalebar.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QFontMetricsF>
|
||||
#include <QPainter>
|
||||
|
||||
QgsScaleBarStyle::QgsScaleBarStyle( const QgsComposerScaleBar *bar ): mScaleBar( bar )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsScaleBarStyle::QgsScaleBarStyle(): mScaleBar( nullptr )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void QgsScaleBarStyle::drawLabels( QPainter *p ) const
|
||||
{
|
||||
if ( !p || !mScaleBar )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
p->save();
|
||||
|
||||
p->setFont( mScaleBar->font() );
|
||||
p->setPen( QPen( mScaleBar->fontColor() ) );
|
||||
|
||||
QString firstLabel = mScaleBar->firstLabelString();
|
||||
double xOffset = QgsComposerUtils::textWidthMM( mScaleBar->font(), firstLabel ) / 2;
|
||||
|
||||
//double mCurrentXCoord = mScaleBar->pen().widthF() + mScaleBar->boxContentSpace();
|
||||
QList<QPair<double, double> > segmentInfo;
|
||||
mScaleBar->segmentPositions( segmentInfo );
|
||||
|
||||
double currentLabelNumber = 0.0;
|
||||
|
||||
int nSegmentsLeft = mScaleBar->numSegmentsLeft();
|
||||
int segmentCounter = 0;
|
||||
QString currentNumericLabel;
|
||||
|
||||
QList<QPair<double, double> >::const_iterator segmentIt = segmentInfo.constBegin();
|
||||
for ( ; segmentIt != segmentInfo.constEnd(); ++segmentIt )
|
||||
{
|
||||
if ( segmentCounter == 0 && nSegmentsLeft > 0 )
|
||||
{
|
||||
//label first left segment
|
||||
currentNumericLabel = firstLabel;
|
||||
}
|
||||
else if ( segmentCounter != 0 && segmentCounter == nSegmentsLeft ) //reset label number to 0 if there are left segments
|
||||
{
|
||||
currentLabelNumber = 0;
|
||||
}
|
||||
|
||||
if ( segmentCounter >= nSegmentsLeft )
|
||||
{
|
||||
currentNumericLabel = QString::number( currentLabelNumber / mScaleBar->numMapUnitsPerScaleBarUnit() );
|
||||
}
|
||||
|
||||
if ( segmentCounter == 0 || segmentCounter >= nSegmentsLeft ) //don't draw label for intermediate left segments
|
||||
{
|
||||
QgsComposerUtils::drawText( p, QPointF( segmentIt->first - QgsComposerUtils::textWidthMM( mScaleBar->font(), currentNumericLabel ) / 2 + xOffset, QgsComposerUtils::fontAscentMM( mScaleBar->font() ) + mScaleBar->boxContentSpace() ),
|
||||
currentNumericLabel, mScaleBar->font(), mScaleBar->fontColor() );
|
||||
}
|
||||
|
||||
if ( segmentCounter >= nSegmentsLeft )
|
||||
{
|
||||
currentLabelNumber += mScaleBar->numUnitsPerSegment();
|
||||
}
|
||||
++segmentCounter;
|
||||
}
|
||||
|
||||
//also draw the last label
|
||||
if ( !segmentInfo.isEmpty() )
|
||||
{
|
||||
currentNumericLabel = QString::number( currentLabelNumber / mScaleBar->numMapUnitsPerScaleBarUnit() );
|
||||
QgsComposerUtils::drawText( p, QPointF( segmentInfo.last().first + mScaleBar->segmentMillimeters() - QgsComposerUtils::textWidthMM( mScaleBar->font(), currentNumericLabel ) / 2 + xOffset, QgsComposerUtils::fontAscentMM( mScaleBar->font() ) + mScaleBar->boxContentSpace() ),
|
||||
currentNumericLabel + ' ' + mScaleBar->unitLabeling(), mScaleBar->font(), mScaleBar->fontColor() );
|
||||
}
|
||||
|
||||
p->restore();
|
||||
}
|
||||
|
||||
QRectF QgsScaleBarStyle::calculateBoxSize() const
|
||||
{
|
||||
if ( !mScaleBar )
|
||||
{
|
||||
return QRectF();
|
||||
}
|
||||
|
||||
//consider centered first label
|
||||
double firstLabelLeft = QgsComposerUtils::textWidthMM( mScaleBar->font(), mScaleBar->firstLabelString() ) / 2;
|
||||
|
||||
//consider last number and label
|
||||
|
||||
double largestLabelNumber = mScaleBar->numSegments() * mScaleBar->numUnitsPerSegment() / mScaleBar->numMapUnitsPerScaleBarUnit();
|
||||
QString largestNumberLabel = QString::number( largestLabelNumber );
|
||||
QString largestLabel = QString::number( largestLabelNumber ) + ' ' + mScaleBar->unitLabeling();
|
||||
double largestLabelWidth = QgsComposerUtils::textWidthMM( mScaleBar->font(), largestLabel ) - QgsComposerUtils::textWidthMM( mScaleBar->font(), largestNumberLabel ) / 2;
|
||||
|
||||
double totalBarLength = 0.0;
|
||||
|
||||
QList< QPair<double, double> > segmentList;
|
||||
mScaleBar->segmentPositions( segmentList );
|
||||
|
||||
QList< QPair<double, double> >::const_iterator segmentIt = segmentList.constBegin();
|
||||
for ( ; segmentIt != segmentList.constEnd(); ++segmentIt )
|
||||
{
|
||||
totalBarLength += segmentIt->second;
|
||||
}
|
||||
|
||||
double width = firstLabelLeft + totalBarLength + 2 * mScaleBar->pen().widthF() + largestLabelWidth + 2 * mScaleBar->boxContentSpace();
|
||||
double height = mScaleBar->height() + mScaleBar->labelBarSpace() + 2 * mScaleBar->boxContentSpace() + QgsComposerUtils::fontAscentMM( mScaleBar->font() );
|
||||
|
||||
return QRectF( mScaleBar->pos().x(), mScaleBar->pos().y(), width, height );
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsscalebarstyle.h
|
||||
------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSSCALEBARSTYLE_H
|
||||
#define QGSSCALEBARSTYLE_H
|
||||
|
||||
#include <QIcon>
|
||||
#include <QRectF>
|
||||
|
||||
#include "qgis_core.h"
|
||||
|
||||
class QgsComposerScaleBar;
|
||||
class QPainter;
|
||||
|
||||
/** \ingroup core
|
||||
* Abstraction of composer scale bar style. Subclasses draw themselves, have the
|
||||
possibility to implement custom labeling and calculate corresponding box size.
|
||||
*/
|
||||
class CORE_EXPORT QgsScaleBarStyle
|
||||
{
|
||||
public:
|
||||
QgsScaleBarStyle( const QgsComposerScaleBar *bar );
|
||||
virtual ~QgsScaleBarStyle() = default;
|
||||
|
||||
/** Draws the style
|
||||
\param p painter object
|
||||
\param xOffset offset to account for centered labeling*/
|
||||
virtual void draw( QPainter *p, double xOffset = 0 ) const = 0; //to do by every subclass
|
||||
virtual void drawLabels( QPainter *p ) const; //default implementation provided
|
||||
virtual QRectF calculateBoxSize() const; //default implementation provided
|
||||
|
||||
/**
|
||||
* Get a name for this style.
|
||||
* Needs to be remiplmeented by subclasses.
|
||||
*/
|
||||
virtual QString name() const = 0;
|
||||
|
||||
private:
|
||||
QgsScaleBarStyle(); //default constructor forbidden
|
||||
|
||||
protected:
|
||||
const QgsComposerScaleBar *mScaleBar = nullptr;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,83 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgssingleboxscalebarstyle.h
|
||||
------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgssingleboxscalebarstyle.h"
|
||||
#include "qgscomposerscalebar.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QList>
|
||||
#include <QPainter>
|
||||
|
||||
QgsSingleBoxScaleBarStyle::QgsSingleBoxScaleBarStyle( const QgsComposerScaleBar *bar ): QgsScaleBarStyle( bar )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsSingleBoxScaleBarStyle::QgsSingleBoxScaleBarStyle(): QgsScaleBarStyle( nullptr )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsSingleBoxScaleBarStyle::~QgsSingleBoxScaleBarStyle()
|
||||
{
|
||||
//nothing to do...
|
||||
}
|
||||
|
||||
void QgsSingleBoxScaleBarStyle::draw( QPainter *p, double xOffset ) const
|
||||
{
|
||||
if ( !mScaleBar )
|
||||
{
|
||||
return;
|
||||
}
|
||||
double barTopPosition = QgsComposerUtils::fontAscentMM( mScaleBar->font() ) + mScaleBar->labelBarSpace() + mScaleBar->boxContentSpace();
|
||||
|
||||
p->save();
|
||||
//antialiasing on
|
||||
p->setRenderHint( QPainter::Antialiasing, true );
|
||||
p->setPen( mScaleBar->pen() );
|
||||
|
||||
QList<QPair<double, double> > segmentInfo;
|
||||
mScaleBar->segmentPositions( segmentInfo );
|
||||
|
||||
bool useColor = true; //alternate brush color/white
|
||||
|
||||
QList<QPair<double, double> >::const_iterator segmentIt = segmentInfo.constBegin();
|
||||
for ( ; segmentIt != segmentInfo.constEnd(); ++segmentIt )
|
||||
{
|
||||
if ( useColor ) //alternating colors
|
||||
{
|
||||
p->setBrush( mScaleBar->brush() );
|
||||
}
|
||||
else //secondary color
|
||||
{
|
||||
p->setBrush( mScaleBar->brush2() );
|
||||
}
|
||||
|
||||
QRectF segmentRect( segmentIt->first + xOffset, barTopPosition, segmentIt->second, mScaleBar->height() );
|
||||
p->drawRect( segmentRect );
|
||||
useColor = !useColor;
|
||||
}
|
||||
|
||||
p->restore();
|
||||
|
||||
//draw labels using the default method
|
||||
drawLabels( p );
|
||||
}
|
||||
|
||||
QString QgsSingleBoxScaleBarStyle::name() const
|
||||
{
|
||||
return QStringLiteral( "Single Box" );
|
||||
}
|
||||
|
@ -1,99 +0,0 @@
|
||||
/***************************************************************************
|
||||
qgsticksscalebarstyle.cpp
|
||||
-------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsticksscalebarstyle.h"
|
||||
#include "qgscomposerscalebar.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QPainter>
|
||||
|
||||
QgsTicksScaleBarStyle::QgsTicksScaleBarStyle( const QgsComposerScaleBar *bar ): QgsScaleBarStyle( bar )
|
||||
{
|
||||
mTickPosition = TicksMiddle;
|
||||
}
|
||||
|
||||
QgsTicksScaleBarStyle::QgsTicksScaleBarStyle(): QgsScaleBarStyle( nullptr )
|
||||
{
|
||||
mTickPosition = TicksMiddle;
|
||||
}
|
||||
|
||||
QString QgsTicksScaleBarStyle::name() const
|
||||
{
|
||||
switch ( mTickPosition )
|
||||
{
|
||||
case TicksUp:
|
||||
return QStringLiteral( "Line Ticks Up" );
|
||||
case TicksDown:
|
||||
return QStringLiteral( "Line Ticks Down" );
|
||||
case TicksMiddle:
|
||||
return QStringLiteral( "Line Ticks Middle" );
|
||||
}
|
||||
return QLatin1String( "" ); // to make gcc happy
|
||||
}
|
||||
|
||||
void QgsTicksScaleBarStyle::draw( QPainter *p, double xOffset ) const
|
||||
{
|
||||
if ( !mScaleBar )
|
||||
{
|
||||
return;
|
||||
}
|
||||
double barTopPosition = QgsComposerUtils::fontAscentMM( mScaleBar->font() ) + mScaleBar->labelBarSpace() + mScaleBar->boxContentSpace();
|
||||
double middlePosition = barTopPosition + mScaleBar->height() / 2.0;
|
||||
double bottomPosition = barTopPosition + mScaleBar->height();
|
||||
|
||||
p->save();
|
||||
//antialiasing on
|
||||
p->setRenderHint( QPainter::Antialiasing, true );
|
||||
p->setPen( mScaleBar->pen() );
|
||||
|
||||
QList<QPair<double, double> > segmentInfo;
|
||||
mScaleBar->segmentPositions( segmentInfo );
|
||||
|
||||
QList<QPair<double, double> >::const_iterator segmentIt = segmentInfo.constBegin();
|
||||
for ( ; segmentIt != segmentInfo.constEnd(); ++segmentIt )
|
||||
{
|
||||
p->drawLine( QLineF( segmentIt->first + xOffset, barTopPosition, segmentIt->first + xOffset, barTopPosition + mScaleBar->height() ) );
|
||||
}
|
||||
|
||||
//draw last tick and horizontal line
|
||||
if ( !segmentInfo.isEmpty() )
|
||||
{
|
||||
double lastTickPositionX = segmentInfo.last().first + mScaleBar->segmentMillimeters() + xOffset;
|
||||
double verticalPos = 0.0;
|
||||
switch ( mTickPosition )
|
||||
{
|
||||
case TicksDown:
|
||||
verticalPos = barTopPosition;
|
||||
break;
|
||||
case TicksMiddle:
|
||||
verticalPos = middlePosition;
|
||||
break;
|
||||
case TicksUp:
|
||||
verticalPos = bottomPosition;
|
||||
break;
|
||||
}
|
||||
//horizontal line
|
||||
p->drawLine( QLineF( xOffset + segmentInfo.at( 0 ).first, verticalPos, lastTickPositionX, verticalPos ) );
|
||||
//last vertical line
|
||||
p->drawLine( QLineF( lastTickPositionX, barTopPosition, lastTickPositionX, barTopPosition + mScaleBar->height() ) );
|
||||
}
|
||||
|
||||
p->restore();
|
||||
|
||||
//draw labels using the default method
|
||||
drawLabels( p );
|
||||
}
|
||||
|
||||
|
81
src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp
Normal file
81
src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp
Normal file
@ -0,0 +1,81 @@
|
||||
/***************************************************************************
|
||||
qgsdoubleboxscalebarrenderer.cpp
|
||||
--------------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsdoubleboxscalebarrenderer.h"
|
||||
#include "qgsscalebarsettings.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QList>
|
||||
#include <QPainter>
|
||||
|
||||
void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
if ( !context.painter() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
QPainter *painter = context.painter();
|
||||
|
||||
double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace();
|
||||
double segmentHeight = settings.height() / 2;
|
||||
|
||||
painter->save();
|
||||
if ( context.flags() & QgsRenderContext::Antialiasing )
|
||||
painter->setRenderHint( QPainter::Antialiasing, true );
|
||||
painter->setPen( settings.pen() );
|
||||
|
||||
bool useColor = true; //alternate brush color/white
|
||||
|
||||
double xOffset = firstLabelXOffset( settings );
|
||||
|
||||
QList<double> positions = segmentPositions( scaleContext, settings );
|
||||
QList<double> widths = segmentWidths( scaleContext, settings );
|
||||
|
||||
for ( int i = 0; i < positions.size(); ++i )
|
||||
{
|
||||
//draw top half
|
||||
if ( useColor )
|
||||
{
|
||||
painter->setBrush( settings.brush() );
|
||||
}
|
||||
else //secondary color
|
||||
{
|
||||
painter->setBrush( settings.brush2() );
|
||||
}
|
||||
|
||||
QRectF segmentRectTop( positions.at( i ) + xOffset, barTopPosition, widths.at( i ), segmentHeight );
|
||||
painter->drawRect( segmentRectTop );
|
||||
|
||||
//draw bottom half
|
||||
if ( useColor )
|
||||
{
|
||||
//secondary color
|
||||
painter->setBrush( settings.brush2() );
|
||||
}
|
||||
else //primary color
|
||||
{
|
||||
painter->setBrush( settings.brush() );
|
||||
}
|
||||
|
||||
QRectF segmentRectBottom( positions.at( i ) + xOffset, barTopPosition + segmentHeight, widths.at( i ), segmentHeight );
|
||||
painter->drawRect( segmentRectBottom );
|
||||
useColor = !useColor;
|
||||
}
|
||||
|
||||
painter->restore();
|
||||
|
||||
//draw labels using the default method
|
||||
drawDefaultLabels( context, settings, scaleContext );
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
/***************************************************************************
|
||||
qgsticksscalebarstyle.h
|
||||
-----------------------------
|
||||
qgsdoubleboxscalebarrenderer.h
|
||||
------------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
@ -14,41 +14,34 @@
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSTICKSSCALEBARSTYLE_H
|
||||
#define QGSTICKSSCALEBARSTYLE_H
|
||||
#ifndef QGSDOUBLEBOXSCALEBARRENDERER_H
|
||||
#define QGSDOUBLEBOXSCALEBARRENDERER_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgsscalebarstyle.h"
|
||||
#include "qgsscalebarrenderer.h"
|
||||
#include <QString>
|
||||
|
||||
/** \ingroup core
|
||||
* A scale bar that draws segments using short ticks.
|
||||
/**
|
||||
* \class QgsDoubleBoxScaleBarRenderer
|
||||
* \ingroup core
|
||||
* Double box with alternating colors.
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
class CORE_EXPORT QgsTicksScaleBarStyle: public QgsScaleBarStyle
|
||||
class CORE_EXPORT QgsDoubleBoxScaleBarRenderer: public QgsScaleBarRenderer
|
||||
{
|
||||
public:
|
||||
enum TickPosition
|
||||
{
|
||||
TicksUp,
|
||||
TicksDown,
|
||||
TicksMiddle
|
||||
};
|
||||
|
||||
QgsTicksScaleBarStyle( const QgsComposerScaleBar *bar );
|
||||
|
||||
QString name() const override;
|
||||
|
||||
/** Draw method
|
||||
\param p painter object
|
||||
\param xOffset offset
|
||||
/**
|
||||
* Constructor for QgsDoubleBoxScaleBarRenderer.
|
||||
*/
|
||||
void draw( QPainter *p, double xOffset = 0 ) const override;
|
||||
QgsDoubleBoxScaleBarRenderer() = default;
|
||||
|
||||
void setTickPosition( TickPosition p ) {mTickPosition = p;}
|
||||
QString name() const override { return QStringLiteral( "Double Box" ); }
|
||||
|
||||
private:
|
||||
QgsTicksScaleBarStyle(); //forbidden
|
||||
void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const override;
|
||||
|
||||
TickPosition mTickPosition;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // QGSDOUBLEBOXSCALEBARRENDERER_H
|
75
src/core/scalebar/qgsnumericscalebarrenderer.cpp
Normal file
75
src/core/scalebar/qgsnumericscalebarrenderer.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
/***************************************************************************
|
||||
qgsnumericscalebarrenderer.cpp
|
||||
------------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsnumericscalebarrenderer.h"
|
||||
#include "qgsscalebarsettings.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QList>
|
||||
#include <QPainter>
|
||||
|
||||
void QgsNumericScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
if ( !context.painter() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QPainter *painter = context.painter();
|
||||
|
||||
painter->save();
|
||||
if ( context.flags() & QgsRenderContext::Antialiasing )
|
||||
painter->setRenderHint( QPainter::Antialiasing, true );
|
||||
painter->setFont( settings.font() );
|
||||
|
||||
double margin = settings.boxContentSpace();
|
||||
//map scalebar alignment to Qt::AlignmentFlag type
|
||||
Qt::AlignmentFlag hAlign = Qt::AlignLeft;
|
||||
switch ( settings.alignment() )
|
||||
{
|
||||
case QgsScaleBarSettings::AlignLeft:
|
||||
hAlign = Qt::AlignLeft;
|
||||
break;
|
||||
case QgsScaleBarSettings::AlignMiddle:
|
||||
hAlign = Qt::AlignHCenter;
|
||||
break;
|
||||
case QgsScaleBarSettings::AlignRight:
|
||||
hAlign = Qt::AlignRight;
|
||||
break;
|
||||
}
|
||||
|
||||
//text destination is item's rect, excluding the margin
|
||||
QRectF painterRect( margin, margin, scaleContext.size.width() - 2 * margin, scaleContext.size.height() - 2 * margin );
|
||||
QgsComposerUtils::drawText( painter, painterRect, scaleText( scaleContext.scale ), settings.font(), settings.fontColor(), hAlign, Qt::AlignTop );
|
||||
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
QSizeF QgsNumericScaleBarRenderer::calculateBoxSize( const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
QRectF rect;
|
||||
|
||||
double textWidth = QgsComposerUtils::textWidthMM( settings.font(), scaleText( scaleContext.scale ) );
|
||||
double textHeight = QgsComposerUtils::fontAscentMM( settings.font() );
|
||||
|
||||
return QSizeF( 2 * settings.boxContentSpace() + 2 * settings.pen().width() + textWidth,
|
||||
textHeight + 2 * settings.boxContentSpace() );
|
||||
}
|
||||
|
||||
QString QgsNumericScaleBarRenderer::scaleText( double scale ) const
|
||||
{
|
||||
return "1:" + QStringLiteral( "%L1" ).arg( scale, 0, 'f', 0 );
|
||||
}
|
55
src/core/scalebar/qgsnumericscalebarrenderer.h
Normal file
55
src/core/scalebar/qgsnumericscalebarrenderer.h
Normal file
@ -0,0 +1,55 @@
|
||||
/***************************************************************************
|
||||
qgsnumericscalebarrenderer.h
|
||||
----------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSNUMERICSCALEBARRENDERER_H
|
||||
#define QGSNUMERICSCALEBARRENDERER_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgsscalebarrenderer.h"
|
||||
#include <QString>
|
||||
|
||||
/**
|
||||
* \class QgsNumericScaleBarRenderer
|
||||
* \ingroup core
|
||||
* A scale bar style that draws text in the form of '1:XXXXX'.
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
class CORE_EXPORT QgsNumericScaleBarRenderer: public QgsScaleBarRenderer
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor for QgsNumericScaleBarRenderer.
|
||||
*/
|
||||
QgsNumericScaleBarRenderer() = default;
|
||||
|
||||
QString name() const override { return QStringLiteral( "Numeric" ); }
|
||||
|
||||
void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const override;
|
||||
|
||||
QSizeF calculateBoxSize( const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const override;
|
||||
|
||||
private:
|
||||
|
||||
//! Returns the text for the scale bar or an empty string in case of error
|
||||
QString scaleText( double scale ) const;
|
||||
|
||||
};
|
||||
|
||||
#endif // QGSNUMERICSCALEBARRENDERER_H
|
172
src/core/scalebar/qgsscalebarrenderer.cpp
Normal file
172
src/core/scalebar/qgsscalebarrenderer.cpp
Normal file
@ -0,0 +1,172 @@
|
||||
/***************************************************************************
|
||||
qgsscalebarrenderer.cpp
|
||||
-----------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsscalebarrenderer.h"
|
||||
#include "qgsscalebarsettings.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QFontMetricsF>
|
||||
#include <QPainter>
|
||||
|
||||
void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
if ( !context.painter() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QPainter *painter = context.painter();
|
||||
|
||||
painter->save();
|
||||
|
||||
painter->setFont( settings.font() );
|
||||
painter->setPen( QPen( settings.fontColor() ) );
|
||||
|
||||
QString firstLabel = firstLabelString( settings );
|
||||
double xOffset = QgsComposerUtils::textWidthMM( settings.font(), firstLabel ) / 2;
|
||||
|
||||
double currentLabelNumber = 0.0;
|
||||
|
||||
int nSegmentsLeft = settings.numberOfSegmentsLeft();
|
||||
int segmentCounter = 0;
|
||||
QString currentNumericLabel;
|
||||
|
||||
QList<double> positions = segmentPositions( scaleContext, settings );
|
||||
|
||||
for ( int i = 0; i < positions.size(); ++i )
|
||||
{
|
||||
if ( segmentCounter == 0 && nSegmentsLeft > 0 )
|
||||
{
|
||||
//label first left segment
|
||||
currentNumericLabel = firstLabel;
|
||||
}
|
||||
else if ( segmentCounter != 0 && segmentCounter == nSegmentsLeft ) //reset label number to 0 if there are left segments
|
||||
{
|
||||
currentLabelNumber = 0;
|
||||
}
|
||||
|
||||
if ( segmentCounter >= nSegmentsLeft )
|
||||
{
|
||||
currentNumericLabel = QString::number( currentLabelNumber / settings.mapUnitsPerScaleBarUnit() );
|
||||
}
|
||||
|
||||
if ( segmentCounter == 0 || segmentCounter >= nSegmentsLeft ) //don't draw label for intermediate left segments
|
||||
{
|
||||
QgsComposerUtils::drawText( painter, QPointF( positions.at( i ) - QgsComposerUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2 + xOffset, QgsComposerUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace() ),
|
||||
currentNumericLabel, settings.font(), settings.fontColor() );
|
||||
}
|
||||
|
||||
if ( segmentCounter >= nSegmentsLeft )
|
||||
{
|
||||
currentLabelNumber += settings.unitsPerSegment();
|
||||
}
|
||||
++segmentCounter;
|
||||
}
|
||||
|
||||
//also draw the last label
|
||||
if ( !positions.isEmpty() )
|
||||
{
|
||||
currentNumericLabel = QString::number( currentLabelNumber / settings.mapUnitsPerScaleBarUnit() );
|
||||
QgsComposerUtils::drawText( painter, QPointF( positions.at( positions.size() - 1 ) + scaleContext.segmentWidth - QgsComposerUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2 + xOffset, QgsComposerUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace() ),
|
||||
currentNumericLabel + ' ' + settings.unitLabel(), settings.font(), settings.fontColor() );
|
||||
}
|
||||
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
QSizeF QgsScaleBarRenderer::calculateBoxSize( const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
//consider centered first label
|
||||
double firstLabelLeft = QgsComposerUtils::textWidthMM( settings.font(), firstLabelString( settings ) ) / 2;
|
||||
|
||||
//consider last number and label
|
||||
|
||||
double largestLabelNumber = settings.numberOfSegments() * settings.unitsPerSegment() / settings.mapUnitsPerScaleBarUnit();
|
||||
QString largestNumberLabel = QString::number( largestLabelNumber );
|
||||
QString largestLabel = QString::number( largestLabelNumber ) + ' ' + settings.unitLabel();
|
||||
double largestLabelWidth = QgsComposerUtils::textWidthMM( settings.font(), largestLabel ) - QgsComposerUtils::textWidthMM( settings.font(), largestNumberLabel ) / 2;
|
||||
|
||||
double totalBarLength = scaleContext.segmentWidth * ( settings.numberOfSegments() + ( settings.numberOfSegmentsLeft() > 0 ? 1 : 0 ) );
|
||||
|
||||
double width = firstLabelLeft + totalBarLength + 2 * settings.pen().widthF() + largestLabelWidth + 2 * settings.boxContentSpace();
|
||||
double height = settings.height() + settings.labelBarSpace() + 2 * settings.boxContentSpace() + QgsComposerUtils::fontAscentMM( settings.font() );
|
||||
|
||||
return QSizeF( width, height );
|
||||
}
|
||||
|
||||
QString QgsScaleBarRenderer::firstLabelString( const QgsScaleBarSettings &settings ) const
|
||||
{
|
||||
if ( settings.numberOfSegmentsLeft() > 0 )
|
||||
{
|
||||
return QString::number( settings.unitsPerSegment() / settings.mapUnitsPerScaleBarUnit() );
|
||||
}
|
||||
else
|
||||
{
|
||||
return QStringLiteral( "0" );
|
||||
}
|
||||
}
|
||||
|
||||
double QgsScaleBarRenderer::firstLabelXOffset( const QgsScaleBarSettings &settings ) const
|
||||
{
|
||||
QString firstLabel = firstLabelString( settings );
|
||||
return QgsComposerUtils::textWidthMM( settings.font(), firstLabel ) / 2.0;
|
||||
}
|
||||
|
||||
QList<double> QgsScaleBarRenderer::segmentPositions( const ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const
|
||||
{
|
||||
QList<double> positions;
|
||||
|
||||
double currentXCoord = settings.pen().widthF() + settings.boxContentSpace();
|
||||
|
||||
//left segments
|
||||
double leftSegmentSize = scaleContext.segmentWidth / settings.numberOfSegmentsLeft();
|
||||
for ( int i = 0; i < settings.numberOfSegmentsLeft(); ++i )
|
||||
{
|
||||
positions << currentXCoord;
|
||||
currentXCoord += leftSegmentSize;
|
||||
}
|
||||
|
||||
//right segments
|
||||
for ( int i = 0; i < settings.numberOfSegments(); ++i )
|
||||
{
|
||||
positions << currentXCoord;
|
||||
currentXCoord += scaleContext.segmentWidth;
|
||||
}
|
||||
return positions;
|
||||
}
|
||||
|
||||
QList<double> QgsScaleBarRenderer::segmentWidths( const ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const
|
||||
{
|
||||
QList<double> widths;
|
||||
|
||||
//left segments
|
||||
if ( settings.numberOfSegmentsLeft() > 0 )
|
||||
{
|
||||
double leftSegmentSize = scaleContext.segmentWidth / settings.numberOfSegmentsLeft();
|
||||
for ( int i = 0; i < settings.numberOfSegmentsLeft(); ++i )
|
||||
{
|
||||
widths << leftSegmentSize;
|
||||
}
|
||||
}
|
||||
|
||||
//right segments
|
||||
for ( int i = 0; i < settings.numberOfSegments(); ++i )
|
||||
{
|
||||
widths << scaleContext.segmentWidth;
|
||||
}
|
||||
|
||||
return widths;
|
||||
}
|
116
src/core/scalebar/qgsscalebarrenderer.h
Normal file
116
src/core/scalebar/qgsscalebarrenderer.h
Normal file
@ -0,0 +1,116 @@
|
||||
/***************************************************************************
|
||||
qgsscalebarrenderer.h
|
||||
---------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSSCALEBARRENDERER_H
|
||||
#define QGSSCALEBARRENDERER_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include <QRectF>
|
||||
#include <QList>
|
||||
|
||||
class QgsRenderContext;
|
||||
class QgsScaleBarSettings;
|
||||
|
||||
/**
|
||||
* \ingroup core
|
||||
* \class QgsScaleBarRenderer
|
||||
* Abstract base class for scale bar renderers.
|
||||
*
|
||||
* Scalebar renderer subclasses implement custom drawing logic, with the possibility to implement
|
||||
* custom labeling.
|
||||
*
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
class CORE_EXPORT QgsScaleBarRenderer
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Contains parameters regarding scalebar calculations.
|
||||
*/
|
||||
struct ScaleBarContext
|
||||
{
|
||||
//! Width of each individual segment (in millimeters)
|
||||
double segmentWidth { 0.0 };
|
||||
|
||||
/**
|
||||
* Destination size for scalebar. This is used for scalebars which
|
||||
* alter their appearance or alignment based on the desired scalebar
|
||||
* size (e.g. correctly aligning text in a numeric scale bar).
|
||||
*/
|
||||
QSizeF size;
|
||||
|
||||
//! Scale denominator
|
||||
double scale { 1.0 };
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor for QgsScaleBarRenderer.
|
||||
*/
|
||||
QgsScaleBarRenderer() = default;
|
||||
virtual ~QgsScaleBarRenderer() = default;
|
||||
|
||||
/**
|
||||
* Returns the unique name for this style.
|
||||
*/
|
||||
virtual QString name() const = 0;
|
||||
|
||||
/**
|
||||
* Draws the scalebar using the specified \a settings and \a scaleContext to a destination render \a context.
|
||||
*/
|
||||
virtual void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const = 0;
|
||||
|
||||
/**
|
||||
* Calculates the required box size (in millimeters) for a scalebar using the specified \a settings and \a scaleContext.
|
||||
*/
|
||||
virtual QSizeF calculateBoxSize( const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Draws default scalebar labels using the specified \a settings and \a scaleContext to a destination render \a context.
|
||||
*/
|
||||
void drawDefaultLabels( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const;
|
||||
|
||||
/**
|
||||
* Returns the text used for the first label in the scalebar.
|
||||
*/
|
||||
QString firstLabelString( const QgsScaleBarSettings &settings ) const;
|
||||
|
||||
/**
|
||||
* Returns the x-offset (in millimeters) used for the first label in the scalebar.
|
||||
*/
|
||||
double firstLabelXOffset( const QgsScaleBarSettings &settings ) const;
|
||||
|
||||
/**
|
||||
* Returns a list of positions for each segment within the scalebar.
|
||||
*/
|
||||
QList<double> segmentPositions( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const;
|
||||
|
||||
/**
|
||||
* Returns a list of widths of each segment of the scalebar.
|
||||
*/
|
||||
QList<double> segmentWidths( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const;
|
||||
|
||||
};
|
||||
|
||||
#endif //QGSSCALEBARRENDERER_H
|
456
src/core/scalebar/qgsscalebarsettings.h
Normal file
456
src/core/scalebar/qgsscalebarsettings.h
Normal file
@ -0,0 +1,456 @@
|
||||
/***************************************************************************
|
||||
qgsscalebarsettings.h
|
||||
---------------------
|
||||
begin : April 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSSCALEBARSETTINGS_H
|
||||
#define QGSSCALEBARSETTINGS_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgis.h"
|
||||
#include "qgsunittypes.h"
|
||||
#include <QColor>
|
||||
#include <QFont>
|
||||
#include <QPen>
|
||||
#include <QBrush>
|
||||
|
||||
/**
|
||||
* \class QgsScaleBarSettings
|
||||
* \ingroup core
|
||||
* The QgsScaleBarSettings class stores the appearance and layout settings
|
||||
* for scalebar drawing with QgsScaleBarRenderer.
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
class CORE_EXPORT QgsScaleBarSettings
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Scalebar alignment.
|
||||
*/
|
||||
enum Alignment
|
||||
{
|
||||
AlignLeft = 0, //!< Left aligned
|
||||
AlignMiddle, //!< Center aligned
|
||||
AlignRight, //!< Right aligned
|
||||
};
|
||||
|
||||
/**
|
||||
* Modes for setting size for scale bar segments.
|
||||
*/
|
||||
enum SegmentSizeMode
|
||||
{
|
||||
SegmentSizeFixed = 0, //!< Scale bar segment size is fixed to a map unit
|
||||
SegmentSizeFitWidth = 1 //!< Scale bar segment size is calculated to fit a size range
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor for QgsScaleBarSettings.
|
||||
*/
|
||||
QgsScaleBarSettings()
|
||||
{
|
||||
mPen = QPen( mLineColor );
|
||||
mPen.setJoinStyle( mLineJoinStyle );
|
||||
mPen.setCapStyle( mLineCapStyle );
|
||||
mPen.setWidthF( mLineWidth );
|
||||
|
||||
mBrush.setColor( mFillColor );
|
||||
mBrush.setStyle( Qt::SolidPattern );
|
||||
|
||||
mBrush2.setColor( mFillColor2 );
|
||||
mBrush2.setStyle( Qt::SolidPattern );
|
||||
|
||||
mFont.setPointSizeF( 12.0 );
|
||||
mFontColor = QColor( 0, 0, 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of segments included in the scalebar.
|
||||
* \see setNumberOfSegments()
|
||||
* \see numberOfSegmentsLeft()
|
||||
*/
|
||||
int numberOfSegments() const { return mNumSegments; }
|
||||
|
||||
/**
|
||||
* Sets the number of \a segments included in the scalebar.
|
||||
* \see numberOfSegments()
|
||||
* \see setNumberOfSegmentsLeft()
|
||||
*/
|
||||
void setNumberOfSegments( int segments ) { mNumSegments = segments; }
|
||||
|
||||
/**
|
||||
* Returns the number of segments included in the left part of the scalebar.
|
||||
* \see setNumberOfSegmentsLeft()
|
||||
* \see numberOfSegments()
|
||||
*/
|
||||
int numberOfSegmentsLeft() const { return mNumSegmentsLeft; }
|
||||
|
||||
/**
|
||||
* Sets the number of \a segments included in the left part of the scalebar.
|
||||
* \see numberOfSegmentsLeft()
|
||||
* \see setNumberOfSegments()
|
||||
*/
|
||||
void setNumberOfSegmentsLeft( int segments ) { mNumSegmentsLeft = segments; }
|
||||
|
||||
/**
|
||||
* Returns the number of scalebar units per segment.
|
||||
* \see setUnitsPerSegment()
|
||||
*/
|
||||
double unitsPerSegment() const { return mNumUnitsPerSegment; }
|
||||
|
||||
/**
|
||||
* Sets the number of scalebar \a units per segment.
|
||||
* \see unitsPerSegment()
|
||||
*/
|
||||
void setUnitsPerSegment( double units ) { mNumUnitsPerSegment = units; }
|
||||
|
||||
/**
|
||||
* Returns the size mode for the scale bar segments.
|
||||
* \see setSegmentSizeMode()
|
||||
* \see minBarWidth()
|
||||
* \see maxBarWidth()
|
||||
*/
|
||||
SegmentSizeMode segmentSizeMode() const { return mSegmentSizeMode; }
|
||||
|
||||
/**
|
||||
* Sets the size \a mode for scale bar segments.
|
||||
* \see segmentSizeMode()
|
||||
* \see setMinimumBarWidth()
|
||||
* \see setMaximumBarWidth()
|
||||
*/
|
||||
void setSegmentSizeMode( SegmentSizeMode mode ) { mSegmentSizeMode = mode; }
|
||||
|
||||
/**
|
||||
* Returns the minimum width (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
* to SegmentSizeFitWidth.
|
||||
* \see segmentSizeMode()
|
||||
* \see setMinimumBarWidth()
|
||||
* \see maximumBarWidth()
|
||||
*/
|
||||
double minimumBarWidth() const { return mMinBarWidth; }
|
||||
|
||||
/**
|
||||
* Sets the minimum \a width (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
* to SegmentSizeFitWidth.
|
||||
* \see minimumBarWidth()
|
||||
* \see setMaximumBarWidth()
|
||||
* \see setSegmentSizeMode()
|
||||
*/
|
||||
void setMinimumBarWidth( double width ) { mMinBarWidth = width; }
|
||||
|
||||
/**
|
||||
* Returns the maximum width (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
* to SegmentSizeFitWidth.
|
||||
* \see segmentSizeMode()
|
||||
* \see setMaximumBarWidth()
|
||||
* \see minimumBarWidth()
|
||||
*/
|
||||
double maximumBarWidth() const { return mMaxBarWidth; }
|
||||
|
||||
/**
|
||||
* Sets the maximum \a width (in millimeters) for scale bar segments. This
|
||||
* property is only effective if the segmentSizeMode() is set
|
||||
* to SegmentSizeFitWidth.
|
||||
* \see minimumBarWidth()
|
||||
* \see setMinimumBarWidth()
|
||||
* \see setSegmentSizeMode()
|
||||
*/
|
||||
void setMaximumBarWidth( double width ) { mMaxBarWidth = width; }
|
||||
|
||||
/**
|
||||
* Returns the distance units used by the scalebar.
|
||||
* \see setUnits()
|
||||
*/
|
||||
QgsUnitTypes::DistanceUnit units() const { return mUnits; }
|
||||
|
||||
/**
|
||||
* Sets the distance \a units used by the scalebar.
|
||||
* \see units()
|
||||
*/
|
||||
void setUnits( QgsUnitTypes::DistanceUnit units ) { mUnits = units; }
|
||||
|
||||
/**
|
||||
* Returns the number of map units per scale bar unit used by the scalebar.
|
||||
* \see setMapUnitsPerScaleBarUnit()
|
||||
*/
|
||||
double mapUnitsPerScaleBarUnit() const { return mNumMapUnitsPerScaleBarUnit; }
|
||||
|
||||
/**
|
||||
* Sets the number of map \a units per scale bar unit used by the scalebar.
|
||||
* \see mapUnitsPerScaleBarUnit()
|
||||
*/
|
||||
void setMapUnitsPerScaleBarUnit( double units ) { mNumMapUnitsPerScaleBarUnit = units; }
|
||||
|
||||
/**
|
||||
* Returns the label for units.
|
||||
* \see setUnitLabel()
|
||||
*/
|
||||
QString unitLabel() const { return mUnitLabeling; }
|
||||
|
||||
/**
|
||||
* Sets the \a label for units.
|
||||
* \see unitLabel()
|
||||
*/
|
||||
void setUnitLabel( const QString &label ) { mUnitLabeling = label; }
|
||||
|
||||
/**
|
||||
* Returns the font used for drawing text in the scalebar.
|
||||
* \see setFont()
|
||||
*/
|
||||
QFont font() const { return mFont; }
|
||||
|
||||
/**
|
||||
* Sets the \a font used for drawing text in the scalebar.
|
||||
* \see setFont()
|
||||
*/
|
||||
void setFont( const QFont &font ) { mFont = font; }
|
||||
|
||||
/**
|
||||
* Returns the color used for drawing text in the scalebar.
|
||||
* \see setFontColor()
|
||||
* \see font()
|
||||
*/
|
||||
QColor fontColor() const { return mFontColor; }
|
||||
|
||||
/**
|
||||
* Sets the \a color used for drawing text in the scalebar.
|
||||
* \see fontColor()
|
||||
* \see setFont()
|
||||
*/
|
||||
void setFontColor( const QColor &color ) { mFontColor = color; }
|
||||
|
||||
/**
|
||||
* Returns the color used for fills in the scalebar.
|
||||
* \see setFillColor()
|
||||
* \see fillColor2()
|
||||
*/
|
||||
QColor fillColor() const { return mFillColor; }
|
||||
|
||||
/**
|
||||
* Sets the \a color used for fills in the scalebar.
|
||||
* \see fillColor()
|
||||
* \see setFillColor2()
|
||||
*/
|
||||
void setFillColor( const QColor &color ) { mFillColor = color; mBrush.setColor( color ); }
|
||||
|
||||
/**
|
||||
* Returns the secondary color used for fills in the scalebar.
|
||||
* \see setFillColor2()
|
||||
* \see fillColor()
|
||||
*/
|
||||
QColor fillColor2() const {return mFillColor2;}
|
||||
|
||||
/**
|
||||
* Sets the secondary \a color used for fills in the scalebar.
|
||||
* \see fillColor2()
|
||||
* \see setFillColor2()
|
||||
*/
|
||||
void setFillColor2( const QColor &color ) { mFillColor2 = color; mBrush2.setColor( color ); }
|
||||
|
||||
/**
|
||||
* Returns the color used for lines in the scalebar.
|
||||
* \see setLineColor()
|
||||
*/
|
||||
QColor lineColor() const { return mLineColor; }
|
||||
|
||||
/**
|
||||
* Sets the \a color used for lines in the scalebar.
|
||||
* \see lineColor()
|
||||
*/
|
||||
void setLineColor( const QColor &color ) { mLineColor = color; mPen.setColor( mLineColor ); }
|
||||
|
||||
/**
|
||||
* Returns the line width in millimeters for lines in the scalebar.
|
||||
* \see setLineWidth()
|
||||
*/
|
||||
double lineWidth() const { return mLineWidth; }
|
||||
|
||||
/**
|
||||
* Sets the line \a width in millimeters for lines in the scalebar.
|
||||
* \see lineWidth()
|
||||
*/
|
||||
void setLineWidth( double width ) { mLineWidth = width; mPen.setWidthF( width ); }
|
||||
|
||||
/**
|
||||
* Returns the pen used for drawing outlines in the scalebar.
|
||||
* \see setPen()
|
||||
* \see brush()
|
||||
*/
|
||||
QPen pen() const { return mPen; }
|
||||
|
||||
/**
|
||||
* Sets the pen used for drawing outlines in the scalebar.
|
||||
* \see pen()
|
||||
*/
|
||||
void setPen( const QPen &pen ) { mPen = pen; }
|
||||
|
||||
/**
|
||||
* Returns the primary brush used for filling the scalebar.
|
||||
* \see setBrush()
|
||||
* \see brush2()
|
||||
* \see pen()
|
||||
*/
|
||||
QBrush brush() const { return mBrush; }
|
||||
|
||||
/**
|
||||
* Sets the primary brush used for filling the scalebar.
|
||||
* \see brush()
|
||||
*/
|
||||
void setBrush( const QBrush &brush ) { mBrush = brush; }
|
||||
|
||||
/**
|
||||
* Returns the secondary brush for the scalebar. This is used for alternating color style scalebars, such
|
||||
* as single and double box styles.
|
||||
* \see setBrush2()
|
||||
* \see brush()
|
||||
*/
|
||||
QBrush brush2() const { return mBrush2; }
|
||||
|
||||
/**
|
||||
* Sets the secondary brush used for filling the scalebar.
|
||||
* \see brush()
|
||||
*/
|
||||
void setBrush2( const QBrush &brush ) { mBrush2 = brush; }
|
||||
|
||||
/**
|
||||
* Returns the scalebar height (in millimeters).
|
||||
* \see setHeight()
|
||||
*/
|
||||
double height() const { return mHeight; }
|
||||
|
||||
/**
|
||||
* Sets the scalebar \a height (in millimeters).
|
||||
* \see height()
|
||||
*/
|
||||
void setHeight( double height ) { mHeight = height; }
|
||||
|
||||
/**
|
||||
* Returns the spacing (in millimeters) between labels and the scalebar.
|
||||
* \see setLabelBarSpace()
|
||||
*/
|
||||
double labelBarSpace() const { return mLabelBarSpace; }
|
||||
|
||||
/**
|
||||
* Sets the spacing (in millimeters) between labels and the scalebar.
|
||||
* \see labelBarSpace()
|
||||
*/
|
||||
void setLabelBarSpace( double space ) { mLabelBarSpace = space; }
|
||||
|
||||
/**
|
||||
* Returns the spacing (margin) between the scalebar box and content in millimeters.
|
||||
* \see setBoxContentSpace()
|
||||
*/
|
||||
double boxContentSpace() const { return mBoxContentSpace; }
|
||||
|
||||
/**
|
||||
* Sets the \a space (margin) between the scalebar box and content in millimeters.
|
||||
* \see boxContentSpace()
|
||||
*/
|
||||
void setBoxContentSpace( double space ) { mBoxContentSpace = space; }
|
||||
|
||||
/**
|
||||
* Returns the scalebar alignment.
|
||||
* \see setAlignment()
|
||||
*/
|
||||
Alignment alignment() const { return mAlignment; }
|
||||
|
||||
/**
|
||||
* Sets the scalebar \a alignment.
|
||||
* \see alignment()
|
||||
*/
|
||||
void setAlignment( Alignment alignment ) { mAlignment = alignment; }
|
||||
|
||||
/**
|
||||
* Returns the join style used for drawing lines in the scalebar.
|
||||
* \see setLineJoinStyle()
|
||||
*/
|
||||
Qt::PenJoinStyle lineJoinStyle() const { return mLineJoinStyle; }
|
||||
|
||||
/**
|
||||
* Sets the join \a style used when drawing the lines in the scalebar
|
||||
* \see lineJoinStyle()
|
||||
*/
|
||||
void setLineJoinStyle( Qt::PenJoinStyle style ) { mLineJoinStyle = style; mPen.setJoinStyle( style ); }
|
||||
|
||||
/**
|
||||
* Returns the cap style used for drawing lines in the scalebar.
|
||||
* \see setLineCapStyle()
|
||||
*/
|
||||
Qt::PenCapStyle lineCapStyle() const { return mLineCapStyle; }
|
||||
|
||||
/**
|
||||
* Sets the cap \a style used when drawing the lines in the scalebar.
|
||||
* \see lineCapStyle()
|
||||
*/
|
||||
void setLineCapStyle( Qt::PenCapStyle style ) { mLineCapStyle = style; mPen.setCapStyle( style ); }
|
||||
|
||||
private:
|
||||
|
||||
//! Number of segments on right side
|
||||
int mNumSegments = 2;
|
||||
//! Number of segments on left side
|
||||
int mNumSegmentsLeft = 0;
|
||||
//! Size of a segment (in map units)
|
||||
double mNumUnitsPerSegment = 0;
|
||||
//! Number of map units per scale bar units (e.g. 1000 to have km for a map with m units)
|
||||
double mNumMapUnitsPerScaleBarUnit = 1.0;
|
||||
//! Either fixed (i.e. mNumUnitsPerSegment) or try to best fit scale bar width (mMinBarWidth, mMaxBarWidth)
|
||||
SegmentSizeMode mSegmentSizeMode = SegmentSizeFixed;
|
||||
//! Minimum allowed bar width, when mSegmentSizeMode is FitWidth
|
||||
double mMinBarWidth = 50.0;
|
||||
//! Maximum allowed bar width, when mSegmentSizeMode is FitWidth
|
||||
double mMaxBarWidth = 150.0;
|
||||
|
||||
//! Labeling of map units
|
||||
QString mUnitLabeling;
|
||||
//! Font
|
||||
QFont mFont;
|
||||
QColor mFontColor;
|
||||
//! Fill color
|
||||
QColor mFillColor = QColor( 0, 0, 0 );
|
||||
//! Secondary fill color
|
||||
QColor mFillColor2 = QColor( 255, 255, 255 );
|
||||
//! Line color
|
||||
QColor mLineColor = QColor( 0, 0, 0 );
|
||||
//! Line width
|
||||
double mLineWidth = 0.3;
|
||||
//! Stroke
|
||||
QPen mPen;
|
||||
//! Fill
|
||||
QBrush mBrush;
|
||||
//! Secondary fill
|
||||
QBrush mBrush2;
|
||||
//! Height of bars/lines
|
||||
double mHeight = 3.0;
|
||||
|
||||
//! Space between bar and Text labels
|
||||
double mLabelBarSpace = 3.0;
|
||||
|
||||
//! Space between content and item box
|
||||
double mBoxContentSpace = 1.0;
|
||||
|
||||
Alignment mAlignment = AlignLeft;
|
||||
|
||||
QgsUnitTypes::DistanceUnit mUnits = QgsUnitTypes::DistanceMeters;
|
||||
|
||||
Qt::PenJoinStyle mLineJoinStyle = Qt::MiterJoin;
|
||||
Qt::PenCapStyle mLineCapStyle = Qt::SquareCap;
|
||||
|
||||
};
|
||||
|
||||
#endif // QGSSCALEBARSETTINGS_H
|
||||
|
67
src/core/scalebar/qgssingleboxscalebarrenderer.cpp
Normal file
67
src/core/scalebar/qgssingleboxscalebarrenderer.cpp
Normal file
@ -0,0 +1,67 @@
|
||||
/***************************************************************************
|
||||
qgssingleboxscalebarrenderer.cpp
|
||||
--------------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgssingleboxscalebarrenderer.h"
|
||||
#include "qgsscalebarsettings.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QList>
|
||||
#include <QPainter>
|
||||
|
||||
void QgsSingleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
if ( !context.painter() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
QPainter *painter = context.painter();
|
||||
|
||||
double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace();
|
||||
|
||||
painter->save();
|
||||
if ( context.flags() & QgsRenderContext::Antialiasing )
|
||||
painter->setRenderHint( QPainter::Antialiasing, true );
|
||||
painter->setPen( settings.pen() );
|
||||
|
||||
bool useColor = true; //alternate brush color/white
|
||||
double xOffset = firstLabelXOffset( settings );
|
||||
|
||||
QList<double> positions = segmentPositions( scaleContext, settings );
|
||||
QList<double> widths = segmentWidths( scaleContext, settings );
|
||||
|
||||
for ( int i = 0; i < positions.size(); ++i )
|
||||
{
|
||||
if ( useColor ) //alternating colors
|
||||
{
|
||||
painter->setBrush( settings.brush() );
|
||||
}
|
||||
else //secondary color
|
||||
{
|
||||
painter->setBrush( settings.brush2() );
|
||||
}
|
||||
|
||||
QRectF segmentRect( positions.at( i ) + xOffset, barTopPosition, widths.at( i ), settings.height() );
|
||||
painter->drawRect( segmentRect );
|
||||
useColor = !useColor;
|
||||
}
|
||||
|
||||
painter->restore();
|
||||
|
||||
//draw labels using the default method
|
||||
drawDefaultLabels( context, settings, scaleContext );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/***************************************************************************
|
||||
qgssingleboxscalebarstyle.h
|
||||
------------------
|
||||
qgssingleboxscalebarrenderer.h
|
||||
------------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
@ -14,32 +14,35 @@
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSSINGLEBOXSCALEBARSTYLE_H
|
||||
#define QGSSINGLEBOXSCALEBARSTYLE_H
|
||||
#ifndef QGSSINGLEBOXSCALEBARRENDERER_H
|
||||
#define QGSSINGLEBOXSCALEBARRENDERER_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgsscalebarstyle.h"
|
||||
#include "qgsscalebarrenderer.h"
|
||||
#include <QString>
|
||||
|
||||
/** \ingroup core
|
||||
/**
|
||||
* \class QgsSingleBoxScaleBarRenderer
|
||||
* \ingroup core
|
||||
* Scalebar style that draws a single box with alternating
|
||||
* color for the segments.
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
class CORE_EXPORT QgsSingleBoxScaleBarStyle: public QgsScaleBarStyle
|
||||
class CORE_EXPORT QgsSingleBoxScaleBarRenderer: public QgsScaleBarRenderer
|
||||
{
|
||||
public:
|
||||
QgsSingleBoxScaleBarStyle( const QgsComposerScaleBar *bar );
|
||||
~QgsSingleBoxScaleBarStyle();
|
||||
|
||||
QString name() const override;
|
||||
|
||||
/** Draw method
|
||||
\param p painter object
|
||||
\param xOffset x offset
|
||||
/**
|
||||
* Constructor for QgsSingleBoxScaleBarRenderer.
|
||||
*/
|
||||
void draw( QPainter *p, double xOffset = 0 ) const override;
|
||||
QgsSingleBoxScaleBarRenderer() = default;
|
||||
|
||||
QString name() const override { return QStringLiteral( "Single Box" ); }
|
||||
|
||||
void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const override;
|
||||
|
||||
private:
|
||||
QgsSingleBoxScaleBarStyle(); //forbidden
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // QGSSINGLEBOXSCALEBARRENDERER_H
|
92
src/core/scalebar/qgsticksscalebarrenderer.cpp
Normal file
92
src/core/scalebar/qgsticksscalebarrenderer.cpp
Normal file
@ -0,0 +1,92 @@
|
||||
/***************************************************************************
|
||||
qgsticksscalebarrenderer.cpp
|
||||
----------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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 "qgsticksscalebarrenderer.h"
|
||||
#include "qgsscalebarsettings.h"
|
||||
#include "qgscomposerutils.h"
|
||||
#include <QPainter>
|
||||
|
||||
QString QgsTicksScaleBarRenderer::name() const
|
||||
{
|
||||
switch ( mTickPosition )
|
||||
{
|
||||
case TicksUp:
|
||||
return QStringLiteral( "Line Ticks Up" );
|
||||
case TicksDown:
|
||||
return QStringLiteral( "Line Ticks Down" );
|
||||
case TicksMiddle:
|
||||
return QStringLiteral( "Line Ticks Middle" );
|
||||
}
|
||||
return QString(); // to make gcc happy
|
||||
}
|
||||
|
||||
void QgsTicksScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const
|
||||
{
|
||||
if ( !context.painter() )
|
||||
return;
|
||||
|
||||
QPainter *painter = context.painter();
|
||||
|
||||
double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace();
|
||||
double middlePosition = barTopPosition + settings.height() / 2.0;
|
||||
double bottomPosition = barTopPosition + settings.height();
|
||||
|
||||
double xOffset = firstLabelXOffset( settings );
|
||||
|
||||
painter->save();
|
||||
if ( context.flags() & QgsRenderContext::Antialiasing )
|
||||
painter->setRenderHint( QPainter::Antialiasing, true );
|
||||
|
||||
painter->setPen( settings.pen() );
|
||||
|
||||
QList<double> positions = segmentPositions( scaleContext, settings );
|
||||
|
||||
for ( int i = 0; i < positions.size(); ++i )
|
||||
{
|
||||
painter->drawLine( QLineF( positions.at( i ) + xOffset, barTopPosition,
|
||||
positions.at( i ) + xOffset, barTopPosition + settings.height() ) );
|
||||
}
|
||||
|
||||
//draw last tick and horizontal line
|
||||
if ( !positions.isEmpty() )
|
||||
{
|
||||
double lastTickPositionX = positions.at( positions.size() - 1 ) + scaleContext.segmentWidth + xOffset;
|
||||
double verticalPos = 0.0;
|
||||
switch ( mTickPosition )
|
||||
{
|
||||
case TicksDown:
|
||||
verticalPos = barTopPosition;
|
||||
break;
|
||||
case TicksMiddle:
|
||||
verticalPos = middlePosition;
|
||||
break;
|
||||
case TicksUp:
|
||||
verticalPos = bottomPosition;
|
||||
break;
|
||||
}
|
||||
//horizontal line
|
||||
painter->drawLine( QLineF( xOffset + positions.at( 0 ), verticalPos, lastTickPositionX, verticalPos ) );
|
||||
//last vertical line
|
||||
painter->drawLine( QLineF( lastTickPositionX, barTopPosition, lastTickPositionX, barTopPosition + settings.height() ) );
|
||||
}
|
||||
|
||||
painter->restore();
|
||||
|
||||
//draw labels using the default method
|
||||
drawDefaultLabels( context, settings, scaleContext );
|
||||
}
|
||||
|
||||
|
69
src/core/scalebar/qgsticksscalebarrenderer.h
Normal file
69
src/core/scalebar/qgsticksscalebarrenderer.h
Normal file
@ -0,0 +1,69 @@
|
||||
/***************************************************************************
|
||||
qgsticksscalebarrenderer.h
|
||||
--------------------------
|
||||
begin : June 2008
|
||||
copyright : (C) 2008 by Marco Hugentobler
|
||||
email : marco.hugentobler@karto.baug.ethz.ch
|
||||
***************************************************************************/
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef QGSTICKSSCALEBARRENDERER_H
|
||||
#define QGSTICKSSCALEBARRENDERER_H
|
||||
|
||||
#include "qgis_core.h"
|
||||
#include "qgsscalebarrenderer.h"
|
||||
|
||||
/**
|
||||
* \class QgsTicksScaleBarRenderer
|
||||
* \ingroup core
|
||||
* A scale bar that draws segments using short ticks.
|
||||
* \since QGIS 3.0
|
||||
*/
|
||||
class CORE_EXPORT QgsTicksScaleBarRenderer: public QgsScaleBarRenderer
|
||||
{
|
||||
public:
|
||||
|
||||
//! Tick positions
|
||||
enum TickPosition
|
||||
{
|
||||
TicksUp, //!< Render ticks above line
|
||||
TicksDown, //!< Render ticks below line
|
||||
TicksMiddle, //!< Render ticks crossing line
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor for QgsTicksScaleBarRenderer.
|
||||
*/
|
||||
QgsTicksScaleBarRenderer() = default;
|
||||
|
||||
QString name() const override;
|
||||
|
||||
void draw( QgsRenderContext &context,
|
||||
const QgsScaleBarSettings &settings,
|
||||
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const override;
|
||||
|
||||
/**
|
||||
* Sets the \a position for tick marks in the scalebar.
|
||||
* \see tickPosition()
|
||||
*/
|
||||
void setTickPosition( TickPosition position ) { mTickPosition = position; }
|
||||
|
||||
/**
|
||||
* Returns the position for tick marks in the scalebar.
|
||||
* \see setTickPosition()
|
||||
*/
|
||||
TickPosition tickPosition() const { return mTickPosition; }
|
||||
|
||||
private:
|
||||
|
||||
TickPosition mTickPosition = TicksMiddle;
|
||||
};
|
||||
|
||||
#endif // QGSTICKSSCALEBARRENDERER_H
|
@ -749,6 +749,7 @@ INCLUDE_DIRECTORIES(
|
||||
../core/geometry
|
||||
../core/layertree
|
||||
../core/raster
|
||||
../core/scalebar
|
||||
../core/symbology-ng
|
||||
../core/effects
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
|
@ -444,7 +444,7 @@ void QgsComposerView::mousePressEvent( QMouseEvent *e )
|
||||
QList<const QgsComposerMap *> mapItemList = composition()->composerMapItems();
|
||||
if ( !mapItemList.isEmpty() )
|
||||
{
|
||||
newScaleBar->setComposerMap( mapItemList.at( 0 ) );
|
||||
newScaleBar->setComposerMap( const_cast< QgsComposerMap *>( mapItemList.at( 0 ) ) );
|
||||
}
|
||||
newScaleBar->applyDefaultSize(); //4 segments, 1/5 of composer map width
|
||||
|
||||
|
1
tests/src/core/CMakeLists.txt
Normal file → Executable file
1
tests/src/core/CMakeLists.txt
Normal file → Executable file
@ -16,6 +16,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src/core/layertree
|
||||
${CMAKE_SOURCE_DIR}/src/core/processing
|
||||
${CMAKE_SOURCE_DIR}/src/core/raster
|
||||
${CMAKE_SOURCE_DIR}/src/core/scalebar
|
||||
${CMAKE_SOURCE_DIR}/src/core/symbology-ng
|
||||
${CMAKE_SOURCE_DIR}/src/test
|
||||
${CMAKE_BINARY_DIR}/src/core
|
||||
|
@ -102,7 +102,7 @@ void TestQgsComposerScaleBar::initTestCase()
|
||||
mComposition->addComposerScaleBar( mComposerScaleBar );
|
||||
mComposerScaleBar->setComposerMap( mComposerMap );
|
||||
mComposerScaleBar->setFont( QgsFontUtils::getStandardTestFont() );
|
||||
mComposerScaleBar->setUnits( QgsComposerScaleBar::Meters );
|
||||
mComposerScaleBar->setUnits( QgsUnitTypes::DistanceMeters );
|
||||
mComposerScaleBar->setNumUnitsPerSegment( 2000 );
|
||||
mComposerScaleBar->setNumSegmentsLeft( 0 );
|
||||
mComposerScaleBar->setNumSegments( 2 );
|
||||
@ -179,11 +179,19 @@ void TestQgsComposerScaleBar::doubleBox()
|
||||
|
||||
void TestQgsComposerScaleBar::numeric()
|
||||
{
|
||||
QFont f = mComposerScaleBar->font();
|
||||
|
||||
QFont newFont = QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) );
|
||||
newFont.setPointSizeF( 12 );
|
||||
mComposerScaleBar->setFont( newFont );
|
||||
|
||||
mComposerScaleBar->setStyle( QStringLiteral( "Numeric" ) );
|
||||
mComposerScaleBar->setSceneRect( QRectF( 20, 180, 50, 20 ) );
|
||||
QgsCompositionChecker checker( QStringLiteral( "composerscalebar_numeric" ), mComposition );
|
||||
checker.setControlPathPrefix( QStringLiteral( "composer_scalebar" ) );
|
||||
QVERIFY( checker.testComposition( mReport, 0, 0 ) );
|
||||
bool result = checker.testComposition( mReport, 0, 0 );
|
||||
mComposerScaleBar->setFont( f );
|
||||
QVERIFY( result );
|
||||
}
|
||||
|
||||
void TestQgsComposerScaleBar::tick()
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Binary file not shown.
Before Width: | Height: | Size: 16 KiB |
Loading…
x
Reference in New Issue
Block a user