27QgsBezierMarker::QgsBezierMarker(
QgsMapCanvas *canvas, QObject *parent )
36QgsBezierMarker::~QgsBezierMarker()
38 qDeleteAll( mAnchorMarkers );
39 qDeleteAll( mHandleMarkers );
46 marker->
setIconSize( MarkerConfig::AnchorMarkerSize );
49 QColor fillColor = snapColor;
50 fillColor.setAlpha( MarkerConfig::FillAlpha );
52 marker->
setPenWidth( MarkerConfig::MarkerPenWidth );
60 marker->
setIconSize( MarkerConfig::HandleMarkerSize );
63 lineColor.getHsv( &h, &s, &v, &a );
64 QColor handleColor = QColor::fromHsv( ( h + 120 ) % 360, s, v, a );
66 QColor fillColor = handleColor;
67 fillColor.setAlpha( MarkerConfig::FillAlpha );
69 marker->
setPenWidth( MarkerConfig::MarkerPenWidth );
77 lineColor.setAlpha( MarkerConfig::HandleLineAlpha );
78 rb->setColor( lineColor );
79 rb->setWidth( MarkerConfig::HandleLineWidth );
80 rb->setLineStyle( Qt::DashLine );
84void QgsBezierMarker::updateFromData(
const QgsBezierData &data )
86 updateAnchorMarkers( data );
87 updateHandleMarkers( data );
88 updateHandleLines( data );
92void QgsBezierMarker::updateCurve(
const QgsBezierData &data )
96 if ( data.anchorCount() < 1 )
101 for (
const QgsPoint &pt : std::as_const( points ) )
103 mCurveRubberBand->addPoint(
QgsPointXY( pt ) );
106 mCurveRubberBand->setVisible( mVisible );
109void QgsBezierMarker::updateAnchorMarkers(
const QgsBezierData &data )
111 while (
static_cast<int>( mAnchorMarkers.size() ) < data.anchorCount() )
113 mAnchorMarkers.push_back( createAnchorMarker() );
115 while (
static_cast<int>( mAnchorMarkers.size() ) > data.anchorCount() )
117 delete mAnchorMarkers.back();
118 mAnchorMarkers.pop_back();
122 QColor snapFillColor = snapColor;
123 snapFillColor.setAlpha( 100 );
125 for (
int i = 0; i < data.anchorCount(); ++i )
127 const QgsPoint &anchor = data.anchor( i );
128 mAnchorMarkers[i]->setCenter(
QgsPointXY( anchor ) );
129 mAnchorMarkers[i]->setVisible( mVisible );
131 if ( i == mHighlightedAnchor )
133 const QColor selColor = mCanvas->selectionColor();
134 mAnchorMarkers[i]->setColor( selColor );
135 QColor selFillColor = selColor;
136 selFillColor.setAlpha( MarkerConfig::SelectionAlpha );
137 mAnchorMarkers[i]->setFillColor( selFillColor );
141 mAnchorMarkers[i]->setColor( snapColor );
142 mAnchorMarkers[i]->setFillColor( snapFillColor );
147void QgsBezierMarker::updateHandleMarkers(
const QgsBezierData &data )
149 while (
static_cast<int>( mHandleMarkers.size() ) < data.handleCount() )
151 mHandleMarkers.push_back( createHandleMarker() );
153 while (
static_cast<int>( mHandleMarkers.size() ) > data.handleCount() )
155 delete mHandleMarkers.back();
156 mHandleMarkers.pop_back();
161 lineColor.getHsv( &h, &s, &v, &a );
162 QColor handleColor = QColor::fromHsv( ( h + 120 ) % 360, s, v, a );
163 QColor handleFillColor = handleColor;
164 handleFillColor.setAlpha( 100 );
166 for (
int i = 0; i < data.handleCount(); ++i )
168 const QgsPoint &handle = data.handle( i );
169 const int anchorIndex = i / 2;
170 if ( anchorIndex >= data.anchorCount() )
172 mHandleMarkers[i]->setVisible(
false );
175 const QgsPoint &anchor = data.anchor( anchorIndex );
179 mHandleMarkers[i]->setCenter(
QgsPointXY( handle ) );
180 mHandleMarkers[i]->setVisible( mVisible && mHandlesVisible && !isRetracted );
182 if ( i == mHighlightedHandle )
184 const QColor selColor = mCanvas->selectionColor();
185 mHandleMarkers[i]->setColor( selColor );
186 QColor selFillColor = selColor;
187 selFillColor.setAlpha( MarkerConfig::SelectionAlpha );
188 mHandleMarkers[i]->setFillColor( selFillColor );
192 mHandleMarkers[i]->setColor( handleColor );
193 mHandleMarkers[i]->setFillColor( handleFillColor );
198void QgsBezierMarker::updateHandleLines(
const QgsBezierData &data )
200 while (
static_cast<int>( mHandleLines.size() ) < data.handleCount() )
202 mHandleLines.push_back( createHandleLine() );
204 while (
static_cast<int>( mHandleLines.size() ) > data.handleCount() )
206 mHandleLines.pop_back();
209 for (
int i = 0; i < data.handleCount(); ++i )
215 lineColor.setAlpha( MarkerConfig::HandleLineAlpha );
216 mHandleLines[i]->setColor( lineColor );
217 mHandleLines[i]->setWidth( MarkerConfig::HandleLineWidth );
218 mHandleLines[i]->setLineStyle( Qt::DashLine );
220 const QgsPoint &handle = data.handle( i );
221 const int anchorIndex = i / 2;
222 if ( anchorIndex >= data.anchorCount() )
224 mHandleLines[i]->setVisible(
false );
227 const QgsPoint &anchor = data.anchor( anchorIndex );
233 mHandleLines[i]->addPoint(
QgsPointXY( anchor ) );
234 mHandleLines[i]->addPoint(
QgsPointXY( handle ) );
239void QgsBezierMarker::setVisible(
bool visible )
243 for (
const auto &marker : mAnchorMarkers )
244 marker->setVisible( visible );
246 for (
const auto &marker : mHandleMarkers )
247 marker->setVisible( visible && mHandlesVisible );
249 for (
const auto &rb : mHandleLines )
251 if ( rb->numberOfVertices() > 0 )
252 rb->setVisible( visible && mHandlesVisible );
254 rb->setVisible(
false );
257 mCurveRubberBand->setVisible( visible );
260void QgsBezierMarker::setHandlesVisible(
bool visible )
262 mHandlesVisible = visible;
264 for (
const auto &marker : mHandleMarkers )
265 marker->setVisible( mVisible && visible );
267 for (
const auto &rb : mHandleLines )
269 if ( rb->numberOfVertices() > 0 )
270 rb->setVisible( mVisible && visible );
272 rb->setVisible(
false );
276void QgsBezierMarker::clear()
278 qDeleteAll( mAnchorMarkers );
279 mAnchorMarkers.clear();
280 qDeleteAll( mHandleMarkers );
281 mHandleMarkers.clear();
282 mHandleLines.clear();
284 if ( mCurveRubberBand )
287 mHighlightedAnchor = -1;
288 mHighlightedHandle = -1;
291void QgsBezierMarker::setHighlightedAnchor(
int idx )
293 mHighlightedAnchor = idx;
296void QgsBezierMarker::setHighlightedHandle(
int idx )
298 mHighlightedHandle = idx;
303#include "moc_qgsbeziermarker.cpp"
Keeps a pointer to a QObject and deletes it whenever this object is deleted.
Provides global constants and enumerations for use throughout the application.
Map canvas is a class for displaying all GIS data types on a canvas.
Point geometry type, with support for z-dimension and m-values.
Responsible for drawing transient features (e.g.
static const QgsSettingsEntryInteger * settingsDigitizingLineWidth
Settings entry digitizing line width.
static const QgsSettingsEntryColor * settingsDigitizingSnapColor
Settings entry digitizing snap color.
static const QgsSettingsEntryColor * settingsDigitizingLineColor
Settings entry digitizing line color.
A map canvas item for marking vertices of features using e.g.
void setFillColor(const QColor &color)
Sets the fill color for the marker.
void setPenWidth(int width)
void setIconSize(int iconSize)
void setIconType(int iconType)
void setColor(const QColor &color)
Sets the stroke color for the marker.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QVector< QgsPoint > QgsPointSequence