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 );
132 connect( mAngleLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
135 connect( mDistanceLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
150 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
154 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
159 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
163 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
165 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
168bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
170 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
172 if ( event->type() == QEvent::MouseMove )
175 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
176 updatePos( mouseEvent->pos() );
178 else if ( event->type() == QEvent::Enter )
181 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
182 updatePos( enterEvent->pos() );
185 else if ( event->type() == QEvent::Leave )
191 return QWidget::eventFilter( obj, event );
201 return mItemsVisibility.testFlag( item );
211 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
232 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
233 QgsSettings().
setValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), visible );
234 mItemsVisibility.setFlag( item, visible );
238 enabledChangedX( visible );
241 enabledChangedY( visible );
244 enabledChangedM( visible );
247 enabledChangedZ( visible );
250 enabledChangedAngle( visible );
253 enabledChangedDistance( visible );
256 enabledCommonAngleSnapping( visible );
259 enabledChangedBearing( visible );
278 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
279 QgsSettings().
setEnumValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), type );
283 mItemsVisibility.setFlag( item,
false );
288 mItemsVisibility.setFlag( item,
true );
293 const QColor iconColor = palette().color( QPalette::ColorRole::WindowText );
323 mTotalAreaLineEdit->setVisible( show );
324 mAreaLabel->setVisible( show );
325 mAreaMeasurementTypeLabel->setVisible( show );
326 mAreaMeasurementTypeLabel->setPixmap( pixmap );
332 mTotalLengthLineEdit->setVisible( show );
333 mTotalLengthLabel->setVisible( show );
334 mLengthMeasurementTypeLabel->setVisible( show );
335 mLengthMeasurementTypeLabel->setPixmap( pixmap );
363void QgsAdvancedDigitizingFloater::updatePos(
const QPoint &pos )
366 move( pos + QPoint( 15, 5 ) );
369void QgsAdvancedDigitizingFloater::hideIfDisabled()
371 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
377void QgsAdvancedDigitizingFloater::changeX(
const QString &text )
379 mXLineEdit->setText( text );
382void QgsAdvancedDigitizingFloater::changeY(
const QString &text )
384 mYLineEdit->setText( text );
387void QgsAdvancedDigitizingFloater::changeZ(
const QString &text )
389 mZLineEdit->setText( text );
392void QgsAdvancedDigitizingFloater::changeM(
const QString &text )
394 mMLineEdit->setText( text );
397void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping(
double angle )
399 mCommonAngleSnappingLineEdit->setText(
qgsDoubleNear( angle, 0.0 ) ? tr(
"disabled" ) : QLocale().toString( angle ).append( tr(
" °" ) ) );
402void QgsAdvancedDigitizingFloater::changeDistance(
const QString &text )
404 mDistanceLineEdit->setText( text );
407void QgsAdvancedDigitizingFloater::changeAngle(
const QString &text )
409 mAngleLineEdit->setText( text );
412void QgsAdvancedDigitizingFloater::changeBearing(
const QString &text )
414 mBearingLineEdit->setText( text );
417void QgsAdvancedDigitizingFloater::changeArea(
const QString &text )
419 mTotalAreaLineEdit->setText( text );
422void QgsAdvancedDigitizingFloater::changeTotalLength(
const QString &text )
424 mTotalLengthLineEdit->setText( text );
427void QgsAdvancedDigitizingFloater::changeLockX(
bool locked )
431 mXLineEdit->setStyleSheet( QString() );
432 mXLabel->setStyleSheet( QString() );
436 mXLineEdit->setStyleSheet( u
"font-weight: bold"_s );
437 mXLabel->setStyleSheet( u
"font-weight: bold"_s );
441void QgsAdvancedDigitizingFloater::changeLockY(
bool locked )
445 mYLineEdit->setStyleSheet( QString() );
446 mYLabel->setStyleSheet( QString() );
450 mYLineEdit->setStyleSheet( u
"font-weight: bold"_s );
451 mYLabel->setStyleSheet( u
"font-weight: bold"_s );
455void QgsAdvancedDigitizingFloater::changeLockZ(
bool locked )
459 mZLineEdit->setStyleSheet( QString() );
460 mZLabel->setStyleSheet( QString() );
464 mZLineEdit->setStyleSheet( u
"font-weight: bold"_s );
465 mZLabel->setStyleSheet( u
"font-weight: bold"_s );
469void QgsAdvancedDigitizingFloater::changeLockM(
bool locked )
473 mMLineEdit->setStyleSheet( QString() );
474 mMLabel->setStyleSheet( QString() );
478 mMLineEdit->setStyleSheet( u
"font-weight: bold"_s );
479 mMLabel->setStyleSheet( u
"font-weight: bold"_s );
483void QgsAdvancedDigitizingFloater::changeLockDistance(
bool locked )
487 mDistanceLineEdit->setStyleSheet( QString() );
488 mDistanceLabel->setStyleSheet( QString() );
492 mDistanceLineEdit->setStyleSheet( u
"font-weight: bold"_s );
493 mDistanceLabel->setStyleSheet( u
"font-weight: bold"_s );
497void QgsAdvancedDigitizingFloater::changeLockAngle(
bool locked )
501 mAngleLineEdit->setStyleSheet( QString() );
502 mAngleLabel->setStyleSheet( QString() );
506 mAngleLineEdit->setStyleSheet( u
"font-weight: bold"_s );
507 mAngleLabel->setStyleSheet( u
"font-weight: bold"_s );
512void QgsAdvancedDigitizingFloater::changeRelativeX(
bool relative )
516 mXLabel->setText(
"x" );
520 mXLabel->setText(
"Δx" );
525void QgsAdvancedDigitizingFloater::changeRelativeY(
bool relative )
529 mYLabel->setText(
"y" );
533 mYLabel->setText(
"Δy" );
538void QgsAdvancedDigitizingFloater::changeRelativeZ(
bool relative )
542 mZLabel->setText(
"z" );
546 mZLabel->setText(
"Δz" );
551void QgsAdvancedDigitizingFloater::changeRelativeM(
bool relative )
555 mMLabel->setText(
"m" );
559 mMLabel->setText(
"Δm" );
566void QgsAdvancedDigitizingFloater::changeRelativeAngle(
bool relative )
570 mAngleLabel->setText(
"a" );
574 mAngleLabel->setText(
"Δa" );
579void QgsAdvancedDigitizingFloater::focusOnX()
583 mXLineEdit->setFocus();
584 mXLineEdit->selectAll();
588void QgsAdvancedDigitizingFloater::focusOnY()
592 mYLineEdit->setFocus();
593 mYLineEdit->selectAll();
597void QgsAdvancedDigitizingFloater::focusOnZ()
601 mZLineEdit->setFocus();
602 mZLineEdit->selectAll();
606void QgsAdvancedDigitizingFloater::focusOnM()
610 mMLineEdit->setFocus();
611 mMLineEdit->selectAll();
615void QgsAdvancedDigitizingFloater::focusOnDistance()
620 mDistanceLineEdit->setText( cleanedInputValue );
621 mDistanceLineEdit->setFocus();
622 mDistanceLineEdit->selectAll();
626void QgsAdvancedDigitizingFloater::focusOnAngle()
631 mAngleLineEdit->setText( cleanedInputValue );
632 mAngleLineEdit->setFocus();
633 mAngleLineEdit->selectAll();
641 mWeightLineEdit->setFocus();
642 mWeightLineEdit->selectAll();
647void QgsAdvancedDigitizingFloater::enabledChangedX(
bool enabled )
654void QgsAdvancedDigitizingFloater::enabledChangedY(
bool enabled )
661void QgsAdvancedDigitizingFloater::enabledChangedZ(
bool enabled )
668void QgsAdvancedDigitizingFloater::enabledChangedM(
bool enabled )
675void QgsAdvancedDigitizingFloater::enabledChangedDistance(
bool enabled )
682void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping(
bool enabled )
689void QgsAdvancedDigitizingFloater::enabledChangedAngle(
bool enabled )
696void QgsAdvancedDigitizingFloater::enabledChangedBearing(
bool enabled )
705 mWeightLineEdit->setText( text );
712 mWeightLineEdit->setVisible( enabled );
713 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.