Skip to content

Commit 8ac762e

Browse files
authored
[ui] Fix tiny vertex marker on hidpi
1 parent 41a04d0 commit 8ac762e

15 files changed

+87
-29
lines changed

python/core/auto_generated/qgsvectorlayer.sip.in

+3-1
Original file line numberDiff line numberDiff line change
@@ -1842,9 +1842,11 @@ Destroy active command and reverts all changes in it
18421842
NoMarker
18431843
};
18441844

1845-
static void drawVertexMarker( double x, double y, QPainter &p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
1845+
static void drawVertexMarker( double x, double y, QPainter &p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
18461846
%Docstring
18471847
Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
1848+
1849+
.. deprecated:: Use the equivalent QgsSymbolLayerUtils.drawVertexMarker function instead
18481850
%End
18491851

18501852
void updateFields();

python/core/auto_generated/symbology/qgsrenderer.sip.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ If supported by the renderer, return classification attribute for the use in leg
315315
.. versionadded:: 2.6
316316
%End
317317

318-
void setVertexMarkerAppearance( int type, int size );
318+
void setVertexMarkerAppearance( int type, double size );
319319
%Docstring
320320
Sets type and size of editing vertex markers for subsequent rendering
321321
%End

python/core/auto_generated/symbology/qgssymbol.sip.in

+2-2
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ Returns whether the symbol utilizes any data defined properties.
428428
.. deprecated:: Will be removed in QGIS 4.0
429429
%End
430430

431-
void renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false, int currentVertexMarkerType = 0, int currentVertexMarkerSize = 0 );
431+
void renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false, int currentVertexMarkerType = 0, double currentVertexMarkerSize = 0.0 );
432432
%Docstring
433433
Render a feature. Before calling this the startRender() method should be called to initialize
434434
the rendering process. After rendering all features stopRender() must be called.
@@ -487,7 +487,7 @@ This is required for layers that generate their own geometry from other
487487
information in the rendering context.
488488
%End
489489

490-
void renderVertexMarker( QPointF pt, QgsRenderContext &context, int currentVertexMarkerType, int currentVertexMarkerSize );
490+
void renderVertexMarker( QPointF pt, QgsRenderContext &context, int currentVertexMarkerType, double currentVertexMarkerSize );
491491
%Docstring
492492
Render editing vertex marker at specified point
493493

python/core/auto_generated/symbology/qgssymbollayerutils.sip.in

+14
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ class QgsSymbolLayerUtils
2222
%End
2323
public:
2424

25+
enum VertexMarkerType
26+
{
27+
SemiTransparentCircle,
28+
Cross,
29+
NoMarker
30+
};
31+
2532
static QString encodeColor( const QColor &color );
2633
static QColor decodeColor( const QString &str );
2734

@@ -240,6 +247,13 @@ Returns a pixmap preview for a color ramp.
240247

241248
static void drawStippledBackground( QPainter *painter, QRect rect );
242249

250+
static void drawVertexMarker( double x, double y, QPainter &p, QgsSymbolLayerUtils::VertexMarkerType type, int markerSize );
251+
%Docstring
252+
Draws a vertex symbol at (painter) coordinates x, y. (Useful to assist vertex editing.)
253+
254+
.. versionadded:: 3.4.5
255+
%End
256+
243257
static double estimateMaxSymbolBleed( QgsSymbol *symbol, const QgsRenderContext &context );
244258
%Docstring
245259
Returns the maximum estimated bleed for the symbol

src/app/qgsoptions.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
10351035
{
10361036
mMarkerStyleComboBox->setCurrentIndex( mMarkerStyleComboBox->findText( tr( "None" ) ) );
10371037
}
1038-
mMarkerSizeSpinBox->setValue( mSettings->value( QStringLiteral( "/qgis/digitizing/marker_size" ), 3 ).toInt() );
1038+
mMarkerSizeSpinBox->setValue( mSettings->value( QStringLiteral( "/qgis/digitizing/marker_size_mm" ), 2.0 ).toDouble() );
10391039

