28#include "moc_qgsadvanceddigitizingfloater.cpp"
30using namespace Qt::StringLiterals;
33 : QWidget( canvas->viewport() )
34 , mMapCanvas( canvas )
35 , mCadDockWidget( cadDockWidget )
39 setAttribute( Qt::WA_TransparentForMouseEvents );
49 mMapCanvas->viewport()->installEventFilter(
this );
50 mMapCanvas->viewport()->setMouseTracking(
true );
53 mAngleLineEdit->installEventFilter( cadDockWidget );
54 mDistanceLineEdit->installEventFilter( cadDockWidget );
55 mXLineEdit->installEventFilter( cadDockWidget );
56 mYLineEdit->installEventFilter( cadDockWidget );
57 mZLineEdit->installEventFilter( cadDockWidget );
58 mMLineEdit->installEventFilter( cadDockWidget );
59 mWeightLineEdit->installEventFilter( cadDockWidget );
114 connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [
this, cadDockWidget]() {
117 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
119 connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [
this, cadDockWidget]() {
122 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
143 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
147 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
152 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
156 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
158 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
161bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
163 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
165 if ( event->type() == QEvent::MouseMove )
168 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
169 updatePos( mouseEvent->pos() );
171 else if ( event->type() == QEvent::Enter )
174 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
175 updatePos( enterEvent->pos() );
178 else if ( event->type() == QEvent::Leave )
184 return QWidget::eventFilter( obj, event );
194 return mItemsVisibility.testFlag( item );
208 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
209 QgsSettings().
setValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), visible );
210 mItemsVisibility.setFlag( item, visible );
214 enabledChangedX( visible );
217 enabledChangedY( visible );
220 enabledChangedM( visible );
223 enabledChangedZ( visible );
226 enabledChangedAngle( visible );
229 enabledChangedDistance( visible );
232 enabledCommonAngleSnapping( visible );
235 enabledChangedBearing( visible );
243void QgsAdvancedDigitizingFloater::updatePos(
const QPoint &pos )
246 move( pos + QPoint( 15, 5 ) );
249void QgsAdvancedDigitizingFloater::hideIfDisabled()
251 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
257void QgsAdvancedDigitizingFloater::changeX(
const QString &text )
259 mXLineEdit->setText( text );
262void QgsAdvancedDigitizingFloater::changeY(
const QString &text )
264 mYLineEdit->setText( text );
267void QgsAdvancedDigitizingFloater::changeZ(
const QString &text )
269 mZLineEdit->setText( text );
272void QgsAdvancedDigitizingFloater::changeM(
const QString &text )
274 mMLineEdit->setText( text );
277void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping(
double angle )
279 mCommonAngleSnappingLineEdit->setText(
qgsDoubleNear( angle, 0.0 ) ? tr(
"disabled" ) : QLocale().toString( angle ).append( tr(
" °" ) ) );
282void QgsAdvancedDigitizingFloater::changeDistance(
const QString &text )
284 mDistanceLineEdit->setText( text );
287void QgsAdvancedDigitizingFloater::changeAngle(
const QString &text )
289 mAngleLineEdit->setText( text );
292void QgsAdvancedDigitizingFloater::changeBearing(
const QString &text )
294 mBearingLineEdit->setText( text );
297void QgsAdvancedDigitizingFloater::changeLockX(
bool locked )
301 mXLineEdit->setStyleSheet( QString() );
302 mXLabel->setStyleSheet( QString() );
306 mXLineEdit->setStyleSheet( u
"font-weight: bold"_s );
307 mXLabel->setStyleSheet( u
"font-weight: bold"_s );
311void QgsAdvancedDigitizingFloater::changeLockY(
bool locked )
315 mYLineEdit->setStyleSheet( QString() );
316 mYLabel->setStyleSheet( QString() );
320 mYLineEdit->setStyleSheet( u
"font-weight: bold"_s );
321 mYLabel->setStyleSheet( u
"font-weight: bold"_s );
325void QgsAdvancedDigitizingFloater::changeLockZ(
bool locked )
329 mZLineEdit->setStyleSheet( QString() );
330 mZLabel->setStyleSheet( QString() );
334 mZLineEdit->setStyleSheet( u
"font-weight: bold"_s );
335 mZLabel->setStyleSheet( u
"font-weight: bold"_s );
339void QgsAdvancedDigitizingFloater::changeLockM(
bool locked )
343 mMLineEdit->setStyleSheet( QString() );
344 mMLabel->setStyleSheet( QString() );
348 mMLineEdit->setStyleSheet( u
"font-weight: bold"_s );
349 mMLabel->setStyleSheet( u
"font-weight: bold"_s );
353void QgsAdvancedDigitizingFloater::changeLockDistance(
bool locked )
357 mDistanceLineEdit->setStyleSheet( QString() );
358 mDistanceLabel->setStyleSheet( QString() );
362 mDistanceLineEdit->setStyleSheet( u
"font-weight: bold"_s );
363 mDistanceLabel->setStyleSheet( u
"font-weight: bold"_s );
367void QgsAdvancedDigitizingFloater::changeLockAngle(
bool locked )
371 mAngleLineEdit->setStyleSheet( QString() );
372 mAngleLabel->setStyleSheet( QString() );
376 mAngleLineEdit->setStyleSheet( u
"font-weight: bold"_s );
377 mAngleLabel->setStyleSheet( u
"font-weight: bold"_s );
382void QgsAdvancedDigitizingFloater::changeRelativeX(
bool relative )
386 mXLabel->setText(
"x" );
390 mXLabel->setText(
"Δx" );
395void QgsAdvancedDigitizingFloater::changeRelativeY(
bool relative )
399 mYLabel->setText(
"y" );
403 mYLabel->setText(
"Δy" );
408void QgsAdvancedDigitizingFloater::changeRelativeZ(
bool relative )
412 mZLabel->setText(
"z" );
416 mZLabel->setText(
"Δz" );
421void QgsAdvancedDigitizingFloater::changeRelativeM(
bool relative )
425 mMLabel->setText(
"m" );
429 mMLabel->setText(
"Δm" );
436void QgsAdvancedDigitizingFloater::changeRelativeAngle(
bool relative )
440 mAngleLabel->setText(
"a" );
444 mAngleLabel->setText(
"Δa" );
449void QgsAdvancedDigitizingFloater::focusOnX()
453 mXLineEdit->setFocus();
454 mXLineEdit->selectAll();
458void QgsAdvancedDigitizingFloater::focusOnY()
462 mYLineEdit->setFocus();
463 mYLineEdit->selectAll();
467void QgsAdvancedDigitizingFloater::focusOnZ()
471 mZLineEdit->setFocus();
472 mZLineEdit->selectAll();
476void QgsAdvancedDigitizingFloater::focusOnM()
480 mMLineEdit->setFocus();
481 mMLineEdit->selectAll();
485void QgsAdvancedDigitizingFloater::focusOnDistance()
490 mDistanceLineEdit->setText( cleanedInputValue );
491 mDistanceLineEdit->setFocus();
492 mDistanceLineEdit->selectAll();
496void QgsAdvancedDigitizingFloater::focusOnAngle()
501 mAngleLineEdit->setText( cleanedInputValue );
502 mAngleLineEdit->setFocus();
503 mAngleLineEdit->selectAll();
511 mWeightLineEdit->setFocus();
512 mWeightLineEdit->selectAll();
517void QgsAdvancedDigitizingFloater::enabledChangedX(
bool enabled )
524void QgsAdvancedDigitizingFloater::enabledChangedY(
bool enabled )
531void QgsAdvancedDigitizingFloater::enabledChangedZ(
bool enabled )
538void QgsAdvancedDigitizingFloater::enabledChangedM(
bool enabled )
545void QgsAdvancedDigitizingFloater::enabledChangedDistance(
bool enabled )
552void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping(
bool enabled )
559void QgsAdvancedDigitizingFloater::enabledChangedAngle(
bool enabled )
566void QgsAdvancedDigitizingFloater::enabledChangedBearing(
bool enabled )
575 mWeightLineEdit->setText( text );
582 mWeightLineEdit->setVisible( enabled );
583 mWeightLabel->setVisible( enabled );
@ Distance
Distance value.
QgsAdvancedDigitizingFloater(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget)
Create an advanced digitizing floater widget.
void setItemVisibility(const QgsAdvancedDigitizingFloater::FloaterItem &item, bool visible)
Set whether the floater item should be visible or not.
FloaterItem
Available floater items.
@ Weight
Weight for NURBSCurve.
bool itemVisibility(const QgsAdvancedDigitizingFloater::FloaterItem &item) const
Returns true if the floater item visibility setting is enabled.
void setActive(bool active)
Set whether the floater should be active or not.
void enabledChangedWeight(bool enabled)
Shows or hides the weight widget in the floater for NURBSCurve.
void focusOnWeight()
Requests focus on the weight input field for NURBSCurve.
void changeWeight(const QString &text)
Updates the weight value displayed in the floater for NURBSCurve.
bool active()
Whether the floater is active or not.
An event filter for watching for focus events on a parent object.
void focusIn()
Emitted when parent object gains focus.
void focusOut()
Emitted when parent object loses focus.
Map canvas is a class for displaying all GIS data types on a canvas.
Stores settings for use within QGIS.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.