39#include "moc_qgsannotationitemwidget_impl.cpp"
43QgsAnnotationPolygonItemWidget::QgsAnnotationPolygonItemWidget( QWidget *parent )
49 mSelector->setDockMode( dockMode() );
51 if ( !mBlockChangedSignal )
59 QVBoxLayout *layout =
new QVBoxLayout();
60 layout->setContentsMargins( 0, 0, 0, 0 );
61 layout->addWidget( mSelector );
62 mSymbolSelectorFrame->setLayout( layout );
65 if ( !mBlockChangedSignal )
74 mPropertiesWidget->updateItem( newItem );
82 polygonItem->setSymbol( mSymbol->clone() );
83 mPropertiesWidget->updateItem( polygonItem );
87void QgsAnnotationPolygonItemWidget::setDockMode(
bool dockMode )
91 mSelector->setDockMode( dockMode );
98 mSelector->setContext( context );
99 mPropertiesWidget->setContext( context );
102QgsAnnotationPolygonItemWidget::~QgsAnnotationPolygonItemWidget() =
default;
110 mItem.reset( polygonItem->
clone() );
111 if ( mItem->symbol() )
113 mSymbol.reset( mItem->symbol()->clone() );
119 mBlockChangedSignal =
true;
120 mSelector->loadSymbol( mSymbol.get() );
121 mSelector->updatePreview();
122 mPropertiesWidget->setItem( mItem.get() );
123 mBlockChangedSignal =
false;
133QgsAnnotationLineItemWidget::QgsAnnotationLineItemWidget( QWidget *parent )
139 mSelector->setDockMode( dockMode() );
141 if ( !mBlockChangedSignal )
149 QVBoxLayout *layout =
new QVBoxLayout();
150 layout->setContentsMargins( 0, 0, 0, 0 );
151 layout->addWidget( mSelector );
152 mSymbolSelectorFrame->setLayout( layout );
155 if ( !mBlockChangedSignal )
164 mPropertiesWidget->updateItem( newItem );
172 lineItem->setSymbol( mSymbol->clone() );
173 mPropertiesWidget->updateItem( lineItem );
177void QgsAnnotationLineItemWidget::setDockMode(
bool dockMode )
181 mSelector->setDockMode( dockMode );
188 mSelector->setContext( context );
189 mPropertiesWidget->setContext( context );
192QgsAnnotationLineItemWidget::~QgsAnnotationLineItemWidget() =
default;
200 mItem.reset( lineItem->
clone() );
201 if ( mItem->symbol() )
203 mSymbol.reset( mItem->symbol()->clone() );
209 mBlockChangedSignal =
true;
210 mSelector->loadSymbol( mSymbol.get() );
211 mSelector->updatePreview();
212 mPropertiesWidget->setItem( mItem.get() );
213 mBlockChangedSignal =
false;
223QgsAnnotationMarkerItemWidget::QgsAnnotationMarkerItemWidget( QWidget *parent )
229 mSelector->setDockMode( dockMode() );
231 if ( !mBlockChangedSignal )
239 QVBoxLayout *layout =
new QVBoxLayout();
240 layout->setContentsMargins( 0, 0, 0, 0 );
241 layout->addWidget( mSelector );
242 mSymbolSelectorFrame->setLayout( layout );
245 if ( !mBlockChangedSignal )
254 mPropertiesWidget->updateItem( newItem );
262 markerItem->setSymbol( mSymbol->clone() );
263 mPropertiesWidget->updateItem( markerItem );
267void QgsAnnotationMarkerItemWidget::setDockMode(
bool dockMode )
271 mSelector->setDockMode( dockMode );
278 mSelector->setContext( context );
279 mPropertiesWidget->setContext( context );
282QgsAnnotationMarkerItemWidget::~QgsAnnotationMarkerItemWidget() =
default;
290 mItem.reset( markerItem->
clone() );
291 if ( mItem->symbol() )
293 mSymbol.reset( mItem->symbol()->clone() );
299 mBlockChangedSignal =
true;
300 mSelector->loadSymbol( mSymbol.get() );
301 mSelector->updatePreview();
302 mPropertiesWidget->setItem( mItem.get() );
303 mBlockChangedSignal =
false;
313QgsAnnotationPointTextItemWidget::QgsAnnotationPointTextItemWidget( QWidget *parent )
322 mSpinTextAngle->setClearValue( 0 );
327 mAlignmentComboBox->setAvailableAlignments( Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight );
334 if ( !mBlockChangedSignal )
338 if ( !mBlockChangedSignal )
341 connect( mInsertExpressionButton, &QPushButton::clicked,
this, &QgsAnnotationPointTextItemWidget::mInsertExpressionButton_clicked );
343 if ( !mBlockChangedSignal )
347 connect( mSpinTextAngle, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [
this] {
348 if ( !mBlockChangedSignal )
352 connect( mRotationModeCombo, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [
this] {
353 if ( !mBlockChangedSignal )
358 if ( !mBlockChangedSignal )
366 updateItem( newItem );
374 mBlockChangedSignal =
true;
375 pointTextItem->setFormat( mTextFormatButton->textFormat() );
376 pointTextItem->setText( mTextFormatButton->textFormat().allowHtmlFormatting() ? mTextEdit->toHtml() : mTextEdit->toPlainText() );
377 pointTextItem->setAngle( mSpinTextAngle->value() );
379 pointTextItem->setAlignment( mAlignmentComboBox->currentAlignment() );
380 mBlockChangedSignal =
false;
381 mPropertiesWidget->updateItem( pointTextItem );
388 if ( mTextFormatButton )
390 mTextFormatButton->setMapCanvas( context.
mapCanvas() );
391 mTextFormatButton->setMessageBar( context.
messageBar() );
393 mPropertiesWidget->setContext( context );
396void QgsAnnotationPointTextItemWidget::focusDefaultWidget()
398 mTextEdit->textEdit()->selectAll();
399 mTextEdit->setFocus();
402QgsAnnotationPointTextItemWidget::~QgsAnnotationPointTextItemWidget() =
default;
410 mItem.reset( textItem->
clone() );
412 mBlockChangedSignal =
true;
413 mTextFormatButton->setTextFormat( mItem->format() );
415 mTextEdit->
setText( mItem->text() );
416 mSpinTextAngle->setValue( mItem->angle() );
417 mRotationModeCombo->setCurrentIndex( mRotationModeCombo->findData( QVariant::fromValue( mItem->rotationMode() ) ) );
418 mAlignmentComboBox->setCurrentAlignment( mItem->alignment() & Qt::AlignHorizontal_Mask );
419 mPropertiesWidget->setItem( mItem.get() );
420 mBlockChangedSignal =
false;
425void QgsAnnotationPointTextItemWidget::mInsertExpressionButton_clicked()
430 if ( context().expressionContext() )
437 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
438 if ( exprDlg.exec() == QDialog::Accepted )
440 expression = exprDlg.expressionText().trimmed();
441 if ( !expression.isEmpty() )
443 mTextEdit->textEdit()->insertPlainText(
"[%" + expression +
"%]" );
453QgsAnnotationLineTextItemWidget::QgsAnnotationLineTextItemWidget( QWidget *parent )
467 if ( !mBlockChangedSignal )
471 if ( !mBlockChangedSignal )
474 connect( mInsertExpressionButton, &QPushButton::clicked,
this, &QgsAnnotationLineTextItemWidget::mInsertExpressionButton_clicked );
476 if ( !mBlockChangedSignal )
481 mSpinOffset->setClearValue( 0.0 );
482 connect( mSpinOffset,
static_cast<void ( QDoubleSpinBox::* )(
double )
>( &QDoubleSpinBox::valueChanged ),
this, [
this] {
483 if ( !mBlockChangedSignal )
488 if ( !mBlockChangedSignal )
493QgsAnnotationLineTextItemWidget::~QgsAnnotationLineTextItemWidget() =
default;
498 updateItem( newItem );
506 mBlockChangedSignal =
true;
507 lineTextItem->setFormat( mTextFormatButton->textFormat() );
508 lineTextItem->setText( mTextFormatButton->textFormat().allowHtmlFormatting() ? mTextEdit->toHtml() : mTextEdit->toPlainText() );
510 lineTextItem->setOffsetFromLine( mSpinOffset->value() );
511 lineTextItem->setOffsetFromLineUnit( mOffsetUnitWidget->unit() );
512 lineTextItem->setOffsetFromLineMapUnitScale( mOffsetUnitWidget->getMapUnitScale() );
514 mBlockChangedSignal =
false;
515 mPropertiesWidget->updateItem( lineTextItem );
522 if ( mTextFormatButton )
524 mTextFormatButton->setMapCanvas( context.
mapCanvas() );
525 mTextFormatButton->setMessageBar( context.
messageBar() );
527 mPropertiesWidget->setContext( context );
530void QgsAnnotationLineTextItemWidget::focusDefaultWidget()
532 mTextEdit->textEdit()->selectAll();
533 mTextEdit->setFocus();
542 mItem.reset( textItem->
clone() );
544 mBlockChangedSignal =
true;
545 mTextFormatButton->setTextFormat( mItem->format() );
547 mTextEdit->
setText( mItem->text() );
548 mPropertiesWidget->setItem( mItem.get() );
550 mSpinOffset->setValue( mItem->offsetFromLine() );
551 mOffsetUnitWidget->setUnit( mItem->offsetFromLineUnit() );
552 mOffsetUnitWidget->setMapUnitScale( mItem->offsetFromLineMapUnitScale() );
554 mBlockChangedSignal =
false;
559void QgsAnnotationLineTextItemWidget::mInsertExpressionButton_clicked()
564 if ( context().expressionContext() )
571 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
572 if ( exprDlg.exec() == QDialog::Accepted )
574 expression = exprDlg.expressionText().trimmed();
575 if ( !expression.isEmpty() )
577 mTextEdit->textEdit()->insertPlainText(
"[%" + expression +
"%]" );
587QgsAnnotationRectangleTextItemWidget::QgsAnnotationRectangleTextItemWidget( QWidget *parent )
599 mBackgroundSymbolButton->setDialogTitle( tr(
"Background" ) );
600 mBackgroundSymbolButton->registerExpressionContextGenerator(
this );
602 mFrameSymbolButton->setDialogTitle( tr(
"Frame" ) );
603 mFrameSymbolButton->registerExpressionContextGenerator(
this );
605 mSpinBottomMargin->setClearValue( 0 );
606 mSpinTopMargin->setClearValue( 0 );
607 mSpinRightMargin->setClearValue( 0 );
608 mSpinLeftMargin->setClearValue( 0 );
615 mAlignmentComboBox->setAvailableAlignments( Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight | Qt::AlignJustify );
616 mVerticalAlignmentComboBox->setAvailableAlignments( Qt::AlignTop | Qt::AlignVCenter | Qt::AlignBottom );
626 connect( mInsertExpressionButton, &QPushButton::clicked,
this, &QgsAnnotationRectangleTextItemWidget::mInsertExpressionButton_clicked );
630 connect( mFrameCheckbox, &QGroupBox::toggled,
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
631 connect( mBackgroundCheckbox, &QGroupBox::toggled,
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
632 connect( mBackgroundSymbolButton, &
QgsSymbolButton::changed,
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
633 connect( mFrameSymbolButton, &
QgsSymbolButton::changed,
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
634 connect( mSpinTopMargin, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
635 connect( mSpinRightMargin, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
636 connect( mSpinLeftMargin, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
637 connect( mSpinBottomMargin, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsAnnotationRectangleTextItemWidget::onWidgetChanged );
642 connect( mWidthSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsAnnotationRectangleTextItemWidget::setWidth );
643 connect( mHeightSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsAnnotationRectangleTextItemWidget::setHeight );
645 connect( mSizeModeCombo, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsAnnotationRectangleTextItemWidget::sizeModeChanged );
646 mWidgetFixedSize->hide();
653 updateItem( newItem );
661 mBlockChangedSignal =
true;
662 rectTextItem->setFormat( mTextFormatButton->textFormat() );
663 rectTextItem->setText( mTextFormatButton->textFormat().allowHtmlFormatting() ? mTextEdit->toHtml() : mTextEdit->toPlainText() );
664 rectTextItem->setAlignment( mAlignmentComboBox->currentAlignment() | mVerticalAlignmentComboBox->currentAlignment() );
668 rectTextItem->setFixedSize( QSizeF( mWidthSpinBox->value(), mHeightSpinBox->value() ) );
669 rectTextItem->setFixedSizeUnit( mSizeUnitWidget->unit() );
671 rectTextItem->setBackgroundEnabled( mBackgroundCheckbox->isChecked() );
672 rectTextItem->setFrameEnabled( mFrameCheckbox->isChecked() );
673 rectTextItem->setBackgroundSymbol( mBackgroundSymbolButton->clonedSymbol<
QgsFillSymbol>() );
674 rectTextItem->setFrameSymbol( mFrameSymbolButton->clonedSymbol<
QgsFillSymbol>() );
676 rectTextItem->setMargins(
QgsMargins( mSpinLeftMargin->value(), mSpinTopMargin->value(), mSpinRightMargin->value(), mSpinBottomMargin->value() ) );
677 rectTextItem->setMarginsUnit( mMarginUnitWidget->unit() );
679 if ( mUpdateItemPosition )
681 rectTextItem->setBounds( mItem->bounds() );
682 mUpdateItemPosition =
false;
685 mBlockChangedSignal =
false;
687 mPropertiesWidget->updateItem( rectTextItem );
694 if ( mTextFormatButton )
696 mTextFormatButton->setMapCanvas( context.
mapCanvas() );
697 mTextFormatButton->setMessageBar( context.
messageBar() );
699 mBackgroundSymbolButton->setMapCanvas( context.
mapCanvas() );
700 mBackgroundSymbolButton->setMessageBar( context.
messageBar() );
701 mFrameSymbolButton->setMapCanvas( context.
mapCanvas() );
702 mFrameSymbolButton->setMessageBar( context.
messageBar() );
703 mPropertiesWidget->setContext( context );
709 if ( context().expressionContext() )
713 return expressionContext;
716void QgsAnnotationRectangleTextItemWidget::focusDefaultWidget()
718 mTextEdit->textEdit()->selectAll();
719 mTextEdit->setFocus();
722QgsAnnotationRectangleTextItemWidget::~QgsAnnotationRectangleTextItemWidget() =
default;
730 mItem.reset( textItem->
clone() );
732 mBlockChangedSignal =
true;
733 mTextFormatButton->setTextFormat( mItem->format() );
735 mTextEdit->
setText( mItem->text() );
736 mAlignmentComboBox->setCurrentAlignment( mItem->alignment() & Qt::AlignHorizontal_Mask );
737 mVerticalAlignmentComboBox->setCurrentAlignment( mItem->alignment() & Qt::AlignVertical_Mask );
738 mPropertiesWidget->setItem( mItem.get() );
742 mBackgroundSymbolButton->setSymbol( symbol->clone() );
746 mFrameSymbolButton->setSymbol( symbol->clone() );
748 mMarginUnitWidget->setUnit( textItem->
marginsUnit() );
749 mSpinLeftMargin->setValue( textItem->
margins().
left() );
750 mSpinTopMargin->setValue( textItem->
margins().
top() );
751 mSpinRightMargin->setValue( textItem->
margins().
right() );
754 mWidthSpinBox->setValue( textItem->
fixedSize().width() );
755 mHeightSpinBox->setValue( textItem->
fixedSize().height() );
757 mSizeModeCombo->setCurrentIndex( mSizeModeCombo->findData( QVariant::fromValue( textItem->
placementMode() ) ) );
759 mBlockChangedSignal =
false;
764void QgsAnnotationRectangleTextItemWidget::onWidgetChanged()
766 if ( !mBlockChangedSignal )
770void QgsAnnotationRectangleTextItemWidget::sizeModeChanged()
776 mWidgetFixedSize->hide();
782 const QgsRectangle itemBoundsMapUnits = details->boundingBox();
785 const QgsPointXY topLeftPixels = canvas->mapSettings().mapToPixel().transform( itemBoundsMapUnits.
xMinimum(), itemBoundsMapUnits.
yMinimum() );
786 const QgsPointXY bottomRightPixels = canvas->mapSettings().mapToPixel().transform( itemBoundsMapUnits.
xMaximum(), itemBoundsMapUnits.
yMaximum() );
787 const double widthPixels = std::abs( bottomRightPixels.
x() - topLeftPixels.
x() );
788 const double heightPixels = std::abs( bottomRightPixels.
y() - topLeftPixels.
y() );
791 const double pixelsPerMm = canvas->mapSettings().outputDpi() / 25.4;
793 mItem->setFixedSize( QSizeF( widthPixels / pixelsPerMm, heightPixels / pixelsPerMm ) );
796 whileBlocking( mWidthSpinBox )->setValue( mItem->fixedSize().width() );
797 whileBlocking( mHeightSpinBox )->setValue( mItem->fixedSize().height() );
798 whileBlocking( mSizeUnitWidget )->setUnit( mItem->fixedSizeUnit() );
800 mUpdateItemPosition =
true;
804 mWidgetFixedSize->show();
815 const double centerX = ( itemBounds.
center().x() - canvas->extent().xMinimum() ) / canvas->extent().width();
816 const double centerY = ( canvas->extent().yMaximum() - itemBounds.
center().
y() ) / canvas->extent().height();
818 mUpdateItemPosition =
true;
822 mWidgetFixedSize->hide();
830void QgsAnnotationRectangleTextItemWidget::setWidth()
835void QgsAnnotationRectangleTextItemWidget::setHeight()
840void QgsAnnotationRectangleTextItemWidget::mInsertExpressionButton_clicked()
846 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
847 if ( exprDlg.exec() == QDialog::Accepted )
849 expression = exprDlg.expressionText().trimmed();
850 if ( !expression.isEmpty() )
852 mTextEdit->textEdit()->insertPlainText(
"[%" + expression +
"%]" );
862QgsAnnotationPictureItemWidget::QgsAnnotationPictureItemWidget( QWidget *parent )
876 mBackgroundSymbolButton->setDialogTitle( tr(
"Background" ) );
877 mBackgroundSymbolButton->registerExpressionContextGenerator(
this );
879 mFrameSymbolButton->setDialogTitle( tr(
"Frame" ) );
880 mFrameSymbolButton->registerExpressionContextGenerator(
this );
883 if ( !mBlockChangedSignal )
887 connect( mSizeModeCombo, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsAnnotationPictureItemWidget::sizeModeChanged );
889 connect( mRadioSVG, &QRadioButton::toggled,
this, &QgsAnnotationPictureItemWidget::modeChanged );
890 connect( mRadioRaster, &QRadioButton::toggled,
this, &QgsAnnotationPictureItemWidget::modeChanged );
892 if ( !mRadioSVG->isChecked() && QFileInfo( source ).suffix().compare( QLatin1String(
"svg" ), Qt::CaseInsensitive ) == 0 )
894 mRadioSVG->setChecked(
true );
900 connect( mLockAspectRatioCheck, &QCheckBox::toggled,
this, &QgsAnnotationPictureItemWidget::onWidgetChanged );
901 connect( mFrameCheckbox, &QGroupBox::toggled,
this, &QgsAnnotationPictureItemWidget::onWidgetChanged );
902 connect( mBackgroundCheckbox, &QGroupBox::toggled,
this, &QgsAnnotationPictureItemWidget::onWidgetChanged );
903 connect( mBackgroundSymbolButton, &
QgsSymbolButton::changed,
this, &QgsAnnotationPictureItemWidget::onWidgetChanged );
907 connect( mWidthSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsAnnotationPictureItemWidget::setWidth );
908 connect( mHeightSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsAnnotationPictureItemWidget::setHeight );
912QgsAnnotationPictureItemWidget::~QgsAnnotationPictureItemWidget() =
default;
917 updateItem( newItem );
925 const bool svg = mRadioSVG->isChecked();
927 const QString path = mSourceLineEdit->source();
928 pictureItem->setPath( newFormat, path );
931 switch ( pictureItem->placementMode() )
934 pictureItem->setLockAspectRatio( mLockAspectRatioCheck->isChecked() );
938 pictureItem->setLockAspectRatio( mLockAspectRatio->isChecked() );
942 pictureItem->setFixedSize( QSizeF( mWidthSpinBox->value(), mHeightSpinBox->value() ) );
943 pictureItem->setFixedSizeUnit( mSizeUnitWidget->unit() );
945 pictureItem->setBackgroundEnabled( mBackgroundCheckbox->isChecked() );
946 pictureItem->setFrameEnabled( mFrameCheckbox->isChecked() );
947 pictureItem->setBackgroundSymbol( mBackgroundSymbolButton->clonedSymbol<
QgsFillSymbol>() );
948 pictureItem->setFrameSymbol( mFrameSymbolButton->clonedSymbol<
QgsFillSymbol>() );
950 if ( mUpdateItemPosition )
952 pictureItem->setBounds( mItem->bounds() );
953 mUpdateItemPosition =
false;
956 mPropertiesWidget->updateItem( pictureItem );
960void QgsAnnotationPictureItemWidget::setDockMode(
bool dockMode )
968 mPropertiesWidget->setContext( context );
969 mBackgroundSymbolButton->setMapCanvas( context.
mapCanvas() );
970 mBackgroundSymbolButton->setMessageBar( context.
messageBar() );
971 mFrameSymbolButton->setMapCanvas( context.
mapCanvas() );
972 mFrameSymbolButton->setMessageBar( context.
messageBar() );
978 if ( context().expressionContext() )
982 return expressionContext;
985void QgsAnnotationPictureItemWidget::focusDefaultWidget()
987 mSourceLineEdit->setFocus();
996 mItem.reset( pictureItem->
clone() );
998 mBlockChangedSignal =
true;
999 mPropertiesWidget->setItem( mItem.get() );
1001 mLockAspectRatioCheck->setChecked( mItem->lockAspectRatio() );
1002 mLockAspectRatio->setLocked( mItem->lockAspectRatio() );
1003 switch ( pictureItem->
format() )
1006 mRadioSVG->setChecked(
true );
1009 mRadioRaster->setChecked(
true );
1015 mSourceLineEdit->setSource( pictureItem->
path() );
1019 mBackgroundSymbolButton->setSymbol( symbol->clone() );
1021 mFrameCheckbox->setChecked( pictureItem->
frameEnabled() );
1023 mFrameSymbolButton->setSymbol( symbol->clone() );
1025 mWidthSpinBox->setValue( pictureItem->
fixedSize().width() );
1026 mHeightSpinBox->setValue( pictureItem->
fixedSize().height() );
1027 mSizeModeCombo->setCurrentIndex( mSizeModeCombo->findData( QVariant::fromValue( pictureItem->
placementMode() ) ) );
1030 mBlockChangedSignal =
false;
1035void QgsAnnotationPictureItemWidget::onWidgetChanged()
1037 if ( !mBlockChangedSignal )
1041void QgsAnnotationPictureItemWidget::modeChanged(
bool checked )
1046 const bool svg = mRadioSVG->isChecked();
1056void QgsAnnotationPictureItemWidget::sizeModeChanged()
1062 mSizeStackedWidget->setCurrentWidget( mPageSpatialBounds );
1066 mSizeStackedWidget->setCurrentWidget( mPageFixedSize );
1074 const QgsRectangle itemBounds = details->boundingBox();
1077 const double centerX = ( itemBounds.
center().x() - canvas->extent().xMinimum() ) / canvas->extent().width();
1078 const double centerY = ( canvas->extent().yMaximum() - itemBounds.
center().
y() ) / canvas->extent().height();
1080 mUpdateItemPosition =
true;
1084 mSizeStackedWidget->setCurrentWidget( mPageFixedSize );
1092void QgsAnnotationPictureItemWidget::setWidth()
1094 if ( mLockAspectRatio->locked() )
1096 const double ratio = pictureAspectRatio();
1098 whileBlocking( mHeightSpinBox )->setValue( mWidthSpinBox->value() * ratio );
1104void QgsAnnotationPictureItemWidget::setHeight()
1106 if ( mLockAspectRatio->locked() )
1108 const double ratio = pictureAspectRatio();
1110 whileBlocking( mWidthSpinBox )->setValue( mHeightSpinBox->value() / ratio );
1116void QgsAnnotationPictureItemWidget::setLockAspectRatio(
bool locked )
1118 if ( locked && !mBlockChangedSignal )
1120 const double ratio = pictureAspectRatio();
1122 whileBlocking( mHeightSpinBox )->setValue( mWidthSpinBox->value() * ratio );
1128double QgsAnnotationPictureItemWidget::pictureAspectRatio()
const
1130 const bool svg = mRadioSVG->isChecked();
1131 const QString path = mSourceLineEdit->source();
1141 if ( size.isValid() && size.width() > 0 )
1142 return size.height() / size.width();
SymbolRotationMode
Modes for handling how symbol and text entity rotation is handled when maps are rotated.
@ RespectMapRotation
Entity is rotated along with the map.
@ IgnoreMapRotation
Entity ignores map rotation.
PictureFormat
Picture formats.
@ Unknown
Invalid or unknown image type.
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size).
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes).
@ MetersInMapUnits
Meters value as Map units.
AnnotationPlacementMode
Annotation item placement modes.
@ SpatialBounds
Item is rendered inside fixed spatial bounds, and size will depend on map scale.
@ FixedSize
Item is rendered at a fixed size, regardless of map scale. Item's location is georeferenced to a spat...
@ RelativeToMapFrame
Items size and placement is relative to the map's frame, and the item will always be rendered in the ...
void sourceChanged(const QString &source)
Emitted whenever the file source is changed in the widget.
void changed()
Emitted when the alignment is changed.
Abstract base class for annotation items which are drawn with QgsAnnotationLayers.
An annotation item which renders a line symbol along a line geometry.
void setSymbol(QgsLineSymbol *symbol)
Sets the symbol used to render the marker item.
QgsAnnotationLineItem * clone() const override
Returns a clone of the item.
An annotation item which renders text along a line geometry.
QgsAnnotationLineTextItem * clone() const override
Returns a clone of the item.
void setText(const QString &text)
Sets the text rendered by the item.
An annotation item which renders a marker symbol at a point location.
void setSymbol(QgsMarkerSymbol *symbol)
Sets the symbol used to render the marker item.
QgsAnnotationMarkerItem * clone() const override
Returns a clone of the item.
An annotation item which renders a picture.
Qgis::PictureFormat format() const
Returns the picture format.
QString path() const
Returns the path of the image used to render the item.
QgsAnnotationPictureItem * clone() const override
Returns a clone of the item.
An annotation item which renders a text string at a point location.
void setText(const QString &text)
Sets the text rendered by the item.
QgsAnnotationPointTextItem * clone() const override
Returns a clone of the item.
An annotation item which renders a fill symbol for a polygon geometry.
void setSymbol(QgsFillSymbol *symbol)
Sets the symbol used to render the polygon item.
QgsAnnotationPolygonItem * clone() const override
Returns a clone of the item.
Qgis::RenderUnit fixedSizeUnit() const
Returns the units to use for fixed item sizes, when the placementMode() is Qgis::AnnotationPlacementM...
QSizeF fixedSize() const
Returns the fixed size to use for the item, when the placementMode() is Qgis::AnnotationPlacementMode...
bool frameEnabled() const
Returns true if the item's frame should be rendered.
const QgsFillSymbol * frameSymbol() const
Returns the symbol used to render the item's frame.
Qgis::AnnotationPlacementMode placementMode() const
Returns the placement mode for the item.
bool backgroundEnabled() const
Returns true if the item's background should be rendered.
const QgsFillSymbol * backgroundSymbol() const
Returns the symbol used to render the item's background.
An annotation item which renders paragraphs of text within a rectangle.
QgsAnnotationRectangleTextItem * clone() const override
Returns a clone of the item.
const QgsMargins & margins() const
Returns the margins between the outside of the item's frame and the interior text.
void setText(const QString &text)
Sets the text rendered by the item.
Qgis::RenderUnit marginsUnit() const
Returns the units for the margins between the item's frame and the interior text.
static QgsRecentStyleHandler * recentStyleHandler()
Returns the handler for recently used style items.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
A generic dialog for building expression strings.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static QString findAndSelectActiveExpression(QgsCodeEditor *editor, const QString &pattern=QString())
Find the expression under the cursor in the given editor and select it.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
QSize originalSize(const QString &path, bool blocking=false) const
Returns the original size (in pixels) of the image at the specified path.
static std::unique_ptr< QgsLineSymbol > createSimple(const QVariantMap &properties)
Create a line symbol with one symbol layer: SimpleLine with specified properties.
Map canvas is a class for displaying all GIS data types on a canvas.
Defines the four margins of a rectangle.
double top() const
Returns the top margin.
double right() const
Returns the right margin.
double bottom() const
Returns the bottom margin.
double left() const
Returns the left margin.
static std::unique_ptr< QgsMarkerSymbol > createSimple(const QVariantMap &properties)
Create a marker symbol with one symbol layer: SimpleMarker with specified properties.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void pushRecentSymbol(const QString &identifier, QgsSymbol *symbol)
Pushes a recently used symbol with the specified identifier.
A rectangle specified with double values.
static QgsRectangle fromCenterAndSize(const QgsPointXY ¢er, double width, double height)
Creates a new rectangle, given the specified center point and width and height.
Contains information about a rendered annotation item.
@ PlainText
Plain text mode.
@ QgsTextRenderer
QGIS text renderer mode, exposes the HTML/CSS subset supported by the QgsTextRenderer class.
void textChanged()
Emitted when the text contents are changed.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
QSizeF svgViewboxSize(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Calculates the viewbox size of a (possibly cached) SVG file.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
QgsExpressionContext * expressionContext() const
Returns the expression context used for the widget, if set.
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
QgsMessageBar * messageBar() const
Returns the message bar associated with the widget.
Abstract base class for all rendered symbols.
QList< Qgis::RenderUnit > RenderUnitList
List of render units.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.