QGIS API Documentation 3.99.0-Master (2fe06baccd8)
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
27#include "moc_qgsadvanceddigitizingfloater.cpp"
28
30 : QWidget( canvas->viewport() )
31 , mMapCanvas( canvas )
32 , mCadDockWidget( cadDockWidget )
33{
34 setupUi( this );
35
36 setAttribute( Qt::WA_TransparentForMouseEvents );
37 adjustSize();
38
39 setActive( QgsSettings().value( QStringLiteral( "/Cad/Floater" ), false ).toBool() );
40
41 hideIfDisabled();
42
43 enabledCommonAngleSnapping( cadDockWidget->commonAngleConstraint() );
44
45 // This is required to be able to track mouse move events
46 mMapCanvas->viewport()->installEventFilter( this );
47 mMapCanvas->viewport()->setMouseTracking( true );
48
49 // We reuse cadDockWidget's eventFilter for the CAD specific shortcuts
50 mAngleLineEdit->installEventFilter( cadDockWidget );
51 mDistanceLineEdit->installEventFilter( cadDockWidget );
52 mXLineEdit->installEventFilter( cadDockWidget );
53 mYLineEdit->installEventFilter( cadDockWidget );
54 mZLineEdit->installEventFilter( cadDockWidget );
55 mMLineEdit->installEventFilter( cadDockWidget );
56
57 // Connect all cadDockWidget's signals to update the widget's display
58 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::cadEnabledChanged, this, &QgsAdvancedDigitizingFloater::hideIfDisabled );
59
60 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueXChanged, this, &QgsAdvancedDigitizingFloater::changeX );
61 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueYChanged, this, &QgsAdvancedDigitizingFloater::changeY );
62 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueZChanged, this, &QgsAdvancedDigitizingFloater::changeZ );
63 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueMChanged, this, &QgsAdvancedDigitizingFloater::changeM );
64 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueAngleChanged, this, &QgsAdvancedDigitizingFloater::changeAngle );
65 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueBearingChanged, this, &QgsAdvancedDigitizingFloater::changeBearing );
66 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueCommonAngleSnappingChanged, this, &QgsAdvancedDigitizingFloater::changeCommonAngleSnapping );
67 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::commonAngleSnappingShowInFloaterChanged, this, &QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping );
68 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::valueDistanceChanged, this, &QgsAdvancedDigitizingFloater::changeDistance );
69
70 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockXChanged, this, &QgsAdvancedDigitizingFloater::changeLockX );
71 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockYChanged, this, &QgsAdvancedDigitizingFloater::changeLockY );
72 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockZChanged, this, &QgsAdvancedDigitizingFloater::changeLockZ );
73 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockMChanged, this, &QgsAdvancedDigitizingFloater::changeLockM );
74 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockAngleChanged, this, &QgsAdvancedDigitizingFloater::changeLockAngle );
75 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::lockDistanceChanged, this, &QgsAdvancedDigitizingFloater::changeLockDistance );
76
77 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeXChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeX );
78 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeYChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeY );
79 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeZChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeZ );
80 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeMChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeM );
81 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::relativeAngleChanged, this, &QgsAdvancedDigitizingFloater::changeRelativeAngle );
82 // distance is always relative
83
84 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnXRequested, this, &QgsAdvancedDigitizingFloater::focusOnX );
85 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnYRequested, this, &QgsAdvancedDigitizingFloater::focusOnY );
86 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnZRequested, this, &QgsAdvancedDigitizingFloater::focusOnZ );
87 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnMRequested, this, &QgsAdvancedDigitizingFloater::focusOnM );
88 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnAngleRequested, this, &QgsAdvancedDigitizingFloater::focusOnAngle );
89 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::focusOnDistanceRequested, this, &QgsAdvancedDigitizingFloater::focusOnDistance );
90
91 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedX, this, &QgsAdvancedDigitizingFloater::enabledChangedX );
92 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedY, this, &QgsAdvancedDigitizingFloater::enabledChangedY );
93 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedZ, this, &QgsAdvancedDigitizingFloater::enabledChangedZ );
94 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedM, this, &QgsAdvancedDigitizingFloater::enabledChangedM );
95 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledChangedAngle );
96 // Bearing capability is the same an angle, connect to the same signal:
97 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledChangedBearing );
98 // Common angle snapping capbility is also linked to angle, connect to the same signal:
99 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping );
100 connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedDistance, this, &QgsAdvancedDigitizingFloater::enabledChangedDistance );
101
102 // Connect our line edits signals to update cadDockWidget's state (implementation copied from QgsAdvancedDigitizingDockWidget)
103 connect( mXLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
104 connect( mYLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
105 connect( mZLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
106 connect( mMLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
107 connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() {
108 cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed );
109 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
110 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
111 } );
112 connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [this, cadDockWidget]() {
113 cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed );
114 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
115 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
116 } );
117
118 connect( mXLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
119 connect( mYLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
120 connect( mZLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
121 connect( mMLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
122 connect( mAngleLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
123 connect( mDistanceLineEdit, &QLineEdit::textEdited, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
124
125 QgsFocusWatcher *xWatcher = new QgsFocusWatcher( mXLineEdit );
126 connect( xWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
127 QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit );
128 connect( yWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
129 QgsFocusWatcher *zWatcher = new QgsFocusWatcher( mZLineEdit );
130 connect( zWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
131 QgsFocusWatcher *mWatcher = new QgsFocusWatcher( mYLineEdit );
132 connect( mWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
133 QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit );
134 connect( angleWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() {
135 cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut );
136 whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
137 } );
138 connect( angleWatcher, &QgsFocusWatcher::focusIn, this, [this]() {
139 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
140 whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
141 } );
142 QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit );
143 connect( distanceWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [this, cadDockWidget]() {
144 cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut );
145 whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
146 } );
147 connect( distanceWatcher, &QgsFocusWatcher::focusIn, this, [this]() {
148 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
149 whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
150 } );
151 changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
152}
153
154bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )
155{
156 if ( mCadDockWidget && mCadDockWidget->cadEnabled() && mActive )
157 {
158 if ( event->type() == QEvent::MouseMove )
159 {
160 // We update the position when mouse moves
161 QMouseEvent *mouseEvent = qgis::down_cast<QMouseEvent *>( event );
162 updatePos( mouseEvent->pos() );
163 }
164 else if ( event->type() == QEvent::Enter )
165 {
166 // We show the widget when mouse enters
167 QEnterEvent *enterEvent = qgis::down_cast<QEnterEvent *>( event );
168 updatePos( enterEvent->pos() );
169 setVisible( true );
170 }
171 else if ( event->type() == QEvent::Leave )
172 {
173 // We hide the widget when mouse leaves
174 setVisible( false );
175 }
176 }
177 return QWidget::eventFilter( obj, event );
178}
179
181{
182 return mActive;
183}
184
186{
187 return mItemsVisibility.testFlag( item );
188}
189
191{
192 QgsSettings().setValue( QStringLiteral( "/Cad/Floater" ), active );
193
194 mActive = active;
195
196 hideIfDisabled();
197}
198
200{
201 const QMetaEnum enumData { QMetaEnum::fromType<QgsAdvancedDigitizingFloater::FloaterItem>() };
202 QgsSettings().setValue( QStringLiteral( "/Cad/%1ShowInFloater" ).arg( enumData.valueToKey( static_cast<int>( item ) ) ), visible );
203 mItemsVisibility.setFlag( item, visible );
204 switch ( item )
205 {
207 enabledChangedX( visible );
208 break;
210 enabledChangedY( visible );
211 break;
213 enabledChangedM( visible );
214 break;
216 enabledChangedZ( visible );
217 break;
219 enabledChangedAngle( visible );
220 break;
222 enabledChangedDistance( visible );
223 break;
225 enabledCommonAngleSnapping( visible );
226 break;
228 enabledChangedBearing( visible );
229 break;
230 }
231}
232
233void QgsAdvancedDigitizingFloater::updatePos( const QPoint &pos )
234{
235 // We hardcode a small delta between the mouse position and the widget's position
236 move( pos + QPoint( 15, 5 ) );
237}
238
239void QgsAdvancedDigitizingFloater::hideIfDisabled()
240{
241 if ( !mCadDockWidget || !mCadDockWidget->cadEnabled() || !mActive )
242 {
243 setVisible( false );
244 }
245}
246
247void QgsAdvancedDigitizingFloater::changeX( const QString &text )
248{
249 mXLineEdit->setText( text );
250}
251
252void QgsAdvancedDigitizingFloater::changeY( const QString &text )
253{
254 mYLineEdit->setText( text );
255}
256
257void QgsAdvancedDigitizingFloater::changeZ( const QString &text )
258{
259 mZLineEdit->setText( text );
260}
261
262void QgsAdvancedDigitizingFloater::changeM( const QString &text )
263{
264 mMLineEdit->setText( text );
265}
266
267void QgsAdvancedDigitizingFloater::changeCommonAngleSnapping( double angle )
268{
269 mCommonAngleSnappingLineEdit->setText( qgsDoubleNear( angle, 0.0 ) ? tr( "disabled" ) : QLocale().toString( angle ).append( tr( " °" ) ) );
270}
271
272void QgsAdvancedDigitizingFloater::changeDistance( const QString &text )
273{
274 mDistanceLineEdit->setText( text );
275}
276
277void QgsAdvancedDigitizingFloater::changeAngle( const QString &text )
278{
279 mAngleLineEdit->setText( text );
280}
281
282void QgsAdvancedDigitizingFloater::changeBearing( const QString &text )
283{
284 mBearingLineEdit->setText( text );
285}
286
287void QgsAdvancedDigitizingFloater::changeLockX( bool locked )
288{
289 if ( !locked )
290 {
291 mXLineEdit->setStyleSheet( QString() );
292 mXLabel->setStyleSheet( QString() );
293 }
294 else
295 {
296 mXLineEdit->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
297 mXLabel->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
298 }
299}
300
301void QgsAdvancedDigitizingFloater::changeLockY( bool locked )
302{
303 if ( !locked )
304 {
305 mYLineEdit->setStyleSheet( QString() );
306 mYLabel->setStyleSheet( QString() );
307 }
308 else
309 {
310 mYLineEdit->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
311 mYLabel->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
312 }
313}
314
315void QgsAdvancedDigitizingFloater::changeLockZ( bool locked )
316{
317 if ( !locked )
318 {
319 mZLineEdit->setStyleSheet( QString() );
320 mZLabel->setStyleSheet( QString() );
321 }
322 else
323 {
324 mZLineEdit->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
325 mZLabel->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
326 }
327}
328
329void QgsAdvancedDigitizingFloater::changeLockM( bool locked )
330{
331 if ( !locked )
332 {
333 mMLineEdit->setStyleSheet( QString() );
334 mMLabel->setStyleSheet( QString() );
335 }
336 else
337 {
338 mMLineEdit->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
339 mMLabel->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
340 }
341}
342
343void QgsAdvancedDigitizingFloater::changeLockDistance( bool locked )
344{
345 if ( !locked )
346 {
347 mDistanceLineEdit->setStyleSheet( QString() );
348 mDistanceLabel->setStyleSheet( QString() );
349 }
350 else
351 {
352 mDistanceLineEdit->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
353 mDistanceLabel->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
354 }
355}
356
357void QgsAdvancedDigitizingFloater::changeLockAngle( bool locked )
358{
359 if ( !locked )
360 {
361 mAngleLineEdit->setStyleSheet( QString() );
362 mAngleLabel->setStyleSheet( QString() );
363 }
364 else
365 {
366 mAngleLineEdit->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
367 mAngleLabel->setStyleSheet( QStringLiteral( "font-weight: bold" ) );
368 }
369}
370
371
372void QgsAdvancedDigitizingFloater::changeRelativeX( bool relative )
373{
374 if ( !relative )
375 {
376 mXLabel->setText( "x" );
377 }
378 else
379 {
380 mXLabel->setText( "Δx" );
381 }
382 adjustSize();
383}
384
385void QgsAdvancedDigitizingFloater::changeRelativeY( bool relative )
386{
387 if ( !relative )
388 {
389 mYLabel->setText( "y" );
390 }
391 else
392 {
393 mYLabel->setText( "Δy" );
394 }
395 adjustSize();
396}
397
398void QgsAdvancedDigitizingFloater::changeRelativeZ( bool relative )
399{
400 if ( !relative )
401 {
402 mZLabel->setText( "z" );
403 }
404 else
405 {
406 mZLabel->setText( "Δz" );
407 }
408 adjustSize();
409}
410
411void QgsAdvancedDigitizingFloater::changeRelativeM( bool relative )
412{
413 if ( !relative )
414 {
415 mMLabel->setText( "m" );
416 }
417 else
418 {
419 mMLabel->setText( "Δm" );
420 }
421 adjustSize();
422}
423
424// distance is always relative
425
426void QgsAdvancedDigitizingFloater::changeRelativeAngle( bool relative )
427{
428 if ( !relative )
429 {
430 mAngleLabel->setText( "a" );
431 }
432 else
433 {
434 mAngleLabel->setText( "Δa" );
435 }
436 adjustSize();
437}
438
439void QgsAdvancedDigitizingFloater::focusOnX()
440{
441 if ( mActive )
442 {
443 mXLineEdit->setFocus();
444 mXLineEdit->selectAll();
445 }
446}
447
448void QgsAdvancedDigitizingFloater::focusOnY()
449{
450 if ( mActive )
451 {
452 mYLineEdit->setFocus();
453 mYLineEdit->selectAll();
454 }
455}
456
457void QgsAdvancedDigitizingFloater::focusOnZ()
458{
459 if ( mActive )
460 {
461 mZLineEdit->setFocus();
462 mZLineEdit->selectAll();
463 }
464}
465
466void QgsAdvancedDigitizingFloater::focusOnM()
467{
468 if ( mActive )
469 {
470 mMLineEdit->setFocus();
471 mMLineEdit->selectAll();
472 }
473}
474
475void QgsAdvancedDigitizingFloater::focusOnDistance()
476{
477 if ( mActive )
478 {
479 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
480 mDistanceLineEdit->setText( cleanedInputValue );
481 mDistanceLineEdit->setFocus();
482 mDistanceLineEdit->selectAll();
483 }
484}
485
486void QgsAdvancedDigitizingFloater::focusOnAngle()
487{
488 if ( mActive )
489 {
490 const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
491 mAngleLineEdit->setText( cleanedInputValue );
492 mAngleLineEdit->setFocus();
493 mAngleLineEdit->selectAll();
494 }
495}
496
497
498void QgsAdvancedDigitizingFloater::enabledChangedX( bool enabled )
499{
500 mXLineEdit->setVisible( enabled && itemVisibility( FloaterItem::XCoordinate ) );
501 mXLabel->setVisible( enabled && itemVisibility( FloaterItem::XCoordinate ) );
502 adjustSize();
503}
504
505void QgsAdvancedDigitizingFloater::enabledChangedY( bool enabled )
506{
507 mYLineEdit->setVisible( enabled && itemVisibility( FloaterItem::YCoordinate ) );
508 mYLabel->setVisible( enabled && itemVisibility( FloaterItem::YCoordinate ) );
509 adjustSize();
510}
511
512void QgsAdvancedDigitizingFloater::enabledChangedZ( bool enabled )
513{
514 mZLineEdit->setVisible( enabled && itemVisibility( FloaterItem::ZCoordinate ) );
515 mZLabel->setVisible( enabled && itemVisibility( FloaterItem::ZCoordinate ) );
516 adjustSize();
517}
518
519void QgsAdvancedDigitizingFloater::enabledChangedM( bool enabled )
520{
521 mMLineEdit->setVisible( enabled && itemVisibility( FloaterItem::MCoordinate ) );
522 mMLabel->setVisible( enabled && itemVisibility( FloaterItem::MCoordinate ) );
523 adjustSize();
524}
525
526void QgsAdvancedDigitizingFloater::enabledChangedDistance( bool enabled )
527{
528 mDistanceLineEdit->setVisible( enabled && itemVisibility( FloaterItem::Distance ) );
529 mDistanceLabel->setVisible( enabled && itemVisibility( FloaterItem::Distance ) );
530 adjustSize();
531}
532
533void QgsAdvancedDigitizingFloater::enabledCommonAngleSnapping( bool enabled )
534{
535 mCommonAngleSnappingLineEdit->setVisible( enabled && itemVisibility( FloaterItem::CommonAngleSnapping ) );
536 mCommonAngleSnappingLabel->setVisible( enabled && itemVisibility( FloaterItem::CommonAngleSnapping ) );
537 adjustSize();
538}
539
540void QgsAdvancedDigitizingFloater::enabledChangedAngle( bool enabled )
541{
542 mAngleLineEdit->setVisible( enabled && itemVisibility( FloaterItem::Angle ) );
543 mAngleLabel->setVisible( enabled && itemVisibility( FloaterItem::Angle ) );
544 adjustSize();
545}
546
547void QgsAdvancedDigitizingFloater::enabledChangedBearing( bool enabled )
548{
549 mBearingLineEdit->setVisible( enabled && itemVisibility( FloaterItem::Bearing ) );
550 mBearingLabel->setVisible( enabled && itemVisibility( FloaterItem::Bearing ) );
551 adjustSize();
552}
@ Distance
Distance value.
Definition qgis.h:4077
@ Angle
Angle value.
Definition qgis.h:4076
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 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 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.
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:65
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:6607
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition qgis.h:6511