10401040
chkReuseLastValues->setChecked( mSettings->value( QStringLiteral( "/qgis/digitizing/reuseLastValues" ), false ).toBool() );
10411041
chkDisableAttributeValuesDlg->setChecked( mSettings->value( QStringLiteral( "/qgis/digitizing/disable_enter_attribute_values_dialog" ), false ).toBool() );
@@ -1622,7 +1622,7 @@ void QgsOptions::saveOptions()
16221622
{
16231623
mSettings->setValue( QStringLiteral( "/qgis/digitizing/marker_style" ), "None" );
16241624
}
1625-
mSettings->setValue( QStringLiteral( "/qgis/digitizing/marker_size" ), ( mMarkerSizeSpinBox->value() ) );
1625+
mSettings->setValue( QStringLiteral( "/qgis/digitizing/marker_size_mm" ), ( mMarkerSizeSpinBox->value() ) );
16261626

16271627
mSettings->setValue( QStringLiteral( "/qgis/digitizing/reuseLastValues" ), chkReuseLastValues->isChecked() );
16281628
mSettings->setValue( QStringLiteral( "/qgis/digitizing/disable_enter_attribute_values_dialog" ), chkDisableAttributeValuesDlg->isChecked() );

src/core/qgsvectorlayer.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -1690,8 +1690,11 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
16901690
NoMarker
16911691
};
16921692

