30#include "moc_qgsadvanceddigitizingfloater.cpp"
32using namespace Qt::StringLiterals;
35 : QWidget( canvas->viewport() )
36 , mMapCanvas( canvas )
37 , mCadDockWidget( cadDockWidget )
41 setAttribute( Qt::WA_TransparentForMouseEvents );
51 mMapCanvas->viewport()->installEventFilter(
this );
52 mMapCanvas->viewport()->setMouseTracking(
true );
55 mAngleLineEdit->installEventFilter( cadDockWidget );
56 mDistanceLineEdit->installEventFilter( cadDockWidget );
57 mXLineEdit->installEventFilter( cadDockWidget );
58 mYLineEdit->installEventFilter( cadDockWidget );
59 mZLineEdit->installEventFilter( cadDockWidget );
60 mMLineEdit->installEventFilter( cadDockWidget );
61 mWeightLineEdit->installEventFilter( cadDockWidget );
118 connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [
this, cadDockWidget]() {
121 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
123 connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [
this, cadDockWidget]() {
126 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
133 connect( mAngleLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
136 connect( mDistanceLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
151 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
155 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
160 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
164 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
166 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
169bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
171 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
173 if ( event->type() == QEvent::MouseMove )
176 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
177 updatePos( mouseEvent->pos() );
179 else if ( event->type() == QEvent::Enter )
182 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
183 updatePos( enterEvent->pos() );
186 else if ( event->type() == QEvent::Leave )
192 return QWidget::eventFilter( obj, event );
202 return mItemsVisibility.testFlag( item );
212 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
233 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
234 QgsSettings().
setValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), visible );
235 mItemsVisibility.setFlag( item, visible );
239 enabledChangedX( visible );
242 enabledChangedY( visible );
245 enabledChangedM( visible );
248 enabledChangedZ( visible );
251 enabledChangedAngle( visible );
254 enabledChangedDistance( visible );
257 enabledCommonAngleSnapping( visible );
260 enabledChangedBearing( visible );
279 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
280 QgsSettings().
setEnumValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), type );
284 mItemsVisibility.setFlag( item,
false );
289 mItemsVisibility.setFlag( item,
true );
294 const QColor iconColor = palette().color( QPalette::ColorRole::WindowText );
324 mTotalAreaLineEdit->setVisible( show );
325 mAreaLabel->setVisible( show );
326 mAreaMeasurementTypeLabel->setVisible( show );
327 mAreaMeasurementTypeLabel->setPixmap( pixmap );
333 mTotalLengthLineEdit->setVisible( show );
334 mTotalLengthLabel->setVisible( show );
335 mLengthMeasurementTypeLabel->setVisible( show );
336 mLengthMeasurementTypeLabel->setPixmap( pixmap );
364void QgsAdvancedDigitizingFloater::updatePos(
const QPoint &pos )
367 move( pos + QPoint( 15, 5 ) );
370void QgsAdvancedDigitizingFloater::hideIfDisabled()
372 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
378void QgsAdvancedDigitizingFloater::changeX(
const QString &text )
380 mXLineEdit->setText( text );
381 mXLineEdit->setCursorPosition( 0 );
384void QgsAdvancedDigitizingFloater::changeY(
const QString &text )
386 mYLineEdit->setText( text );
387 mYLineEdit->setCursorPosition( 0 );
390void QgsAdvancedDigitizingFloater::changeZ(
const QString &text )
392 mZLineEdit->setText( text );
393 mZLineEdit->setCursorPosition( 0 );
396void QgsAdvancedDigitizingFloater::changeM(
const QString &text )
398 mMLineEdit->setText( text );
399 mMLineEdit->setCursorPosition( 0 );
402void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping(
double angle )
404 mCommonAngleSnappingLineEdit->setText(
qgsDoubleNear( angle, 0.0 ) ? tr(
"disabled" ) : QLocale().toString( angle ).append( tr(
" °" ) ) );
407void QgsAdvancedDigitizingFloater::changeDistance(
const QString &text )
409 mDistanceLineEdit->setText( text );
410 mDistanceLineEdit->setCursorPosition( 0 );
413void QgsAdvancedDigitizingFloater::changeAngle(
const QString &text )
415 mAngleLineEdit->setText( text );
416 mAngleLineEdit->setCursorPosition( 0 );
419void QgsAdvancedDigitizingFloater::changeBearing(
const QString &text )
421 mBearingLineEdit->setText( text );
422 mBearingLineEdit->setCursorPosition( 0 );
425void QgsAdvancedDigitizingFloater::changeArea(
const QString &text )
427 mTotalAreaLineEdit->setText( text );
428 mTotalAreaLineEdit->setCursorPosition( 0 );
431void QgsAdvancedDigitizingFloater::changeTotalLength(
const QString &text )
433 mTotalLengthLineEdit->setText( text );
434 mTotalLengthLineEdit->setCursorPosition( 0 );
437void QgsAdvancedDigitizingFloater::changeLockX(
bool locked )
441 mXLineEdit->setStyleSheet( QString() );
442 mXLabel->setStyleSheet( QString() );
446 mXLineEdit->setStyleSheet( u
"font-weight: bold"_s );
447 mXLabel->setStyleSheet( u
"font-weight: bold"_s );
451void QgsAdvancedDigitizingFloater::changeLockY(
bool locked )
455 mYLineEdit->setStyleSheet( QString() );
456 mYLabel->setStyleSheet( QString() );
460 mYLineEdit->setStyleSheet( u
"font-weight: bold"_s );
461 mYLabel->setStyleSheet( u
"font-weight: bold"_s );
465void QgsAdvancedDigitizingFloater::changeLockZ(
bool locked )
469 mZLineEdit->setStyleSheet( QString() );
470 mZLabel->setStyleSheet( QString() );
474 mZLineEdit->setStyleSheet( u
"font-weight: bold"_s );
475 mZLabel->setStyleSheet( u
"font-weight: bold"_s );
479void QgsAdvancedDigitizingFloater::changeLockM(
bool locked )
483 mMLineEdit->setStyleSheet( QString() );
484 mMLabel->setStyleSheet( QString() );
488 mMLineEdit->setStyleSheet( u
"font-weight: bold"_s );
489 mMLabel->setStyleSheet( u
"font-weight: bold"_s );
493void QgsAdvancedDigitizingFloater::changeLockDistance(
bool locked )
497 mDistanceLineEdit->setStyleSheet( QString() );
498 mDistanceLabel->setStyleSheet( QString() );
502 mDistanceLineEdit->setStyleSheet( u
"font-weight: bold"_s );
503 mDistanceLabel->setStyleSheet( u
"font-weight: bold"_s );
507void QgsAdvancedDigitizingFloater::changeLockAngle(
bool locked )
511 mAngleLineEdit->setStyleSheet( QString() );
512 mAngleLabel->setStyleSheet( QString() );
516 mAngleLineEdit->setStyleSheet( u
"font-weight: bold"_s );
517 mAngleLabel->setStyleSheet( u
"font-weight: bold"_s );
522void QgsAdvancedDigitizingFloater::changeRelativeX(
bool relative )
526 mXLabel->setText(
"x" );
530 mXLabel->setText(
"Δx" );
535void QgsAdvancedDigitizingFloater::changeRelativeY(
bool relative )
539 mYLabel->setText(
"y" );
543 mYLabel->setText(
"Δy" );
548void QgsAdvancedDigitizingFloater::changeRelativeZ(
bool relative )
552 mZLabel->setText(
"z" );
556 mZLabel->setText(
"Δz" );
561void QgsAdvancedDigitizingFloater::changeRelativeM(
bool relative )
565 mMLabel->setText(
"m" );
569 mMLabel->setText(
"Δm" );
576void QgsAdvancedDigitizingFloater::changeRelativeAngle(
bool relative )
580 mAngleLabel->setText(
"a" );
584 mAngleLabel->setText(
"Δa" );
589void QgsAdvancedDigitizingFloater::focusOnX()
593 mXLineEdit->setFocus();
594 mXLineEdit->selectAll();
598void QgsAdvancedDigitizingFloater::focusOnY()
602 mYLineEdit->setFocus();
603 mYLineEdit->selectAll();
607void QgsAdvancedDigitizingFloater::focusOnZ()
611 mZLineEdit->setFocus();
612 mZLineEdit->selectAll();
616void QgsAdvancedDigitizingFloater::focusOnM()
620 mMLineEdit->setFocus();
621 mMLineEdit->selectAll();
625void QgsAdvancedDigitizingFloater::focusOnDistance()
630 mDistanceLineEdit->setText( cleanedInputValue );
631 mDistanceLineEdit->setFocus();
632 mDistanceLineEdit->selectAll();
636void QgsAdvancedDigitizingFloater::focusOnAngle()
641 mAngleLineEdit->setText( cleanedInputValue );
642 mAngleLineEdit->setFocus();
643 mAngleLineEdit->selectAll();
651 mWeightLineEdit->setFocus();
652 mWeightLineEdit->selectAll();
657void QgsAdvancedDigitizingFloater::enabledChangedX(
bool enabled )
664void QgsAdvancedDigitizingFloater::enabledChangedY(
bool enabled )
671void QgsAdvancedDigitizingFloater::enabledChangedZ(
bool enabled )
678void QgsAdvancedDigitizingFloater::enabledChangedM(
bool enabled )
685void QgsAdvancedDigitizingFloater::enabledChangedDistance(
bool enabled )
692void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping(
bool enabled )
699void QgsAdvancedDigitizingFloater::enabledChangedAngle(
bool enabled )
706void QgsAdvancedDigitizingFloater::enabledChangedBearing(
bool enabled )
715 mWeightLineEdit->setText( text );
722 mWeightLineEdit->setVisible( enabled );
723 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.
static const QgsSettingsEntryBool * settingsCadFloaterActive
Settings entry CAD floater active state.
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.