29#include "moc_qgsadvanceddigitizingfloater.cpp"
31using namespace Qt::StringLiterals;
34 : QWidget( canvas->viewport() )
35 , mMapCanvas( canvas )
36 , mCadDockWidget( cadDockWidget )
40 setAttribute( Qt::WA_TransparentForMouseEvents );
50 mMapCanvas->viewport()->installEventFilter(
this );
51 mMapCanvas->viewport()->setMouseTracking(
true );
54 mAngleLineEdit->installEventFilter( cadDockWidget );
55 mDistanceLineEdit->installEventFilter( cadDockWidget );
56 mXLineEdit->installEventFilter( cadDockWidget );
57 mYLineEdit->installEventFilter( cadDockWidget );
58 mZLineEdit->installEventFilter( cadDockWidget );
59 mMLineEdit->installEventFilter( cadDockWidget );
60 mWeightLineEdit->installEventFilter( cadDockWidget );
117 connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [
this, cadDockWidget]() {
120 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
122 connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [
this, cadDockWidget]() {
125 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
146 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
150 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
155 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
159 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
161 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
164bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
166 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
168 if ( event->type() == QEvent::MouseMove )
171 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
172 updatePos( mouseEvent->pos() );
174 else if ( event->type() == QEvent::Enter )
177 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
178 updatePos( enterEvent->pos() );
181 else if ( event->type() == QEvent::Leave )
187 return QWidget::eventFilter( obj, event );
197 return mItemsVisibility.testFlag( item );
207 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
228 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
229 QgsSettings().
setValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), visible );
230 mItemsVisibility.setFlag( item, visible );
234 enabledChangedX( visible );
237 enabledChangedY( visible );
240 enabledChangedM( visible );
243 enabledChangedZ( visible );
246 enabledChangedAngle( visible );
249 enabledChangedDistance( visible );
252 enabledCommonAngleSnapping( visible );
255 enabledChangedBearing( visible );
274 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
275 QgsSettings().
setEnumValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), type );
279 mItemsVisibility.setFlag( item,
false );
284 mItemsVisibility.setFlag( item,
true );
289 const QColor iconColor = palette().color( QPalette::ColorRole::WindowText );
319 mTotalAreaLineEdit->setVisible( show );
320 mAreaLabel->setVisible( show );
321 mAreaMeasurementTypeLabel->setVisible( show );
322 mAreaMeasurementTypeLabel->setPixmap( pixmap );
328 mTotalLengthLineEdit->setVisible( show );
329 mTotalLengthLabel->setVisible( show );
330 mLengthMeasurementTypeLabel->setVisible( show );
331 mLengthMeasurementTypeLabel->setPixmap( pixmap );
359void QgsAdvancedDigitizingFloater::updatePos(
const QPoint &pos )
362 move( pos + QPoint( 15, 5 ) );
365void QgsAdvancedDigitizingFloater::hideIfDisabled()
367 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
373void QgsAdvancedDigitizingFloater::changeX(
const QString &text )
375 mXLineEdit->setText( text );
378void QgsAdvancedDigitizingFloater::changeY(
const QString &text )
380 mYLineEdit->setText( text );
383void QgsAdvancedDigitizingFloater::changeZ(
const QString &text )
385 mZLineEdit->setText( text );
388void QgsAdvancedDigitizingFloater::changeM(
const QString &text )
390 mMLineEdit->setText( text );
393void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping(
double angle )
395 mCommonAngleSnappingLineEdit->setText(
qgsDoubleNear( angle, 0.0 ) ? tr(
"disabled" ) : QLocale().toString( angle ).append( tr(
" °" ) ) );
398void QgsAdvancedDigitizingFloater::changeDistance(
const QString &text )
400 mDistanceLineEdit->setText( text );
403void QgsAdvancedDigitizingFloater::changeAngle(
const QString &text )
405 mAngleLineEdit->setText( text );
408void QgsAdvancedDigitizingFloater::changeBearing(
const QString &text )
410 mBearingLineEdit->setText( text );
413void QgsAdvancedDigitizingFloater::changeArea(
const QString &text )
415 mTotalAreaLineEdit->setText( text );
418void QgsAdvancedDigitizingFloater::changeTotalLength(
const QString &text )
420 mTotalLengthLineEdit->setText( text );
423void QgsAdvancedDigitizingFloater::changeLockX(
bool locked )
427 mXLineEdit->setStyleSheet( QString() );
428 mXLabel->setStyleSheet( QString() );
432 mXLineEdit->setStyleSheet( u
"font-weight: bold"_s );
433 mXLabel->setStyleSheet( u
"font-weight: bold"_s );
437void QgsAdvancedDigitizingFloater::changeLockY(
bool locked )
441 mYLineEdit->setStyleSheet( QString() );
442 mYLabel->setStyleSheet( QString() );
446 mYLineEdit->setStyleSheet( u
"font-weight: bold"_s );
447 mYLabel->setStyleSheet( u
"font-weight: bold"_s );
451void QgsAdvancedDigitizingFloater::changeLockZ(
bool locked )
455 mZLineEdit->setStyleSheet( QString() );
456 mZLabel->setStyleSheet( QString() );
460 mZLineEdit->setStyleSheet( u
"font-weight: bold"_s );
461 mZLabel->setStyleSheet( u
"font-weight: bold"_s );
465void QgsAdvancedDigitizingFloater::changeLockM(
bool locked )
469 mMLineEdit->setStyleSheet( QString() );
470 mMLabel->setStyleSheet( QString() );
474 mMLineEdit->setStyleSheet( u
"font-weight: bold"_s );
475 mMLabel->setStyleSheet( u
"font-weight: bold"_s );
479void QgsAdvancedDigitizingFloater::changeLockDistance(
bool locked )
483 mDistanceLineEdit->setStyleSheet( QString() );
484 mDistanceLabel->setStyleSheet( QString() );
488 mDistanceLineEdit->setStyleSheet( u
"font-weight: bold"_s );
489 mDistanceLabel->setStyleSheet( u
"font-weight: bold"_s );
493void QgsAdvancedDigitizingFloater::changeLockAngle(
bool locked )
497 mAngleLineEdit->setStyleSheet( QString() );
498 mAngleLabel->setStyleSheet( QString() );
502 mAngleLineEdit->setStyleSheet( u
"font-weight: bold"_s );
503 mAngleLabel->setStyleSheet( u
"font-weight: bold"_s );
508void QgsAdvancedDigitizingFloater::changeRelativeX(
bool relative )
512 mXLabel->setText(
"x" );
516 mXLabel->setText(
"Δx" );
521void QgsAdvancedDigitizingFloater::changeRelativeY(
bool relative )
525 mYLabel->setText(
"y" );
529 mYLabel->setText(
"Δy" );
534void QgsAdvancedDigitizingFloater::changeRelativeZ(
bool relative )
538 mZLabel->setText(
"z" );
542 mZLabel->setText(
"Δz" );
547void QgsAdvancedDigitizingFloater::changeRelativeM(
bool relative )
551 mMLabel->setText(
"m" );
555 mMLabel->setText(
"Δm" );
562void QgsAdvancedDigitizingFloater::changeRelativeAngle(
bool relative )
566 mAngleLabel->setText(
"a" );
570 mAngleLabel->setText(
"Δa" );
575void QgsAdvancedDigitizingFloater::focusOnX()
579 mXLineEdit->setFocus();
580 mXLineEdit->selectAll();
584void QgsAdvancedDigitizingFloater::focusOnY()
588 mYLineEdit->setFocus();
589 mYLineEdit->selectAll();
593void QgsAdvancedDigitizingFloater::focusOnZ()
597 mZLineEdit->setFocus();
598 mZLineEdit->selectAll();
602void QgsAdvancedDigitizingFloater::focusOnM()
606 mMLineEdit->setFocus();
607 mMLineEdit->selectAll();
611void QgsAdvancedDigitizingFloater::focusOnDistance()
616 mDistanceLineEdit->setText( cleanedInputValue );
617 mDistanceLineEdit->setFocus();
618 mDistanceLineEdit->selectAll();
622void QgsAdvancedDigitizingFloater::focusOnAngle()
627 mAngleLineEdit->setText( cleanedInputValue );
628 mAngleLineEdit->setFocus();
629 mAngleLineEdit->selectAll();
637 mWeightLineEdit->setFocus();
638 mWeightLineEdit->selectAll();
643void QgsAdvancedDigitizingFloater::enabledChangedX(
bool enabled )
650void QgsAdvancedDigitizingFloater::enabledChangedY(
bool enabled )
657void QgsAdvancedDigitizingFloater::enabledChangedZ(
bool enabled )
664void QgsAdvancedDigitizingFloater::enabledChangedM(
bool enabled )
671void QgsAdvancedDigitizingFloater::enabledChangedDistance(
bool enabled )
678void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping(
bool enabled )
685void QgsAdvancedDigitizingFloater::enabledChangedAngle(
bool enabled )
692void QgsAdvancedDigitizingFloater::enabledChangedBearing(
bool enabled )
701 mWeightLineEdit->setText( text );
708 mWeightLineEdit->setVisible( enabled );
709 mWeightLabel->setVisible( enabled );
@ Distance
Distance value.
CadMeasurementDisplayType
Advanced digitizing measurement display types.
@ Hidden
Hide measurement.
@ Cartesian
Use Cartesian measurements.
@ Ellipsoidal
Use Ellipsoidal measurements.
bool itemVisibility(QgsAdvancedDigitizingFloater::FloaterItem item) const
Returns true if the floater item visibility setting is enabled.
void setItemVisibility(QgsAdvancedDigitizingFloater::FloaterItem item, bool visible)
Set whether the floater item should be visible or not.
QgsAdvancedDigitizingFloater(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget)
Create an advanced digitizing floater widget.
FloaterItem
Available floater items.
@ Distance
Distance (segment length).
@ TotalLength
Total length (or perimeter).
@ MCoordinate
M coordinate.
@ Angle
Angle between segments.
@ Bearing
Segment bearing.
@ Weight
Weight for NURBSCurve.
@ ZCoordinate
Z coordinate.
@ YCoordinate
Y coordinate.
@ XCoordinate
X coordinate.
@ CommonAngleSnapping
Common angles.
void setActive(bool active)
Set whether the floater should be active or not.
void setItemMeasurementType(QgsAdvancedDigitizingFloater::FloaterItem item, Qgis::CadMeasurementDisplayType type)
Set whether the measurement display type for a floater item.
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.
static bool itemSupportsMeasurementType(QgsAdvancedDigitizingFloater::FloaterItem item)
Returns true if a floater item supports display in different Qgis::CadMeasurementDisplayType values.
bool active()
Whether the floater is active or not.
Qgis::CadMeasurementDisplayType itemMeasurementDisplayType(QgsAdvancedDigitizingFloater::FloaterItem item) const
Returns the measurement display type for a floater item.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
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 setEnumValue(const QString &key, const T &value, const Section section=NoSection)
Set the value of a setting based on an enum.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
#define BUILTIN_UNREACHABLE
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.