1693-
//! Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
1694-
static void drawVertexMarker( double x, double y, QPainter &p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
1693+
/**
1694+
* Draws a vertex symbol at (screen) coordinates x, y. (Useful to assist vertex editing.)
1695+
* \deprecated Use the equivalent QgsSymbolLayerUtils::drawVertexMarker function instead
1696+
*/
1697+
Q_DECL_DEPRECATED static void drawVertexMarker( double x, double y, QPainter &p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
16951698

16961699
/**
16971700
* Will regenerate the `fields` property of this layer by obtaining all fields

src/core/qgsvectorlayerrenderer.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsrendercontext.h"
2525
#include "qgssinglesymbolrenderer.h"
2626
#include "qgssymbollayer.h"
27+
#include "qgssymbollayerutils.h"
2728
#include "qgssymbol.h"
2829
#include "qgsvectorlayer.h"
2930
#include "qgsvectorlayerdiagramprovider.h"
@@ -67,18 +68,18 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRender
6768
QString markerTypeString = settings.value( QStringLiteral( "qgis/digitizing/marker_style" ), "Cross" ).toString();
6869
if ( markerTypeString == QLatin1String( "Cross" ) )
6970
{
70-
mVertexMarkerStyle = QgsVectorLayer::Cross;
71+
mVertexMarkerStyle = QgsSymbolLayerUtils::Cross;
7172
}
7273
else if ( markerTypeString == QLatin1String( "SemiTransparentCircle" ) )
7374
{
74-
mVertexMarkerStyle = QgsVectorLayer::SemiTransparentCircle;
75+
mVertexMarkerStyle = QgsSymbolLayerUtils::SemiTransparentCircle;
7576
}
7677
else
7778
{
78-
mVertexMarkerStyle = QgsVectorLayer::NoMarker;
79+
mVertexMarkerStyle = QgsSymbolLayerUtils::NoMarker;
7980
}
8081

81-
mVertexMarkerSize = settings.value( QStringLiteral( "qgis/digitizing/marker_size" ), 3 ).toInt();
82+
mVertexMarkerSize = settings.value( QStringLiteral( "qgis/digitizing/marker_size_mm" ), 2.0 ).toDouble();
8283

8384
if ( !mRenderer )
8485
return;

src/core/qgsvectorlayerrenderer.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer
123123

124124
bool mDrawVertexMarkers;
125125
bool mVertexMarkerOnlyForSelection;
126-
int mVertexMarkerStyle, mVertexMarkerSize;
126+
int mVertexMarkerStyle = 0;
127+
double mVertexMarkerSize = 2.0;
127128

128129
QgsWkbTypes::GeometryType mGeometryType;
129130

src/core/symbology/qgsrenderer.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ QgsFeatureRenderer::QgsFeatureRenderer( const QString &type )
6060
: mType( type )
6161
, mUsingSymbolLevels( false )
6262
, mCurrentVertexMarkerType( QgsVectorLayer::Cross )
63-
, mCurrentVertexMarkerSize( 3 )
63+
, mCurrentVertexMarkerSize( 2 )
6464
, mForceRaster( false )
6565
, mOrderByEnabled( false )
6666
{
@@ -337,7 +337,7 @@ QgsLegendSymbolList QgsFeatureRenderer::legendSymbolItems() const
337337
return QgsLegendSymbolList();
338338
}
339339

340-
void QgsFeatureRenderer::setVertexMarkerAppearance( int type, int size )
340+
void QgsFeatureRenderer::setVertexMarkerAppearance( int type, double size )
341341
{
342342
mCurrentVertexMarkerType = type;
343343
mCurrentVertexMarkerSize = size;
@@ -350,9 +350,10 @@ bool QgsFeatureRenderer::willRenderFeature( const QgsFeature &feature, QgsRender
350350

351351
void QgsFeatureRenderer::renderVertexMarker( QPointF pt, QgsRenderContext &context )
352352
{
353-
QgsVectorLayer::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
354-
static_cast< QgsVectorLayer::VertexMarkerType >( mCurrentVertexMarkerType ),
355-
mCurrentVertexMarkerSize );
353+
int markerSize = context.convertToPainterUnits( mCurrentVertexMarkerSize, QgsUnitTypes::RenderMillimeters );
354+
QgsSymbolLayerUtils::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
355+
static_cast< QgsSymbolLayerUtils::VertexMarkerType >( mCurrentVertexMarkerType ),
356+
markerSize );
356357
}
357358

358359
void QgsFeatureRenderer::renderVertexMarkerPolyline( QPolygonF &pts, QgsRenderContext &context )

src/core/symbology/qgsrenderer.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ class CORE_EXPORT QgsFeatureRenderer
342342
virtual QString legendClassificationAttribute() const { return QString(); }
343343

344344
//! Sets type and size of editing vertex markers for subsequent rendering
345-
void setVertexMarkerAppearance( int type, int size );
345+
void setVertexMarkerAppearance( int type, double size );
346346

347347
/**
348348
* Returns whether the renderer will render a feature or not.
@@ -505,7 +505,7 @@ class CORE_EXPORT QgsFeatureRenderer
505505
//! The current type of editing marker
506506
int mCurrentVertexMarkerType;
507507
//! The current size of editing marker
508-
int mCurrentVertexMarkerSize;
508+
double mCurrentVertexMarkerSize;
509509

510510
QgsPaintEffect *mPaintEffect = nullptr;
511511

src/core/symbology/qgssymbol.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ class GeometryRestorer
740740
};
741741
///@endcond PRIVATE
742742

743-
void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker, int currentVertexMarkerType, int currentVertexMarkerSize )
743+
void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker, int currentVertexMarkerType, double currentVertexMarkerSize )
744744
{
745745
const QgsGeometry geom = feature.geometry();
746746
if ( geom.isNull() )
@@ -1062,9 +1062,10 @@ QgsSymbolRenderContext *QgsSymbol::symbolRenderContext()
10621062
return mSymbolRenderContext.get();
10631063
}
10641064

1065-
void QgsSymbol::renderVertexMarker( QPointF pt, QgsRenderContext &context, int currentVertexMarkerType, int currentVertexMarkerSize )
1065+
void QgsSymbol::renderVertexMarker( QPointF pt, QgsRenderContext &context, int currentVertexMarkerType, double currentVertexMarkerSize )
10661066
{
1067-
QgsVectorLayer::drawVertexMarker( pt.x(), pt.y(), *context.painter(), static_cast< QgsVectorLayer::VertexMarkerType >( currentVertexMarkerType ), currentVertexMarkerSize );
1067+
int markerSize = context.convertToPainterUnits( currentVertexMarkerSize, QgsUnitTypes::RenderMillimeters );
1068+
QgsSymbolLayerUtils::drawVertexMarker( pt.x(), pt.y(), *context.painter(), static_cast< QgsSymbolLayerUtils::VertexMarkerType >( currentVertexMarkerType ), markerSize );
10681069
}
10691070

10701071
////////////////////

src/core/symbology/qgssymbol.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ class CORE_EXPORT QgsSymbol
429429
* Render a feature. Before calling this the startRender() method should be called to initialize
430430
* the rendering process. After rendering all features stopRender() must be called.
431431
*/
432-
void renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false, int currentVertexMarkerType = 0, int currentVertexMarkerSize = 0 );
432+
void renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false, int currentVertexMarkerType = 0, double currentVertexMarkerSize = 0.0 );
433433

