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 );
383void QgsAdvancedDigitizingFloater::changeY(
const QString &text )
385 mYLineEdit->setText( text );
388void QgsAdvancedDigitizingFloater::changeZ(
const QString &text )
390 mZLineEdit->setText( text );
393void QgsAdvancedDigitizingFloater::changeM(
const QString &text )
395 mMLineEdit->setText( text );
398void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping(
double angle )
400 mCommonAngleSnappingLineEdit->setText(
qgsDoubleNear( angle, 0.0 ) ? tr(
"disabled" ) : QLocale().toString( angle ).append( tr(
" °" ) ) );
403void QgsAdvancedDigitizingFloater::changeDistance(
const QString &text )
405 mDistanceLineEdit->setText( text );
408void QgsAdvancedDigitizingFloater::changeAngle(
const QString &text )
410 mAngleLineEdit->setText( text );
413void QgsAdvancedDigitizingFloater::changeBearing(
const QString &text )
415 mBearingLineEdit->setText( text );
418void QgsAdvancedDigitizingFloater::changeArea(
const QString &text )
420 mTotalAreaLineEdit->setText( text );
423void QgsAdvancedDigitizingFloater::changeTotalLength(
const QString &text )
425 mTotalLengthLineEdit->setText( text );
428void QgsAdvancedDigitizingFloater::changeLockX(
bool locked )
432 mXLineEdit->setStyleSheet( QString() );
433 mXLabel->setStyleSheet( QString() );
437 mXLineEdit->setStyleSheet( u
"font-weight: bold"_s );
438 mXLabel->setStyleSheet( u
"font-weight: bold"_s );
442void QgsAdvancedDigitizingFloater::changeLockY(
bool locked )
446 mYLineEdit->setStyleSheet( QString() );
447 mYLabel->setStyleSheet( QString() );
451 mYLineEdit->setStyleSheet( u
"font-weight: bold"_s );
452 mYLabel->setStyleSheet( u
"font-weight: bold"_s );
456void QgsAdvancedDigitizingFloater::changeLockZ(
bool locked )
460 mZLineEdit->setStyleSheet( QString() );
461 mZLabel->setStyleSheet( QString() );
465 mZLineEdit->setStyleSheet( u
"font-weight: bold"_s );
466 mZLabel->setStyleSheet( u
"font-weight: bold"_s );
470void QgsAdvancedDigitizingFloater::changeLockM(
bool locked )
474 mMLineEdit->setStyleSheet( QString() );
475 mMLabel->setStyleSheet( QString() );
479 mMLineEdit->setStyleSheet( u
"font-weight: bold"_s );
480 mMLabel->setStyleSheet( u
"font-weight: bold"_s );
484void QgsAdvancedDigitizingFloater::changeLockDistance(
bool locked )
488 mDistanceLineEdit->setStyleSheet( QString() );
489 mDistanceLabel->setStyleSheet( QString() );
493 mDistanceLineEdit->setStyleSheet( u
"font-weight: bold"_s );
494 mDistanceLabel->setStyleSheet( u
"font-weight: bold"_s );
498void QgsAdvancedDigitizingFloater::changeLockAngle(
bool locked )
502 mAngleLineEdit->setStyleSheet( QString() );
503 mAngleLabel->setStyleSheet( QString() );
507 mAngleLineEdit->setStyleSheet( u
"font-weight: bold"_s );
508 mAngleLabel->setStyleSheet( u
"font-weight: bold"_s );
513void QgsAdvancedDigitizingFloater::changeRelativeX(
bool relative )
517 mXLabel->setText(
"x" );
521 mXLabel->setText(
"Δx" );
526void QgsAdvancedDigitizingFloater::changeRelativeY(
bool relative )
530 mYLabel->setText(
"y" );
534 mYLabel->setText(
"Δy" );
539void QgsAdvancedDigitizingFloater::changeRelativeZ(
bool relative )
543 mZLabel->setText(
"z" );
547 mZLabel->setText(
"Δz" );
552void QgsAdvancedDigitizingFloater::changeRelativeM(
bool relative )
556 mMLabel->setText(
"m" );
560 mMLabel->setText(
"Δm" );
567void QgsAdvancedDigitizingFloater::changeRelativeAngle(
bool relative )
571 mAngleLabel->setText(
"a" );
575 mAngleLabel->setText(
"Δa" );
580void QgsAdvancedDigitizingFloater::focusOnX()
584 mXLineEdit->setFocus();
585 mXLineEdit->selectAll();
589void QgsAdvancedDigitizingFloater::focusOnY()
593 mYLineEdit->setFocus();
594 mYLineEdit->selectAll();
598void QgsAdvancedDigitizingFloater::focusOnZ()
602 mZLineEdit->setFocus();
603 mZLineEdit->selectAll();
607void QgsAdvancedDigitizingFloater::focusOnM()
611 mMLineEdit->setFocus();
612 mMLineEdit->selectAll();
616void QgsAdvancedDigitizingFloater::focusOnDistance()
621 mDistanceLineEdit->setText( cleanedInputValue );
622 mDistanceLineEdit->setFocus();
623 mDistanceLineEdit->selectAll();
627void QgsAdvancedDigitizingFloater::focusOnAngle()
632 mAngleLineEdit->setText( cleanedInputValue );
633 mAngleLineEdit->setFocus();
634 mAngleLineEdit->selectAll();
642 mWeightLineEdit->setFocus();
643 mWeightLineEdit->selectAll();
648void QgsAdvancedDigitizingFloater::enabledChangedX(
bool enabled )
655void QgsAdvancedDigitizingFloater::enabledChangedY(
bool enabled )
662void QgsAdvancedDigitizingFloater::enabledChangedZ(
bool enabled )
669void QgsAdvancedDigitizingFloater::enabledChangedM(
bool enabled )
676void QgsAdvancedDigitizingFloater::enabledChangedDistance(
bool enabled )
683void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping(
bool enabled )
690void QgsAdvancedDigitizingFloater::enabledChangedAngle(
bool enabled )
697void QgsAdvancedDigitizingFloater::enabledChangedBearing(
bool enabled )
706 mWeightLineEdit->setText( text );
713 mWeightLineEdit->setVisible( enabled );
714 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.