QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgsadvanceddigitizingfloater.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsadvanceddigitizingfloater.cpp - floater for CAD tools
3 ----------------------
4 begin : May 2019
5 copyright : (C) Olivier Dalang
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsfocuswatcher.h"
19#include "qgsmapcanvas.h"
20#include "qgssettings.h"
21#include "qgsunittypes.h"
22
23#include <QEnterEvent>
24#include <QLocale>
25#include <QMouseEvent>
26#include <QString>
27
28#include "moc_qgsadvanceddigitizingfloater.cpp"
29
30using namespace Qt::StringLiterals;
31
33 : QWidget( canvas->viewport() )
34 , mMapCanvas( canvas )
35 , mCadDockWidget( cadDockWidget )
36{
37 setupUi( this );
38
39 setAttribute( Qt::WA_TransparentForMouseEvents );
40 adjustSize();
41
42 setActive( QgsSettings().value( u"/Cad/Floater"_s, false ).toBool() );
43
44 hideIfDisabled();
45
46 enabledCommonAngleSnapping( cadDockWidget->commonAngleConstraint() );
47
48 // This is required to be able to track mouse move events
49 mMapCanvas->viewport()->installEventFilter( this );
50 mMapCanvas->viewport()->setMouseTracking( true );
51
52 // We reuse cadDockWidget's eventFilter for the CAD specific shortcuts
53 mAngleLineEdit->installEventFilter( cadDockWidget );
54 mDistanceLineEdit->installEventFilter( cadDockWidget );
55 mXLineEdit->installEventFilter( cadDockWidget );
56 mYLineEdit->installEventFilter( cadDockWidget );
57 mZLineEdit->installEventFilter( cadDockWidget );
58 mMLineEdit->installEventFilter( cadDockWidget );
59 mWeightLineEdit->installEventFilter( cadDockWidget );
60
61 // Connect all cadDockWidget's signals to update the widget's display
62 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::cadEnabledChanged, this, &QgsAdvancedDigitizingFloater::hideIfDisabled );
63
64 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueXChanged, this, &QgsAdvancedDigitizingFloater::changeX );
65 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueYChanged, this, &QgsAdvancedDigitizingFloater::changeY );
66 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueZChanged, this, &QgsAdvancedDigitizingFloater::changeZ );
67 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueMChanged, this, &QgsAdvancedDigitizingFloater::changeM );
68 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueAngleChanged, this, &QgsAdvancedDigitizingFloater::changeAngle );
69 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueBearingChanged, this, &QgsAdvancedDigitizingFloater::changeBearing );
70 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueCommonAngleSnappingChanged, this, &QgsAdvancedDigitizingFloater::changeCommonAngleSnapping );
71 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::commonAngleSnappingShowInFloaterChanged, this, &QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping );
72 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueDistanceChanged, this, &QgsAdvancedDigitizingFloater::changeDistance );
75
76 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockXChanged, this, &QgsAdvancedDigitizingFloater::changeLockX );
77 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockYChanged, this, &QgsAdvancedDigitizingFloater::changeLockY );
78 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockZChanged, this, &QgsAdvancedDigitizingFloater::changeLockZ );
79 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockMChanged, this, &QgsAdvancedDigitizingFloater::changeLockM );
80 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockAngleChanged, this, &QgsAdvancedDigitizingFloater::changeLockAngle );
81 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockDistanceChanged, this, &QgsAdvancedDigitizingFloater::changeLockDistance );
82
83 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeXChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeX );
84 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeYChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeY );
85 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeZChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeZ );
86 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeMChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeM );
87 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeAngleChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeAngle );
88 // distance is always relative
89
90 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnXRequested, this, &QgsAdvancedDigitizingFloater::focusOnX );
91 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnYRequested, this, &QgsAdvancedDigitizingFloater::focusOnY );
92 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnZRequested, this, &QgsAdvancedDigitizingFloater::focusOnZ );
93 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnMRequested, this, &QgsAdvancedDigitizingFloater::focusOnM );
94 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnAngleRequested, this, &QgsAdvancedDigitizingFloater::focusOnAngle );
95 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnDistanceRequested, this, &QgsAdvancedDigitizingFloater::focusOnDistance );
97
98 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedX, this, &QgsAdvancedDigitizingFloater::enabledChangedX );
99 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedY, this, &QgsAdvancedDigitizingFloater::enabledChangedY );
100 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedZ, this, &QgsAdvancedDigitizingFloater::enabledChangedZ );
101 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedM, this, &QgsAdvancedDigitizingFloater::enabledChangedM );
102 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledChangedAngle );
103 // Bearing capability is the same an angle, connect to the same signal:
104 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledChangedBearing );
105 // Common angle snapping capbility is also linked to angle, connect to the same signal:
106 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping );
107 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedDistance, this, &QgsAdvancedDigitizingFloater::enabledChangedDistance );
108
109 // Connect our line edits signals to update cadDockWidget's state (implementation copied from QgsAdvancedDigitizingDockWidget)
110 connect( mXLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
111 connect( mYLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
112 connect( mZLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
113 connect( mMLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
114 connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() {
115 cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed );
116 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
117 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
118 } );
119 connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() {
120 cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed );
121 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
122 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
123 } );
124
125 connect( mXLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
126 connect( mYLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
127 connect( mZLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
128 connect( mMLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
129 connect( mAngleLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
130 connect( mDistanceLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
131
132 QgsFocusWatcher *xWatcher = new QgsFocusWatcher( mXLineEdit );
133 connect( xWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
134 QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit );
135 connect( yWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
136 QgsFocusWatcher *zWatcher = new QgsFocusWatcher( mZLineEdit );
137 connect( zWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
138 QgsFocusWatcher *mWatcher = new QgsFocusWatcher( mYLineEdit );
139 connect( mWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
140 QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit );
141 connect( angleWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() {
142 cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut );
143 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
144 } );
145 connect( angleWatcher, &QgsFocusWatcher::focusIn, this, [this]() {
146 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
147 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
148 } );
149 QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit );
150 connect( distanceWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() {
151 cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut );
152 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
153 } );
154 connect( distanceWatcher, &QgsFocusWatcher::focusIn, this, [this]() {
155 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
156 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
157 } );
158 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
159}
160
161bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
162{
163 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
164 {
165 if ( event->type() == QEvent::MouseMove )
166 {
167 // We update the position when mouse moves
168 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
169 updatePos( mouseEvent->pos() );
170 }
171 else if ( event->type() == QEvent::Enter )
172 {
173 // We show the widget when mouse enters
174 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
175 updatePos( enterEvent->pos() );
176 setVisible( true );
177 }
178 else if ( event->type() == QEvent::Leave )
179 {
180 // We hide the widget when mouse leaves
181 setVisible( false );
182 }
183 }
184 return QWidget::eventFilter( obj, event );
185}
186
188{
189 return mActive;
190}
191
193{
194 return mItemsVisibility.testFlag( item );
195}
196
198{
199 QgsSettings().setValue( u"/Cad/Floater"_s, active );
200
201 mActive = active;
202
203 hideIfDisabled();
204}
205
207{
208 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
209 QgsSettings().setValue( u"/Cad/%1ShowInFloater"_s.arg( enumData.valueToKey( static_cast<int>( item ) ) ), visible );
210 mItemsVisibility.setFlag( item, visible );
211 switch ( item )
212 {
214 enabledChangedX( visible );
215 break;
217 enabledChangedY( visible );
218 break;
220 enabledChangedM( visible );
221 break;
223 enabledChangedZ( visible );
224 break;
226 enabledChangedAngle( visible );
227 break;
229 enabledChangedDistance( visible );
230 break;
232 enabledCommonAngleSnapping( visible );
233 break;
235 enabledChangedBearing( visible );
236 break;
238 enabledChangedWeight( visible );
239 break;
240 }
241}
242
243void QgsAdvancedDigitizingFloater::updatePos( const QPoint &pos )
244{
245 // We hardcode a small delta between the mouse position and the widget's position
246 move( pos + QPoint( 15, 5 ) );
247}
248
249void QgsAdvancedDigitizingFloater::hideIfDisabled()
250{
251 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
252 {
253 setVisible( false );
254 }
255}
256
257void QgsAdvancedDigitizingFloater::changeX( const QString &text )
258{
259 mXLineEdit->setText( text );
260}
261
262void QgsAdvancedDigitizingFloater::changeY( const QString &text )
263{
264 mYLineEdit->setText( text );
265}
266
267void QgsAdvancedDigitizingFloater::changeZ( const QString &text )
268{
269 mZLineEdit->setText( text );
270}
271
272void QgsAdvancedDigitizingFloater::changeM( const QString &text )
273{
274 mMLineEdit->setText( text );
275}
276
277void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping( double angle )
278{
279 mCommonAngleSnappingLineEdit->setText( qgsDoubleNear( angle, 0.0 ) ? tr( "disabled" ) : QLocale().toString( angle ).append( tr( " °" ) ) );
280}
281
282void QgsAdvancedDigitizingFloater::changeDistance( const QString &text )
283{
284 mDistanceLineEdit->setText( text );
285}
286
287void QgsAdvancedDigitizingFloater::changeAngle( const QString &text )
288{
289 mAngleLineEdit->setText( text );
290}
291
292void QgsAdvancedDigitizingFloater::changeBearing( const QString &text )
293{
294 mBearingLineEdit->setText( text );
295}
296
297void QgsAdvancedDigitizingFloater::changeLockX( bool locked )
298{
299 if ( !locked )
300 {
301 mXLineEdit->setStyleSheet( QString() );
302 mXLabel->setStyleSheet( QString() );
303 }
304 else
305 {
306 mXLineEdit->setStyleSheet( u"font-weight: bold"_s );
307 mXLabel->setStyleSheet( u"font-weight: bold"_s );
308 }
309}
310
311void QgsAdvancedDigitizingFloater::changeLockY( bool locked )
312{
313 if ( !locked )
314 {
315 mYLineEdit->setStyleSheet( QString() );
316 mYLabel->setStyleSheet( QString() );
317 }
318 else
319 {
320 mYLineEdit->setStyleSheet( u"font-weight: bold"_s );
321 mYLabel->setStyleSheet( u"font-weight: bold"_s );
322 }
323}
324
325void QgsAdvancedDigitizingFloater::changeLockZ( bool locked )
326{
327 if ( !locked )
328 {
329 mZLineEdit->setStyleSheet( QString() );
330 mZLabel->setStyleSheet( QString() );
331 }
332 else
333 {
334 mZLineEdit->setStyleSheet( u"font-weight: bold"_s );
335 mZLabel->setStyleSheet( u"font-weight: bold"_s );
336 }
337}
338
339void QgsAdvancedDigitizingFloater::changeLockM( bool locked )
340{
341 if ( !locked )
342 {
343 mMLineEdit->setStyleSheet( QString() );
344 mMLabel->setStyleSheet( QString() );
345 }
346 else
347 {
348 mMLineEdit->setStyleSheet( u"font-weight: bold"_s );
349 mMLabel->setStyleSheet( u"font-weight: bold"_s );
350 }
351}
352
353void QgsAdvancedDigitizingFloater::changeLockDistance( bool locked )
354{
355 if ( !locked )
356 {
357 mDistanceLineEdit->setStyleSheet( QString() );
358 mDistanceLabel->setStyleSheet( QString() );
359 }
360 else
361 {
362 mDistanceLineEdit->setStyleSheet( u"font-weight: bold"_s );
363 mDistanceLabel->setStyleSheet( u"font-weight: bold"_s );
364 }
365}
366
367void QgsAdvancedDigitizingFloater::changeLockAngle( bool locked )
368{
369 if ( !locked )
370 {
371 mAngleLineEdit->setStyleSheet( QString() );
372 mAngleLabel->setStyleSheet( QString() );
373 }
374 else
375 {
376 mAngleLineEdit->setStyleSheet( u"font-weight: bold"_s );
377 mAngleLabel->setStyleSheet( u"font-weight: bold"_s );
378 }
379}
380
381
382void QgsAdvancedDigitizingFloater::changeRelativeX( bool relative )
383{
384 if ( !relative )
385 {
386 mXLabel->setText( "x" );
387 }
388 else
389 {
390 mXLabel->setText( "Δx" );
391 }
392 adjustSize();
393}
394
395void QgsAdvancedDigitizingFloater::changeRelativeY( bool relative )
396{
397 if ( !relative )
398 {
399 mYLabel->setText( "y" );
400 }
401 else
402 {
403 mYLabel->setText( "Δy" );
404 }
405 adjustSize();
406}
407
408void QgsAdvancedDigitizingFloater::changeRelativeZ( bool relative )
409{
410 if ( !relative )
411 {
412 mZLabel->setText( "z" );
413 }
414 else
415 {
416 mZLabel->setText( "Δz" );
417 }
418 adjustSize();
419}
420
421void QgsAdvancedDigitizingFloater::changeRelativeM( bool relative )
422{
423 if ( !relative )
424 {
425 mMLabel->setText( "m" );
426 }
427 else
428 {
429 mMLabel->setText( "Δm" );
430 }
431 adjustSize();
432}
433
434// distance is always relative
435
436void QgsAdvancedDigitizingFloater::changeRelativeAngle( bool relative )
437{
438 if ( !relative )
439 {
440 mAngleLabel->setText( "a" );
441 }
442 else
443 {
444 mAngleLabel->setText( "Δa" );
445 }
446 adjustSize();
447}
448
449void QgsAdvancedDigitizingFloater::focusOnX()
450{
451 if ( mActive )
452 {
453 mXLineEdit->setFocus();
454 mXLineEdit->selectAll();
455 }
456}
457
458void QgsAdvancedDigitizingFloater::focusOnY()
459{
460 if ( mActive )
461 {
462 mYLineEdit->setFocus();
463 mYLineEdit->selectAll();
464 }
465}
466
467void QgsAdvancedDigitizingFloater::focusOnZ()
468{
469 if ( mActive )
470 {
471 mZLineEdit->setFocus();
472 mZLineEdit->selectAll();
473 }
474}
475
476void QgsAdvancedDigitizingFloater::focusOnM()
477{
478 if ( mActive )
479 {
480 mMLineEdit->setFocus();
481 mMLineEdit->selectAll();
482 }
483}
484
485void QgsAdvancedDigitizingFloater::focusOnDistance()
486{
487 if ( mActive )
488 {
489 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
490 mDistanceLineEdit->setText( cleanedInputValue );
491 mDistanceLineEdit->setFocus();
492 mDistanceLineEdit->selectAll();
493 }
494}
495
496void QgsAdvancedDigitizingFloater::focusOnAngle()
497{
498 if ( mActive )
499 {
500 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
501 mAngleLineEdit->setText( cleanedInputValue );
502 mAngleLineEdit->setFocus();
503 mAngleLineEdit->selectAll();
504 }
505}
506
508{
509 if ( mActive )
510 {
511 mWeightLineEdit->setFocus();
512 mWeightLineEdit->selectAll();
513 }
514}
515
516
517void QgsAdvancedDigitizingFloater::enabledChangedX( bool enabled )
518{
519 mXLineEdit->setVisible( enabled && itemVisibility( FloaterItem::XCoordinate ) );
520 mXLabel->setVisible( enabled && itemVisibility( FloaterItem::XCoordinate ) );
521 adjustSize();
522}
523
524void QgsAdvancedDigitizingFloater::enabledChangedY( bool enabled )
525{
526 mYLineEdit->setVisible( enabled && itemVisibility( FloaterItem::YCoordinate ) );
527 mYLabel->setVisible( enabled && itemVisibility( FloaterItem::YCoordinate ) );
528 adjustSize();
529}
530
531void QgsAdvancedDigitizingFloater::enabledChangedZ( bool enabled )
532{
533 mZLineEdit->setVisible( enabled && itemVisibility( FloaterItem::ZCoordinate ) );
534 mZLabel->setVisible( enabled && itemVisibility( FloaterItem::ZCoordinate ) );
535 adjustSize();
536}
537
538void QgsAdvancedDigitizingFloater::enabledChangedM( bool enabled )
539{
540 mMLineEdit->setVisible( enabled && itemVisibility( FloaterItem::MCoordinate ) );
541 mMLabel->setVisible( enabled && itemVisibility( FloaterItem::MCoordinate ) );
542 adjustSize();
543}
544
545void QgsAdvancedDigitizingFloater::enabledChangedDistance( bool enabled )
546{
547 mDistanceLineEdit->setVisible( enabled && itemVisibility( FloaterItem::Distance ) );
548 mDistanceLabel->setVisible( enabled && itemVisibility( FloaterItem::Distance ) );
549 adjustSize();
550}
551
552void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping( bool enabled )
553{
554 mCommonAngleSnappingLineEdit->setVisible( enabled && itemVisibility( FloaterItem::CommonAngleSnapping ) );
555 mCommonAngleSnappingLabel->setVisible( enabled && itemVisibility( FloaterItem::CommonAngleSnapping ) );
556 adjustSize();
557}
558
559void QgsAdvancedDigitizingFloater::enabledChangedAngle( bool enabled )
560{
561 mAngleLineEdit->setVisible( enabled && itemVisibility( FloaterItem::Angle ) );
562 mAngleLabel->setVisible( enabled && itemVisibility( FloaterItem::Angle ) );
563 adjustSize();
564}
565
566void QgsAdvancedDigitizingFloater::enabledChangedBearing( bool enabled )
567{
568 mBearingLineEdit->setVisible( enabled && itemVisibility( FloaterItem::Bearing ) );
569 mBearingLabel->setVisible( enabled && itemVisibility( FloaterItem::Bearing ) );
570 adjustSize();
571}
572
574{
575 mWeightLineEdit->setText( text );
576}
577
579{
580 // Always show weight when enabled, regardless of user preference
581 // This is because weight editing is a temporary mode (activated with W key)
582 mWeightLineEdit->setVisible( enabled );
583 mWeightLabel->setVisible( enabled );
584 adjustSize();
585}
@ Distance
Distance value.
Definition qgis.h:4136
@ Angle
Angle value.
Definition qgis.h:4135
static QString removeSuffix(const QString &text, Qgis::CadConstraintType constraintType)
Removes unit suffix from the constraint text.
A dockable widget used to handle the CAD tools on top of a selection of map tools.
void valueDistanceChanged(const QString &value)
Emitted whenever the distance value changes (either the mouse moved, or the user changed the input).
bool commonAngleConstraint() const
Returns true if a constraint on a common angle is active.
void lockZChanged(bool locked)
Emitted whenever the Z parameter is locked.
void setZ(const QString &value, WidgetSetMode mode)
Set the Z value on the widget.
void setY(const QString &value, WidgetSetMode mode)
Set the Y value on the widget.
void enabledChangedY(bool enabled)
Emitted whenever the Y field is enabled or disabled.
void valueWeightChanged(const QString &value)
Emitted whenever the weight value changes for NURBS curves.
void enabledChangedWeight(bool enabled)
Emitted whenever the weight field is enabled or disabled for NURBS curves.
void relativeMChanged(bool relative)
Emitted whenever the M parameter is toggled between absolute and relative.
void lockXChanged(bool locked)
Emitted whenever the X parameter is locked.
void focusOnXRequested()
Emitted whenever the X field should get the focus using the shortcuts (X).
void enabledChangedX(bool enabled)
Emitted whenever the X field is enabled or disabled.
void valueYChanged(const QString &value)
Emitted whenever the Y value changes (either the mouse moved, or the user changed the input).
void focusOnWeightRequested()
Emitted whenever the weight field should get the focus using the shortcuts (W).
void focusOnYRequested()
Emitted whenever the Y field should get the focus using the shortcuts (Y).
void enabledChangedDistance(bool enabled)
Emitted whenever the distance field is enabled or disabled.
void valueZChanged(const QString &value)
Emitted whenever the Z value changes (either the mouse moved, or the user changed the input).
void lockAngleChanged(bool locked)
Emitted whenever the angle parameter is locked.
void commonAngleSnappingShowInFloaterChanged(bool enabled)
Emitted whenever the option to show common angle snapping in the floater changes.
void relativeXChanged(bool relative)
Emitted whenever the X parameter is toggled between absolute and relative.
void focusOnAngleRequested()
Emitted whenever the angle field should get the focus using the shortcuts (A).
void focusOnZRequested()
Emitted whenever the Z field should get the focus using the shortcuts (Z).
void focusOnMRequested()
Emitted whenever the M field should get the focus using the shortcuts (M).
void valueXChanged(const QString &value)
Emitted whenever the X value changes (either the mouse moved, or the user changed the input).
void lockMChanged(bool locked)
Emitted whenever the M parameter is locked.
void cadEnabledChanged(bool enabled)
Signals for external widgets that need to update according to current values.
void lockYChanged(bool locked)
Emitted whenever the Y parameter is locked.
void valueAngleChanged(const QString &value)
Emitted whenever the angle value changes (either the mouse moved, or the user changed the input).
void valueMChanged(const QString &value)
Emitted whenever the M value changes (either the mouse moved, or the user changed the input).
void relativeZChanged(bool relative)
Emitted whenever the Z parameter is toggled between absolute and relative.
void setAngle(const QString &value, WidgetSetMode mode)
Set the angle value on the widget.
void enabledChangedAngle(bool enabled)
Emitted whenever the angle field is enabled or disabled.
void enabledChangedZ(bool enabled)
Emitted whenever the Z field is enabled or disabled.
void lockDistanceChanged(bool locked)
Emitted whenever the distance parameter is locked.
void relativeAngleChanged(bool relative)
Emitted whenever the angleX parameter is toggled between absolute and relative.
void valueBearingChanged(const QString &value)
Emitted whenever the bearing value changes.
void enabledChangedM(bool enabled)
Emitted whenever the M field is enabled or disabled.
void setDistance(const QString &value, WidgetSetMode mode)
Set the distance value on the widget.
void setX(const QString &value, WidgetSetMode mode)
Set the X value on the widget.
void focusOnDistanceRequested()
Emitted whenever the distance field should get the focus using the shortcuts (D).
void valueCommonAngleSnappingChanged(double angle)
Emitted whenever the snapping to common angle option changes, angle = 0 means that the functionality ...
void setM(const QString &value, WidgetSetMode mode)
Set the M value on the widget.
void relativeYChanged(bool relative)
Emitted whenever the Y parameter is toggled between absolute and relative.
QgsAdvancedDigitizingFloater(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget)
Create an advanced digitizing floater widget.
void setItemVisibility(const QgsAdvancedDigitizingFloater::FloaterItem &item, bool visible)
Set whether the floater item should be visible or not.
bool itemVisibility(const QgsAdvancedDigitizingFloater::FloaterItem &item) const
Returns true if the floater item visibility setting is enabled.
void setActive(bool active)
Set whether the floater should be active or not.
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.
bool active()
Whether the floater is active or not.
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.
Definition qgssettings.h:68
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
Definition qgis.h:6900
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition qgis.h:6804