434434
/**
435435
* Returns the symbol render context. Only valid between startRender and stopRender calls.
@@ -506,7 +506,7 @@ class CORE_EXPORT QgsSymbol
506506
* Render editing vertex marker at specified point
507507
* \since QGIS 2.16
508508
*/
509-
void renderVertexMarker( QPointF pt, QgsRenderContext &context, int currentVertexMarkerType, int currentVertexMarkerSize );
509+
void renderVertexMarker( QPointF pt, QgsRenderContext &context, int currentVertexMarkerType, double currentVertexMarkerSize );
510510

511511
SymbolType mType;
512512
QgsSymbolLayerList mLayers;

src/core/symbology/qgssymbollayerutils.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,27 @@ void QgsSymbolLayerUtils::drawStippledBackground( QPainter *painter, QRect rect
797797
painter->fillRect( rect, brush );
798798
}
799799

800+
void QgsSymbolLayerUtils::drawVertexMarker( double x, double y, QPainter &p, QgsSymbolLayerUtils::VertexMarkerType type, int markerSize )
801+
{
802+
qreal s = ( markerSize - 1 ) / 2.0;
803+
804+
switch ( type )
805+
{
806+
case QgsSymbolLayerUtils::SemiTransparentCircle:
807+
p.setPen( QColor( 50, 100, 120, 200 ) );
808+
p.setBrush( QColor( 200, 200, 210, 120 ) );
809+
p.drawEllipse( x - s, y - s, s * 2, s * 2 );
810+
break;
811+
case QgsSymbolLayerUtils::Cross:
812+
p.setPen( QColor( 255, 0, 0 ) );
813+
p.drawLine( x - s, y + s, x + s, y - s );
814+
p.drawLine( x - s, y - s, x + s, y + s );
815+
break;
816+
case QgsSymbolLayerUtils::NoMarker:
817+
break;
818+
}
819+
}
820+
800821
#include <QPolygonF>
801822

802823
#include <cmath>

src/core/symbology/qgssymbollayerutils.h

+14
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ class CORE_EXPORT QgsSymbolLayerUtils
5555
{
5656
public:
5757

58+
//! Editing vertex markers
59+
enum VertexMarkerType
60+
{
61+
SemiTransparentCircle,
62+
Cross,
63+
NoMarker
64+
};
65+
5866
static QString encodeColor( const QColor &color );
5967
static QColor decodeColor( const QString &str );
6068

@@ -234,6 +242,12 @@ class CORE_EXPORT QgsSymbolLayerUtils
234242

235243
static void drawStippledBackground( QPainter *painter, QRect rect );
236244

245+
/**
246+
* Draws a vertex symbol at (painter) coordinates x, y. (Useful to assist vertex editing.)
247+
* \since QGIS 3.4.5
248+
*/
249+
static void drawVertexMarker( double x, double y, QPainter &p, QgsSymbolLayerUtils::VertexMarkerType type, int markerSize );
250+
237251
//! Returns the maximum estimated bleed for the symbol
238252
static double estimateMaxSymbolBleed( QgsSymbol *symbol, const QgsRenderContext &context );
239253

src/ui/qgsoptionsbase.ui

+4-4
Original file line numberDiff line numberDiff line change
@@ -4259,22 +4259,22 @@ The bigger the number, the faster zooming with the mouse wheel will be.</string>
42594259
</widget>
42604260
</item>
42614261
<item row="2" column="2">
4262-
<widget class="QSpinBox" name="mMarkerSizeSpinBox">
4262+
<widget class="QDoubleSpinBox" name="mMarkerSizeSpinBox">
42634263
<property name="layoutDirection">
42644264
<enum>Qt::LeftToRight</enum>
42654265
</property>
42664266
<property name="minimum">
4267-
<number>3</number>
4267+
<number>0.4</number>
42684268
</property>
42694269
<property name="singleStep">
4270-
<number>1</number>
4270+
<number>0.2</number>
42714271
</property>
42724272
</widget>
42734273
</item>
42744274
<item row="2" column="0">
42754275
<widget class="QLabel" name="label_6">
42764276
<property name="text">
4277-
<string>Marker size</string>
4277+
<string>Marker size (in millimeter)</string>
42784278
</property>
42794279
</widget>
42804280
</item>

0 commit comments

Comments
 (0)