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 );
129 connect( mXLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
130 this->mEditing =
true;
132 this->mEditing =
false;
134 connect( mYLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
135 this->mEditing =
true;
137 this->mEditing =
false;
139 connect( mZLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
140 this->mEditing =
true;
142 this->mEditing =
false;
144 connect( mMLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
145 this->mEditing =
true;
147 this->mEditing =
false;
149 connect( mAngleLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
150 this->mEditing =
true;
152 this->mEditing =
false;
154 connect( mDistanceLineEdit, &QLineEdit::textEdited, cadDockWidget, [
this, cadDockWidget]() {
155 this->mEditing =
true;
157 this->mEditing =
false;
171 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
175 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
180 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
184 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
186 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
189bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
191 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
193 if ( event->type() == QEvent::MouseMove )
196 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
197 updatePos( mouseEvent->pos() );
199 else if ( event->type() == QEvent::Enter )
202 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
203 updatePos( enterEvent->pos() );
206 else if ( event->type() == QEvent::Leave )
212 return QWidget::eventFilter( obj, event );
222 return mItemsVisibility.testFlag( item );
232 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
253 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
254 QgsSettings().
setValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), visible );
255 mItemsVisibility.setFlag( item, visible );
259 enabledChangedX( visible );
262 enabledChangedY( visible );
265 enabledChangedM( visible );
268 enabledChangedZ( visible );
271 enabledChangedAngle( visible );
274 enabledChangedDistance( visible );
277 enabledCommonAngleSnapping( visible );
280 enabledChangedBearing( visible );
299 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
300 QgsSettings().
setEnumValue( u
"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey(
static_cast<int>( item ) ) ), type );
304 mItemsVisibility.setFlag( item,
false );
309 mItemsVisibility.setFlag( item,
true );
314 const QColor iconColor = palette().color( QPalette::ColorRole::WindowText );
344 mTotalAreaLineEdit->setVisible( show );
345 mAreaLabel->setVisible( show );
346 mAreaMeasurementTypeLabel->setVisible( show );
347 mAreaMeasurementTypeLabel->setPixmap( pixmap );
353 mTotalLengthLineEdit->setVisible( show );
354 mTotalLengthLabel->setVisible( show );
355 mLengthMeasurementTypeLabel->setVisible( show );
356 mLengthMeasurementTypeLabel->setPixmap( pixmap );
384void QgsAdvancedDigitizingFloater::updatePos(
const QPoint &pos )
387 move( pos + QPoint( 15, 5 ) );
390void QgsAdvancedDigitizingFloater::hideIfDisabled()
392 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
398void QgsAdvancedDigitizingFloater::changeX(
const QString &text )
400 mXLineEdit->setText( text );
401 if ( !this->mEditing )
403 mXLineEdit->setCursorPosition( 0 );
407void QgsAdvancedDigitizingFloater::changeY(
const QString &text )
409 mYLineEdit->setText( text );
410 if ( !this->mEditing )
412 mYLineEdit->setCursorPosition( 0 );
416void QgsAdvancedDigitizingFloater::changeZ(
const QString &text )
418 mZLineEdit->setText( text );
419 if ( !this->mEditing )
421 mZLineEdit->setCursorPosition( 0 );
425void QgsAdvancedDigitizingFloater::changeM(
const QString &text )
427 mMLineEdit->setText( text );
428 if ( !this->mEditing )
430 mMLineEdit->setCursorPosition( 0 );
434void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping(
double angle )
436 mCommonAngleSnappingLineEdit->setText(
qgsDoubleNear( angle, 0.0 ) ? tr(
"disabled" ) : QLocale().toString( angle ).append( tr(
" °" ) ) );
439void QgsAdvancedDigitizingFloater::changeDistance(
const QString &text )
441 mDistanceLineEdit->setText( text );
442 if ( !this->mEditing )
444 mDistanceLineEdit->setCursorPosition( 0 );
448void QgsAdvancedDigitizingFloater::changeAngle(
const QString &text )
450 mAngleLineEdit->setText( text );
451 if ( !this->mEditing )
453 mAngleLineEdit->setCursorPosition( 0 );
457void QgsAdvancedDigitizingFloater::changeBearing(
const QString &text )
459 mBearingLineEdit->setText( text );
460 mBearingLineEdit->setCursorPosition( 0 );
463void QgsAdvancedDigitizingFloater::changeArea(
const QString &text )
465 mTotalAreaLineEdit->setText( text );
466 mTotalAreaLineEdit->setCursorPosition( 0 );
469void QgsAdvancedDigitizingFloater::changeTotalLength(
const QString &text )
471 mTotalLengthLineEdit->setText( text );
472 mTotalLengthLineEdit->setCursorPosition( 0 );
475void QgsAdvancedDigitizingFloater::changeLockX(
bool locked )
479 mXLineEdit->setStyleSheet( QString() );
480 mXLabel->setStyleSheet( QString() );
484 mXLineEdit->setStyleSheet( u
"font-weight: bold"_s );
485 mXLabel->setStyleSheet( u
"font-weight: bold"_s );
489void QgsAdvancedDigitizingFloater::changeLockY(
bool locked )
493 mYLineEdit->setStyleSheet( QString() );
494 mYLabel->setStyleSheet( QString() );
498 mYLineEdit->setStyleSheet( u
"font-weight: bold"_s );
499 mYLabel->setStyleSheet( u
"font-weight: bold"_s );
503void QgsAdvancedDigitizingFloater::changeLockZ(
bool locked )
507 mZLineEdit->setStyleSheet( QString() );
508 mZLabel->setStyleSheet( QString() );
512 mZLineEdit->setStyleSheet( u
"font-weight: bold"_s );
513 mZLabel->setStyleSheet( u
"font-weight: bold"_s );
517void QgsAdvancedDigitizingFloater::changeLockM(
bool locked )
521 mMLineEdit->setStyleSheet( QString() );
522 mMLabel->setStyleSheet( QString() );
526 mMLineEdit->setStyleSheet( u
"font-weight: bold"_s );
527 mMLabel->setStyleSheet( u
"font-weight: bold"_s );
531void QgsAdvancedDigitizingFloater::changeLockDistance(
bool locked )
535 mDistanceLineEdit->setStyleSheet( QString() );
536 mDistanceLabel->setStyleSheet( QString() );
540 mDistanceLineEdit->setStyleSheet( u
"font-weight: bold"_s );
541 mDistanceLabel->setStyleSheet( u
"font-weight: bold"_s );
545void QgsAdvancedDigitizingFloater::changeLockAngle(
bool locked )
549 mAngleLineEdit->setStyleSheet( QString() );
550 mAngleLabel->setStyleSheet( QString() );
554 mAngleLineEdit->setStyleSheet( u
"font-weight: bold"_s );
555 mAngleLabel->setStyleSheet( u
"font-weight: bold"_s );
560void QgsAdvancedDigitizingFloater::changeRelativeX(
bool relative )
564 mXLabel->setText(
"x" );
568 mXLabel->setText(
"Δx" );
573void QgsAdvancedDigitizingFloater::changeRelativeY(
bool relative )
577 mYLabel->setText(
"y" );
581 mYLabel->setText(
"Δy" );
586void QgsAdvancedDigitizingFloater::changeRelativeZ(
bool relative )
590 mZLabel->setText(
"z" );
594 mZLabel->setText(
"Δz" );
599void QgsAdvancedDigitizingFloater::changeRelativeM(
bool relative )
603 mMLabel->setText(
"m" );
607 mMLabel->setText(
"Δm" );
614void QgsAdvancedDigitizingFloater::changeRelativeAngle(
bool relative )
618 mAngleLabel->setText(
"a" );
622 mAngleLabel->setText(
"Δa" );
627void QgsAdvancedDigitizingFloater::focusOnX()
631 mXLineEdit->setFocus();
632 mXLineEdit->selectAll();
636void QgsAdvancedDigitizingFloater::focusOnY()
640 mYLineEdit->setFocus();
641 mYLineEdit->selectAll();
645void QgsAdvancedDigitizingFloater::focusOnZ()
649 mZLineEdit->setFocus();
650 mZLineEdit->selectAll();
654void QgsAdvancedDigitizingFloater::focusOnM()
658 mMLineEdit->setFocus();
659 mMLineEdit->selectAll();
663void QgsAdvancedDigitizingFloater::focusOnDistance()
668 mDistanceLineEdit->setText( cleanedInputValue );
669 mDistanceLineEdit->setFocus();
670 mDistanceLineEdit->selectAll();
674void QgsAdvancedDigitizingFloater::focusOnAngle()
679 mAngleLineEdit->setText( cleanedInputValue );
680 mAngleLineEdit->setFocus();
681 mAngleLineEdit->selectAll();
689 mWeightLineEdit->setFocus();
690 mWeightLineEdit->selectAll();
695void QgsAdvancedDigitizingFloater::enabledChangedX(
bool enabled )
702void QgsAdvancedDigitizingFloater::enabledChangedY(
bool enabled )
709void QgsAdvancedDigitizingFloater::enabledChangedZ(
bool enabled )
716void QgsAdvancedDigitizingFloater::enabledChangedM(
bool enabled )
723void QgsAdvancedDigitizingFloater::enabledChangedDistance(
bool enabled )
730void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping(
bool enabled )
737void QgsAdvancedDigitizingFloater::enabledChangedAngle(
bool enabled )
744void QgsAdvancedDigitizingFloater::enabledChangedBearing(
bool enabled )
753 mWeightLineEdit->setText( text );
760 mWeightLineEdit->setVisible( enabled );
761 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.