QgsComposerPictureWidget::QgsComposerPictureWidget( QgsComposerPicture *picture ): QgsComposerItemBaseWidget( nullptr, picture ), mPicture( picture ), mPreviewsLoaded( false ) { setupUi( this ); setPanelTitle( tr( "Picture properties" ) ); mFillColorButton->setAllowOpacity( true ); mFillColorButton->setColorDialogTitle( tr( "Select fill color" ) ); mFillColorButton->setContext( QStringLiteral( "composer" ) ); mStrokeColorButton->setAllowOpacity( true ); mStrokeColorButton->setColorDialogTitle( tr( "Select stroke color" ) ); mStrokeColorButton->setContext( QStringLiteral( "composer" ) ); mNorthTypeComboBox->blockSignals( true ); mNorthTypeComboBox->addItem( tr( "Grid north" ), QgsComposerPicture::GridNorth ); mNorthTypeComboBox->addItem( tr( "True north" ), QgsComposerPicture::TrueNorth ); mNorthTypeComboBox->blockSignals( false ); mPictureRotationOffsetSpinBox->setClearValue( 0.0 ); mPictureRotationSpinBox->setClearValue( 0.0 ); //add widget for general composer item properties QgsComposerItemWidget *itemPropertiesWidget = new QgsComposerItemWidget( this, picture ); mainLayout->addWidget( itemPropertiesWidget ); if ( mPicture->composition() ) { mComposerMapComboBox->setComposition( mPicture->composition() ); mComposerMapComboBox->setItemType( QgsComposerItem::ComposerMap ); connect( mComposerMapComboBox, &QgsComposerItemComboBox::itemChanged, this, &QgsComposerPictureWidget::composerMapChanged ); } setGuiElementValues(); mPreviewsLoadingLabel->hide(); mPreviewListWidget->setIconSize( QSize( 30, 30 ) ); // mSearchDirectoriesGroupBox is a QgsCollapsibleGroupBoxBasic, so its collapsed state should not be saved/restored mSearchDirectoriesGroupBox->setCollapsed( true ); // setup connection for loading previews on first expansion of group box connect( mSearchDirectoriesGroupBox, &QgsCollapsibleGroupBoxBasic::collapsedStateChanged, this, &QgsComposerPictureWidget::loadPicturePreviews ); connect( mPicture, &QgsComposerObject::itemChanged, this, &QgsComposerPictureWidget::setGuiElementValues ); connect( mPicture, &QgsComposerPicture::pictureRotationChanged, this, &QgsComposerPictureWidget::setPicRotationSpinValue ); //connections for data defined buttons connect( mSourceDDBtn, &QgsPropertyOverrideButton::activated, mPictureLineEdit, &QLineEdit::setDisabled ); registerDataDefinedButton( mSourceDDBtn, QgsComposerObject::PictureSource ); registerDataDefinedButton( mFillColorDDBtn, QgsComposerObject::PictureSvgBackgroundColor ); registerDataDefinedButton( mStrokeColorDDBtn, QgsComposerObject::PictureSvgStrokeColor ); registerDataDefinedButton( mStrokeWidthDDBtn, QgsComposerObject::PictureSvgStrokeWidth ); }
void QgsComposerMapWidget::populateDataDefinedButtons() { registerDataDefinedButton( mScaleDDBtn, QgsComposerObject::MapScale, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mMapRotationDDBtn, QgsComposerObject::MapRotation, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mXMinDDBtn, QgsComposerObject::MapXMin, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mYMinDDBtn, QgsComposerObject::MapYMin, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mXMaxDDBtn, QgsComposerObject::MapXMax, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mYMaxDDBtn, QgsComposerObject::MapYMax, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mAtlasMarginDDBtn, QgsComposerObject::MapAtlasMargin, QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mStylePresetsDDBtn, QgsComposerObject::MapStylePreset, QgsDataDefinedButton::String, tr( "string matching a style preset name" ) ); registerDataDefinedButton( mLayersDDBtn, QgsComposerObject::MapLayers, QgsDataDefinedButton::String, tr( "list of map layer names separated by | characters" ) ); }
void QgsArrowSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer* layer ) { if ( !layer || layer->layerType() != QLatin1String( "ArrowLine" ) ) { return; } mLayer = static_cast<QgsArrowSymbolLayer*>( layer ); mArrowWidthSpin->setValue( mLayer->arrowWidth() ); mArrowWidthUnitWidget->setUnit( mLayer->arrowWidthUnit() ); mArrowWidthUnitWidget->setMapUnitScale( mLayer->arrowWidthUnitScale() ); mArrowStartWidthSpin->setValue( mLayer->arrowStartWidth() ); mArrowStartWidthUnitWidget->setUnit( mLayer->arrowStartWidthUnit() ); mArrowStartWidthUnitWidget->setMapUnitScale( mLayer->arrowStartWidthUnitScale() ); mHeadLengthSpin->setValue( mLayer->headLength() ); mHeadLengthUnitWidget->setUnit( mLayer->headLengthUnit() ); mHeadLengthUnitWidget->setMapUnitScale( mLayer->headLengthUnitScale() ); mHeadThicknessSpin->setValue( mLayer->headThickness() ); mHeadThicknessUnitWidget->setUnit( mLayer->headThicknessUnit() ); mHeadThicknessUnitWidget->setMapUnitScale( mLayer->headThicknessUnitScale() ); mHeadTypeCombo->setCurrentIndex( mLayer->headType() ); mArrowTypeCombo->setCurrentIndex( mLayer->arrowType() ); mOffsetSpin->setValue( mLayer->offset() ); mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); mCurvedArrowChck->setChecked( mLayer->isCurved() ); mRepeatArrowChck->setChecked( mLayer->isRepeated() ); registerDataDefinedButton( mArrowWidthDDBtn, QStringLiteral( "arrow_width" ), QgsDataDefinedButton::Double, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mArrowStartWidthDDBtn, QStringLiteral( "arrow_start_width" ), QgsDataDefinedButton::Double, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mHeadWidthDDBtn, QStringLiteral( "head_length" ), QgsDataDefinedButton::Double, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mHeadHeightDDBtn, QStringLiteral( "head_thickness" ), QgsDataDefinedButton::Double, QgsDataDefinedButton::doubleDesc() ); registerDataDefinedButton( mHeadTypeDDBtn, QStringLiteral( "head_type" ), QgsDataDefinedButton::Int, QgsDataDefinedButton::intDesc() ); registerDataDefinedButton( mArrowTypeDDBtn, QStringLiteral( "arrow_type" ), QgsDataDefinedButton::Int, QgsDataDefinedButton::intDesc() ); registerDataDefinedButton( mOffsetDDBtn, QStringLiteral( "offset" ), QgsDataDefinedButton::String, QgsDataDefinedButton::doubleDesc() ); }
QgsComposerScaleBarWidget::QgsComposerScaleBarWidget( QgsComposerScaleBar *scaleBar ): QgsComposerItemBaseWidget( nullptr, scaleBar ), mComposerScaleBar( scaleBar ) { setupUi( this ); connect( mHeightSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mHeightSpinBox_valueChanged ); connect( mLineWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mLineWidthSpinBox_valueChanged ); connect( mSegmentSizeSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mSegmentSizeSpinBox_valueChanged ); connect( mSegmentsLeftSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mSegmentsLeftSpinBox_valueChanged ); connect( mNumberOfSegmentsSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mNumberOfSegmentsSpinBox_valueChanged ); connect( mUnitLabelLineEdit, &QLineEdit::textChanged, this, &QgsComposerScaleBarWidget::mUnitLabelLineEdit_textChanged ); connect( mMapUnitsPerBarUnitSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mMapUnitsPerBarUnitSpinBox_valueChanged ); connect( mFontColorButton, &QgsColorButton::colorChanged, this, &QgsComposerScaleBarWidget::mFontColorButton_colorChanged ); connect( mFillColorButton, &QgsColorButton::colorChanged, this, &QgsComposerScaleBarWidget::mFillColorButton_colorChanged ); connect( mFillColor2Button, &QgsColorButton::colorChanged, this, &QgsComposerScaleBarWidget::mFillColor2Button_colorChanged ); connect( mStrokeColorButton, &QgsColorButton::colorChanged, this, &QgsComposerScaleBarWidget::mStrokeColorButton_colorChanged ); connect( mStyleComboBox, static_cast<void ( QComboBox::* )( const QString & )>( &QComboBox::currentIndexChanged ), this, &QgsComposerScaleBarWidget::mStyleComboBox_currentIndexChanged ); connect( mLabelBarSpaceSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mLabelBarSpaceSpinBox_valueChanged ); connect( mBoxSizeSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mBoxSizeSpinBox_valueChanged ); connect( mAlignmentComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsComposerScaleBarWidget::mAlignmentComboBox_currentIndexChanged ); connect( mUnitsComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsComposerScaleBarWidget::mUnitsComboBox_currentIndexChanged ); connect( mLineJoinStyleCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsComposerScaleBarWidget::mLineJoinStyleCombo_currentIndexChanged ); connect( mLineCapStyleCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsComposerScaleBarWidget::mLineCapStyleCombo_currentIndexChanged ); connect( mMinWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mMinWidthSpinBox_valueChanged ); connect( mMaxWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsComposerScaleBarWidget::mMaxWidthSpinBox_valueChanged ); setPanelTitle( tr( "Scalebar properties" ) ); mFontButton->setMode( QgsFontButton::ModeQFont ); connectUpdateSignal(); //add widget for general composer item properties QgsComposerItemWidget *itemPropertiesWidget = new QgsComposerItemWidget( this, scaleBar ); mainLayout->addWidget( itemPropertiesWidget ); mSegmentSizeRadioGroup.addButton( mFixedSizeRadio ); mSegmentSizeRadioGroup.addButton( mFitWidthRadio ); connect( &mSegmentSizeRadioGroup, static_cast < void ( QButtonGroup::* )( QAbstractButton * ) > ( &QButtonGroup::buttonClicked ), this, &QgsComposerScaleBarWidget::segmentSizeRadioChanged ); blockMemberSignals( true ); //style combo box mStyleComboBox->insertItem( 0, tr( "Single Box" ) ); mStyleComboBox->insertItem( 1, tr( "Double Box" ) ); mStyleComboBox->insertItem( 2, tr( "Line Ticks Middle" ) ); mStyleComboBox->insertItem( 3, tr( "Line Ticks Down" ) ); mStyleComboBox->insertItem( 4, tr( "Line Ticks Up" ) ); mStyleComboBox->insertItem( 5, tr( "Numeric" ) ); //alignment combo box mAlignmentComboBox->insertItem( 0, tr( "Left" ) ); mAlignmentComboBox->insertItem( 1, tr( "Middle" ) ); mAlignmentComboBox->insertItem( 2, tr( "Right" ) ); //units combo box mUnitsComboBox->insertItem( 0, tr( "Map units" ), QgsUnitTypes::DistanceUnknownUnit ); mUnitsComboBox->insertItem( 1, tr( "Meters" ), QgsUnitTypes::DistanceMeters ); mUnitsComboBox->insertItem( 2, tr( "Feet" ), QgsUnitTypes::DistanceFeet ); mUnitsComboBox->insertItem( 3, tr( "Nautical Miles" ), QgsUnitTypes::DistanceNauticalMiles ); mFillColorButton->setColorDialogTitle( tr( "Select Fill Color" ) ); mFillColorButton->setAllowOpacity( true ); mFillColorButton->setContext( QStringLiteral( "composer" ) ); mFillColorButton->setNoColorString( tr( "Transparent Fill" ) ); mFillColorButton->setShowNoColor( true ); mFillColor2Button->setColorDialogTitle( tr( "Select Alternate Fill Color" ) ); mFillColor2Button->setAllowOpacity( true ); mFillColor2Button->setContext( QStringLiteral( "composer" ) ); mFillColor2Button->setNoColorString( tr( "Transparent fill" ) ); mFillColor2Button->setShowNoColor( true ); mFontColorButton->setColorDialogTitle( tr( "Select Font Color" ) ); mFontColorButton->setAllowOpacity( true ); mFontColorButton->setContext( QStringLiteral( "composer" ) ); mStrokeColorButton->setColorDialogTitle( tr( "Select Line Color" ) ); mStrokeColorButton->setAllowOpacity( true ); mStrokeColorButton->setContext( QStringLiteral( "composer" ) ); mStrokeColorButton->setNoColorString( tr( "Transparent line" ) ); mStrokeColorButton->setShowNoColor( true ); QgsComposition *scaleBarComposition = mComposerScaleBar->composition(); if ( scaleBarComposition ) { mMapItemComboBox->setComposition( scaleBarComposition ); mMapItemComboBox->setItemType( QgsComposerItem::ComposerMap ); } connect( mMapItemComboBox, &QgsComposerItemComboBox::itemChanged, this, &QgsComposerScaleBarWidget::composerMapChanged ); registerDataDefinedButton( mFillColorDDBtn, QgsComposerObject::ScalebarFillColor ); registerDataDefinedButton( mFillColor2DDBtn, QgsComposerObject::ScalebarFillColor2 ); registerDataDefinedButton( mLineColorDDBtn, QgsComposerObject::ScalebarLineColor ); registerDataDefinedButton( mLineWidthDDBtn, QgsComposerObject::ScalebarLineWidth ); blockMemberSignals( false ); setGuiElements(); //set the GUI elements to the state of scaleBar connect( mFontButton, &QgsFontButton::changed, this, &QgsComposerScaleBarWidget::fontChanged ); }
QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap *composerMap ) : QgsComposerItemBaseWidget( nullptr, composerMap ) , mComposerMap( composerMap ) { setupUi( this ); setPanelTitle( tr( "Map properties" ) ); mMapRotationSpinBox->setClearValue( 0 ); //add widget for general composer item properties QgsComposerItemWidget *itemPropertiesWidget = new QgsComposerItemWidget( this, composerMap ); mainLayout->addWidget( itemPropertiesWidget ); mScaleLineEdit->setValidator( new QDoubleValidator( mScaleLineEdit ) ); mXMinLineEdit->setValidator( new QDoubleValidator( mXMinLineEdit ) ); mXMaxLineEdit->setValidator( new QDoubleValidator( mXMaxLineEdit ) ); mYMinLineEdit->setValidator( new QDoubleValidator( mYMinLineEdit ) ); mYMaxLineEdit->setValidator( new QDoubleValidator( mYMaxLineEdit ) ); blockAllSignals( true ); mCrsSelector->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true ); mCrsSelector->setNotSetText( tr( "Use project CRS" ) ); // follow preset combo mFollowVisibilityPresetCombo->setModel( new QStringListModel( mFollowVisibilityPresetCombo ) ); connect( mFollowVisibilityPresetCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsComposerMapWidget::followVisibilityPresetSelected ); connect( QgsProject::instance()->mapThemeCollection(), &QgsMapThemeCollection::mapThemesChanged, this, &QgsComposerMapWidget::onMapThemesChanged ); onMapThemesChanged(); // keep layers from preset button QMenu *menuKeepLayers = new QMenu( this ); mLayerListFromPresetButton->setMenu( menuKeepLayers ); mLayerListFromPresetButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowAllLayers.svg" ) ) ); mLayerListFromPresetButton->setToolTip( tr( "Set layer list from a map theme" ) ); connect( menuKeepLayers, &QMenu::aboutToShow, this, &QgsComposerMapWidget::aboutToShowKeepLayersVisibilityPresetsMenu ); if ( composerMap ) { mLabel->setText( tr( "Map %1" ).arg( composerMap->id() ) ); connect( composerMap, &QgsComposerObject::itemChanged, this, &QgsComposerMapWidget::setGuiElementValues ); QgsAtlasComposition *atlas = atlasComposition(); if ( atlas ) { connect( atlas, &QgsAtlasComposition::coverageLayerChanged, this, &QgsComposerMapWidget::atlasLayerChanged ); connect( atlas, &QgsAtlasComposition::toggled, this, &QgsComposerMapWidget::compositionAtlasToggled ); compositionAtlasToggled( atlas->enabled() ); } mOverviewFrameMapComboBox->setComposition( composerMap->composition() ); mOverviewFrameMapComboBox->setItemType( QgsComposerItem::ComposerMap ); mOverviewFrameMapComboBox->setExceptedItemList( QList< QgsComposerItem * >() << composerMap ); connect( mOverviewFrameMapComboBox, &QgsComposerItemComboBox::itemChanged, this, &QgsComposerMapWidget::overviewMapChanged ); } connect( mCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsComposerMapWidget::mapCrsChanged ); registerDataDefinedButton( mScaleDDBtn, QgsComposerObject::MapScale ); registerDataDefinedButton( mMapRotationDDBtn, QgsComposerObject::MapRotation ); registerDataDefinedButton( mXMinDDBtn, QgsComposerObject::MapXMin ); registerDataDefinedButton( mYMinDDBtn, QgsComposerObject::MapYMin ); registerDataDefinedButton( mXMaxDDBtn, QgsComposerObject::MapXMax ); registerDataDefinedButton( mYMaxDDBtn, QgsComposerObject::MapYMax ); registerDataDefinedButton( mAtlasMarginDDBtn, QgsComposerObject::MapAtlasMargin ); registerDataDefinedButton( mStylePresetsDDBtn, QgsComposerObject::MapStylePreset ); registerDataDefinedButton( mLayersDDBtn, QgsComposerObject::MapLayers ); updateGuiElements(); loadGridEntries(); loadOverviewEntries(); connect( mMapRotationSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsComposerMapWidget::rotationChanged ); blockAllSignals( false ); }
void QgsEllipseSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) { if ( layer->layerType() != "EllipseMarker" ) { return; } mLayer = static_cast<QgsEllipseSymbolLayerV2*>( layer ); mWidthSpinBox->setValue( mLayer->symbolWidth() ); mHeightSpinBox->setValue( mLayer->symbolHeight() ); mRotationSpinBox->setValue( mLayer->angle() ); mOutlineStyleComboBox->setPenStyle( mLayer->outlineStyle() ); mOutlineWidthSpinBox->setValue( mLayer->outlineWidth() ); btnChangeColorBorder->setColor( mLayer->outlineColor() ); btnChangeColorFill->setColor( mLayer->fillColor() ); QList<QListWidgetItem *> symbolItemList = mShapeListWidget->findItems( mLayer->symbolName(), Qt::MatchExactly ); if ( symbolItemList.size() > 0 ) { mShapeListWidget->setCurrentItem( symbolItemList.at( 0 ) ); } //set combo entries to current values blockComboSignals( true ); if ( mLayer ) { mSymbolWidthUnitWidget->setUnit( mLayer->symbolWidthUnit() ); mSymbolWidthUnitWidget->setMapUnitScale( mLayer->symbolWidthMapUnitScale() ); mOutlineWidthUnitWidget->setUnit( mLayer->outlineWidthUnit() ); mOutlineWidthUnitWidget->setMapUnitScale( mLayer->outlineWidthMapUnitScale() ); mSymbolHeightUnitWidget->setUnit( mLayer->symbolHeightUnit() ); mSymbolHeightUnitWidget->setMapUnitScale( mLayer->symbolHeightMapUnitScale() ); mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); } QPointF offsetPt = mLayer->offset(); spinOffsetX->setValue( offsetPt.x() ); spinOffsetY->setValue( offsetPt.y() ); mHorizontalAnchorComboBox->setCurrentIndex( mLayer->horizontalAnchorPoint() ); mVerticalAnchorComboBox->setCurrentIndex( mLayer->verticalAnchorPoint() ); blockComboSignals( false ); registerDataDefinedButton( mSymbolWidthDDBtn, "width", QgsDataDefinedButton::Double, QgsDataDefinedButton::doublePosDesc() ); registerDataDefinedButton( mSymbolHeightDDBtn, "height", QgsDataDefinedButton::Double, QgsDataDefinedButton::doublePosDesc() ); registerDataDefinedButton( mRotationDDBtn, "rotation", QgsDataDefinedButton::Double, QgsDataDefinedButton::double180RotDesc() ); registerDataDefinedButton( mOutlineWidthDDBtn, "outline_width", QgsDataDefinedButton::Double, QgsDataDefinedButton::doublePosDesc() ); registerDataDefinedButton( mFillColorDDBtn, "fill_color", QgsDataDefinedButton::String, QgsDataDefinedButton::colorAlphaDesc() ); registerDataDefinedButton( mBorderColorDDBtn, "outline_color", QgsDataDefinedButton::String, QgsDataDefinedButton::colorAlphaDesc() ); registerDataDefinedButton( mOutlineStyleDDBtn, "outline_style", QgsDataDefinedButton::String, QgsDataDefinedButton::lineStyleDesc() ); registerDataDefinedButton( mShapeDDBtn, "symbol_name", QgsDataDefinedButton::String, QgsDataDefinedButton::markerStyleDesc() ); registerDataDefinedButton( mOffsetDDBtn, "offset", QgsDataDefinedButton::String, QgsDataDefinedButton::doubleXYDesc() ); registerDataDefinedButton( mHorizontalAnchorDDBtn, "horizontal_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::horizontalAnchorDesc() ); registerDataDefinedButton( mVerticalAnchorDDBtn, "vertical_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::verticalAnchorDesc() ); }
QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer *layer, QWidget *parent, QgsMapCanvas *canvas ) : QWidget( parent ) , mMapCanvas( canvas ) { mLayer = layer; if ( !layer ) { return; } setupUi( this ); // get rid of annoying outer focus rect on Mac mDiagramOptionsListWidget->setAttribute( Qt::WA_MacShowFocusRect, false ); mDiagramTypeComboBox->blockSignals( true ); QPixmap pix = QgsApplication::getThemePixmap( QStringLiteral( "diagramNone" ) ); mDiagramTypeComboBox->addItem( pix, tr( "No diagrams" ), "None" ); pix = QgsApplication::getThemePixmap( QStringLiteral( "pie-chart" ) ); mDiagramTypeComboBox->addItem( pix, tr( "Pie chart" ), DIAGRAM_NAME_PIE ); pix = QgsApplication::getThemePixmap( QStringLiteral( "text" ) ); mDiagramTypeComboBox->addItem( pix, tr( "Text diagram" ), DIAGRAM_NAME_TEXT ); pix = QgsApplication::getThemePixmap( QStringLiteral( "histogram" ) ); mDiagramTypeComboBox->addItem( pix, tr( "Histogram" ), DIAGRAM_NAME_HISTOGRAM ); mDiagramTypeComboBox->blockSignals( false ); mScaleRangeWidget->setMapCanvas( mMapCanvas ); mSizeFieldExpressionWidget->registerExpressionContextGenerator( this ); mBackgroundColorButton->setColorDialogTitle( tr( "Select background color" ) ); mBackgroundColorButton->setAllowAlpha( true ); mBackgroundColorButton->setContext( QStringLiteral( "symbology" ) ); mBackgroundColorButton->setShowNoColor( true ); mBackgroundColorButton->setNoColorString( tr( "Transparent background" ) ); mDiagramPenColorButton->setColorDialogTitle( tr( "Select pen color" ) ); mDiagramPenColorButton->setAllowAlpha( true ); mDiagramPenColorButton->setContext( QStringLiteral( "symbology" ) ); mDiagramPenColorButton->setShowNoColor( true ); mDiagramPenColorButton->setNoColorString( tr( "Transparent stroke" ) ); mMaxValueSpinBox->setShowClearButton( false ); mDiagramAttributesTreeWidget->setItemDelegateForColumn( ColumnAttributeExpression, new EditBlockerDelegate( this ) ); mDiagramAttributesTreeWidget->setItemDelegateForColumn( ColumnColor, new EditBlockerDelegate( this ) ); connect( mFixedSizeRadio, &QRadioButton::toggled, this, &QgsDiagramProperties::scalingTypeChanged ); connect( mAttributeBasedScalingRadio, &QRadioButton::toggled, this, &QgsDiagramProperties::scalingTypeChanged ); mDiagramUnitComboBox->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); mDiagramLineUnitComboBox->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); QgsWkbTypes::GeometryType layerType = layer->geometryType(); if ( layerType == QgsWkbTypes::UnknownGeometry || layerType == QgsWkbTypes::NullGeometry ) { mDiagramTypeComboBox->setEnabled( false ); mDiagramFrame->setEnabled( false ); } //insert placement options mPlacementComboBox->blockSignals( true ); switch ( layerType ) { case QgsWkbTypes::PointGeometry: mPlacementComboBox->addItem( tr( "Around Point" ), QgsDiagramLayerSettings::AroundPoint ); mPlacementComboBox->addItem( tr( "Over Point" ), QgsDiagramLayerSettings::OverPoint ); mLinePlacementFrame->setVisible( false ); break; case QgsWkbTypes::LineGeometry: mPlacementComboBox->addItem( tr( "Around Line" ), QgsDiagramLayerSettings::Line ); mPlacementComboBox->addItem( tr( "Over Line" ), QgsDiagramLayerSettings::Horizontal ); mLinePlacementFrame->setVisible( true ); break; case QgsWkbTypes::PolygonGeometry: mPlacementComboBox->addItem( tr( "Around Centroid" ), QgsDiagramLayerSettings::AroundPoint ); mPlacementComboBox->addItem( tr( "Over Centroid" ), QgsDiagramLayerSettings::OverPoint ); mPlacementComboBox->addItem( tr( "Perimeter" ), QgsDiagramLayerSettings::Line ); mPlacementComboBox->addItem( tr( "Inside Polygon" ), QgsDiagramLayerSettings::Horizontal ); mLinePlacementFrame->setVisible( false ); break; default: break; } mPlacementComboBox->blockSignals( false ); mLabelPlacementComboBox->addItem( tr( "Height" ), QgsDiagramSettings::Height ); mLabelPlacementComboBox->addItem( tr( "x-height" ), QgsDiagramSettings::XHeight ); mScaleDependencyComboBox->addItem( tr( "Area" ), true ); mScaleDependencyComboBox->addItem( tr( "Diameter" ), false ); mAngleOffsetComboBox->addItem( tr( "Top" ), 90 * 16 ); mAngleOffsetComboBox->addItem( tr( "Right" ), 0 ); mAngleOffsetComboBox->addItem( tr( "Bottom" ), 270 * 16 ); mAngleOffsetComboBox->addItem( tr( "Left" ), 180 * 16 ); QgsSettings settings; // reset horiz stretch of left side of options splitter (set to 1 for previewing in Qt Designer) QSizePolicy policy( mDiagramOptionsListFrame->sizePolicy() ); policy.setHorizontalStretch( 0 ); mDiagramOptionsListFrame->setSizePolicy( policy ); if ( !settings.contains( QStringLiteral( "/Windows/Diagrams/OptionsSplitState" ) ) ) { // set left list widget width on initial showing QList<int> splitsizes; splitsizes << 115; mDiagramOptionsSplitter->setSizes( splitsizes ); } // restore dialog, splitters and current tab mDiagramOptionsSplitter->restoreState( settings.value( QStringLiteral( "Windows/Diagrams/OptionsSplitState" ) ).toByteArray() ); mDiagramOptionsListWidget->setCurrentRow( settings.value( QStringLiteral( "Windows/Diagrams/Tab" ), 0 ).toInt() ); // field combo and expression button mSizeFieldExpressionWidget->setLayer( mLayer ); QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs() ); myDa.setEllipsoidalMode( true ); myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mSizeFieldExpressionWidget->setGeomCalculator( myDa ); //insert all attributes into the combo boxes const QgsFields &layerFields = layer->fields(); for ( int idx = 0; idx < layerFields.count(); ++idx ) { QTreeWidgetItem *newItem = new QTreeWidgetItem( mAttributesTreeWidget ); QString name = QStringLiteral( "\"%1\"" ).arg( layerFields.at( idx ).name() ); newItem->setText( 0, name ); newItem->setData( 0, RoleAttributeExpression, name ); newItem->setFlags( newItem->flags() & ~Qt::ItemIsDropEnabled ); } const QgsDiagramRenderer *dr = layer->diagramRenderer(); if ( !dr ) //no diagram renderer yet, insert reasonable default { mDiagramTypeComboBox->blockSignals( true ); mDiagramTypeComboBox->setCurrentIndex( 0 ); mDiagramTypeComboBox->blockSignals( false ); mFixedSizeRadio->setChecked( true ); mDiagramUnitComboBox->setUnit( QgsUnitTypes::RenderMillimeters ); mDiagramLineUnitComboBox->setUnit( QgsUnitTypes::RenderMillimeters ); mLabelPlacementComboBox->setCurrentIndex( mLabelPlacementComboBox->findText( tr( "x-height" ) ) ); mDiagramSizeSpinBox->setEnabled( true ); mDiagramSizeSpinBox->setValue( 15 ); mLinearScaleFrame->setEnabled( false ); mIncreaseMinimumSizeSpinBox->setEnabled( false ); mIncreaseMinimumSizeLabel->setEnabled( false ); mBarWidthSpinBox->setValue( 5 ); mScaleVisibilityGroupBox->setChecked( layer->hasScaleBasedVisibility() ); mScaleRangeWidget->setScaleRange( 1.0 / layer->maximumScale(), 1.0 / layer->minimumScale() ); // caution: layer uses scale denoms, widget uses true scales mShowAllCheckBox->setChecked( true ); mCheckBoxAttributeLegend->setChecked( true ); mCheckBoxSizeLegend->setChecked( false ); mSizeLegendSymbol.reset( QgsMarkerSymbol::createSimple( QgsStringMap() ) ); switch ( layerType ) { case QgsWkbTypes::PointGeometry: mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( QgsDiagramLayerSettings::AroundPoint ) ); break; case QgsWkbTypes::LineGeometry: mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( QgsDiagramLayerSettings::Line ) ); chkLineAbove->setChecked( true ); chkLineBelow->setChecked( false ); chkLineOn->setChecked( false ); chkLineOrientationDependent->setChecked( false ); break; case QgsWkbTypes::PolygonGeometry: mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( QgsDiagramLayerSettings::AroundPoint ) ); break; case QgsWkbTypes::UnknownGeometry: case QgsWkbTypes::NullGeometry: break; } mBackgroundColorButton->setColor( QColor( 255, 255, 255, 255 ) ); //force a refresh of widget status to match diagram type on_mDiagramTypeComboBox_currentIndexChanged( mDiagramTypeComboBox->currentIndex() ); } else // already a diagram renderer present { //single category renderer or interpolated one? if ( dr->rendererName() == QLatin1String( "SingleCategory" ) ) { mFixedSizeRadio->setChecked( true ); } else { mAttributeBasedScalingRadio->setChecked( true ); } mDiagramSizeSpinBox->setEnabled( mFixedSizeRadio->isChecked() ); mLinearScaleFrame->setEnabled( mAttributeBasedScalingRadio->isChecked() ); mCheckBoxAttributeLegend->setChecked( dr->attributeLegend() ); mCheckBoxSizeLegend->setChecked( dr->sizeLegend() ); mSizeLegendSymbol.reset( dr->sizeLegendSymbol() ? dr->sizeLegendSymbol()->clone() : QgsMarkerSymbol::createSimple( QgsStringMap() ) ); QIcon icon = QgsSymbolLayerUtils::symbolPreviewIcon( mSizeLegendSymbol.get(), mButtonSizeLegendSymbol->iconSize() ); mButtonSizeLegendSymbol->setIcon( icon ); //assume single category or linearly interpolated diagram renderer for now QList<QgsDiagramSettings> settingList = dr->diagramSettings(); if ( !settingList.isEmpty() ) { mDiagramFrame->setEnabled( settingList.at( 0 ).enabled ); mDiagramFont = settingList.at( 0 ).font; QSizeF size = settingList.at( 0 ).size; mBackgroundColorButton->setColor( settingList.at( 0 ).backgroundColor ); mTransparencySpinBox->setValue( settingList.at( 0 ).transparency * 100.0 / 255.0 ); mTransparencySlider->setValue( mTransparencySpinBox->value() ); mDiagramPenColorButton->setColor( settingList.at( 0 ).penColor ); mPenWidthSpinBox->setValue( settingList.at( 0 ).penWidth ); mDiagramSizeSpinBox->setValue( ( size.width() + size.height() ) / 2.0 ); // caution: layer uses scale denoms, widget uses true scales mScaleRangeWidget->setScaleRange( 1.0 / ( settingList.at( 0 ).maxScaleDenominator > 0 ? settingList.at( 0 ).maxScaleDenominator : layer->maximumScale() ), 1.0 / ( settingList.at( 0 ).minScaleDenominator > 0 ? settingList.at( 0 ).minScaleDenominator : layer->minimumScale() ) ); mScaleVisibilityGroupBox->setChecked( settingList.at( 0 ).scaleBasedVisibility ); mDiagramUnitComboBox->setUnit( settingList.at( 0 ).sizeType ); mDiagramUnitComboBox->setMapUnitScale( settingList.at( 0 ).sizeScale ); mDiagramLineUnitComboBox->setUnit( settingList.at( 0 ).lineSizeUnit ); mDiagramLineUnitComboBox->setMapUnitScale( settingList.at( 0 ).lineSizeScale ); if ( settingList.at( 0 ).labelPlacementMethod == QgsDiagramSettings::Height ) { mLabelPlacementComboBox->setCurrentIndex( 0 ); } else { mLabelPlacementComboBox->setCurrentIndex( 1 ); } mAngleOffsetComboBox->setCurrentIndex( mAngleOffsetComboBox->findData( settingList.at( 0 ).angleOffset ) ); mOrientationLeftButton->setProperty( "direction", QgsDiagramSettings::Left ); mOrientationRightButton->setProperty( "direction", QgsDiagramSettings::Right ); mOrientationUpButton->setProperty( "direction", QgsDiagramSettings::Up ); mOrientationDownButton->setProperty( "direction", QgsDiagramSettings::Down ); switch ( settingList.at( 0 ).diagramOrientation ) { case QgsDiagramSettings::Left: mOrientationLeftButton->setChecked( true ); break; case QgsDiagramSettings::Right: mOrientationRightButton->setChecked( true ); break; case QgsDiagramSettings::Up: mOrientationUpButton->setChecked( true ); break; case QgsDiagramSettings::Down: mOrientationDownButton->setChecked( true ); break; } mBarWidthSpinBox->setValue( settingList.at( 0 ).barWidth ); mIncreaseSmallDiagramsCheck->setChecked( settingList.at( 0 ).minimumSize != 0 ); mIncreaseMinimumSizeSpinBox->setEnabled( mIncreaseSmallDiagramsCheck->isChecked() ); mIncreaseMinimumSizeLabel->setEnabled( mIncreaseSmallDiagramsCheck->isChecked() ); mIncreaseMinimumSizeSpinBox->setValue( settingList.at( 0 ).minimumSize ); if ( settingList.at( 0 ).scaleByArea ) { mScaleDependencyComboBox->setCurrentIndex( 0 ); } else { mScaleDependencyComboBox->setCurrentIndex( 1 ); } QList< QColor > categoryColors = settingList.at( 0 ).categoryColors; QList< QString > categoryAttributes = settingList.at( 0 ).categoryAttributes; QList< QString > categoryLabels = settingList.at( 0 ).categoryLabels; QList< QString >::const_iterator catIt = categoryAttributes.constBegin(); QList< QColor >::const_iterator coIt = categoryColors.constBegin(); QList< QString >::const_iterator labIt = categoryLabels.constBegin(); for ( ; catIt != categoryAttributes.constEnd(); ++catIt, ++coIt, ++labIt ) { QTreeWidgetItem *newItem = new QTreeWidgetItem( mDiagramAttributesTreeWidget ); newItem->setText( 0, *catIt ); newItem->setData( 0, RoleAttributeExpression, *catIt ); newItem->setFlags( newItem->flags() & ~Qt::ItemIsDropEnabled ); QColor col( *coIt ); col.setAlpha( 255 ); newItem->setBackground( 1, QBrush( col ) ); newItem->setText( 2, *labIt ); newItem->setFlags( newItem->flags() | Qt::ItemIsEditable ); } } if ( dr->rendererName() == QLatin1String( "LinearlyInterpolated" ) ) { const QgsLinearlyInterpolatedDiagramRenderer *lidr = dynamic_cast<const QgsLinearlyInterpolatedDiagramRenderer *>( dr ); if ( lidr ) { mDiagramSizeSpinBox->setEnabled( false ); mLinearScaleFrame->setEnabled( true ); mMaxValueSpinBox->setValue( lidr->upperValue() ); mSizeSpinBox->setValue( ( lidr->upperSize().width() + lidr->upperSize().height() ) / 2 ); if ( lidr->classificationAttributeIsExpression() ) { mSizeFieldExpressionWidget->setField( lidr->classificationAttributeExpression() ); } else { mSizeFieldExpressionWidget->setField( lidr->classificationField() ); } } } const QgsDiagramLayerSettings *dls = layer->diagramLayerSettings(); if ( dls ) { mDiagramDistanceSpinBox->setValue( dls->distance() ); mPrioritySlider->setValue( dls->priority() ); mZIndexSpinBox->setValue( dls->zIndex() ); mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( dls->placement() ) ); chkLineAbove->setChecked( dls->linePlacementFlags() & QgsDiagramLayerSettings::AboveLine ); chkLineBelow->setChecked( dls->linePlacementFlags() & QgsDiagramLayerSettings::BelowLine ); chkLineOn->setChecked( dls->linePlacementFlags() & QgsDiagramLayerSettings::OnLine ); if ( !( dls->linePlacementFlags() & QgsDiagramLayerSettings::MapOrientation ) ) chkLineOrientationDependent->setChecked( true ); mShowAllCheckBox->setChecked( dls->showAllDiagrams() ); mDataDefinedProperties = dls->dataDefinedProperties(); } if ( dr->diagram() ) { mDiagramType = dr->diagram()->diagramName(); mDiagramTypeComboBox->blockSignals( true ); mDiagramTypeComboBox->setCurrentIndex( settingList.at( 0 ).enabled ? mDiagramTypeComboBox->findData( mDiagramType ) : 0 ); mDiagramTypeComboBox->blockSignals( false ); //force a refresh of widget status to match diagram type on_mDiagramTypeComboBox_currentIndexChanged( mDiagramTypeComboBox->currentIndex() ); if ( mDiagramTypeComboBox->currentIndex() == -1 ) { QMessageBox::warning( this, tr( "Unknown diagram type." ), tr( "The diagram type '%1' is unknown. A default type is selected for you." ).arg( mDiagramType ), QMessageBox::Ok ); mDiagramTypeComboBox->setCurrentIndex( mDiagramTypeComboBox->findData( DIAGRAM_NAME_PIE ) ); } } } connect( mAddAttributeExpression, &QPushButton::clicked, this, &QgsDiagramProperties::showAddAttributeExpressionDialog ); connect( mTransparencySlider, &QSlider::valueChanged, mTransparencySpinBox, &QgsSpinBox::setValue ); connect( mTransparencySpinBox, static_cast < void ( QgsSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mTransparencySlider, &QSlider::setValue ); registerDataDefinedButton( mBackgroundColorDDBtn, QgsDiagramLayerSettings::BackgroundColor ); registerDataDefinedButton( mLineColorDDBtn, QgsDiagramLayerSettings::StrokeColor ); registerDataDefinedButton( mLineWidthDDBtn, QgsDiagramLayerSettings::StrokeWidth ); registerDataDefinedButton( mCoordXDDBtn, QgsDiagramLayerSettings::PositionX ); registerDataDefinedButton( mCoordYDDBtn, QgsDiagramLayerSettings::PositionY ); registerDataDefinedButton( mDistanceDDBtn, QgsDiagramLayerSettings::Distance ); registerDataDefinedButton( mPriorityDDBtn, QgsDiagramLayerSettings::Priority ); registerDataDefinedButton( mZOrderDDBtn, QgsDiagramLayerSettings::ZIndex ); registerDataDefinedButton( mShowDiagramDDBtn, QgsDiagramLayerSettings::Show ); registerDataDefinedButton( mAlwaysShowDDBtn, QgsDiagramLayerSettings::AlwaysShow ); registerDataDefinedButton( mIsObstacleDDBtn, QgsDiagramLayerSettings::IsObstacle ); registerDataDefinedButton( mStartAngleDDBtn, QgsDiagramLayerSettings::StartAngle ); }
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbol *symbol, QgsStyle *style, QMenu *menu, QWidget *parent, QgsVectorLayer *layer ) : QWidget( parent ) , mSymbol( symbol ) , mStyle( style ) , mLayer( layer ) { setupUi( this ); connect( mSymbolUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsSymbolsListWidget::mSymbolUnitWidget_changed ); spinAngle->setClearValue( 0 ); mSymbolUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMetersInMapUnits << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); mModel = new QgsReadOnlyStyleModel( mStyle, this ); mModel->setEntityFilterEnabled( true ); mModel->setEntityFilter( QgsStyle::SymbolEntity ); if ( mSymbol ) { mModel->setSymbolTypeFilterEnabled( true ); mModel->setSymbolType( mSymbol->type() ); } btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { mAdvancedMenu = menu; btnAdvanced->show(); btnAdvanced->setMenu( mAdvancedMenu ); } else { btnAdvanced->setMenu( new QMenu( this ) ); } mClipFeaturesAction = new QAction( tr( "Clip Features to Canvas Extent" ), this ); mClipFeaturesAction->setCheckable( true ); connect( mClipFeaturesAction, &QAction::toggled, this, &QgsSymbolsListWidget::clipFeaturesToggled ); mStandardizeRingsAction = new QAction( tr( "Force Right-Hand-Rule Orientation" ), this ); mStandardizeRingsAction->setCheckable( true ); connect( mStandardizeRingsAction, &QAction::toggled, this, &QgsSymbolsListWidget::forceRHRToggled ); double iconSize = Qgis::UI_SCALE_FACTOR * fontMetrics().width( 'X' ) * 10; viewSymbols->setIconSize( QSize( static_cast< int >( iconSize ), static_cast< int >( iconSize * 0.9 ) ) ); // ~100, 90 on low dpi double treeIconSize = Qgis::UI_SCALE_FACTOR * fontMetrics().width( 'X' ) * 2; mSymbolTreeView->setIconSize( QSize( static_cast< int >( treeIconSize ), static_cast< int >( treeIconSize ) ) ); mModel->addDesiredIconSize( viewSymbols->iconSize() ); mModel->addDesiredIconSize( mSymbolTreeView->iconSize() ); viewSymbols->setModel( mModel ); mSymbolTreeView->setModel( mModel ); viewSymbols->setSelectionBehavior( QAbstractItemView::SelectRows ); mSymbolTreeView->setSelectionModel( viewSymbols->selectionModel() ); mSymbolTreeView->setSelectionMode( viewSymbols->selectionMode() ); connect( viewSymbols->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsSymbolsListWidget::setSymbolFromStyle ); connect( mStyle, &QgsStyle::groupsModified, this, &QgsSymbolsListWidget::populateGroups ); connect( openStyleManagerButton, &QToolButton::clicked, this, &QgsSymbolsListWidget::openStyleManager ); lblSymbolName->clear(); connect( mButtonIconView, &QToolButton::toggled, this, [ = ]( bool active ) { if ( active ) { mSymbolViewStackedWidget->setCurrentIndex( 0 ); // note -- we have to save state here and not in destructor, as new symbol list widgets are created before the previous ones are destroyed QgsSettings().setValue( QStringLiteral( "UI/symbolsList/lastIconView" ), 0, QgsSettings::Gui ); } } ); connect( mButtonListView, &QToolButton::toggled, this, [ = ]( bool active ) { if ( active ) { QgsSettings().setValue( QStringLiteral( "UI/symbolsList/lastIconView" ), 1, QgsSettings::Gui ); mSymbolViewStackedWidget->setCurrentIndex( 1 ); } } ); // restore previous view QgsSettings settings; const int currentView = settings.value( QStringLiteral( "UI/symbolsList/lastIconView" ), 0, QgsSettings::Gui ).toInt(); if ( currentView == 0 ) mButtonIconView->setChecked( true ); else mButtonListView->setChecked( true ); mSymbolTreeView->header()->restoreState( settings.value( QStringLiteral( "UI/symbolsList/treeState" ), QByteArray(), QgsSettings::Gui ).toByteArray() ); connect( mSymbolTreeView->header(), &QHeaderView::sectionResized, this, [this] { // note -- we have to save state here and not in destructor, as new symbol list widgets are created before the previous ones are destroyed QgsSettings().setValue( QStringLiteral( "UI/symbolsList/treeState" ), mSymbolTreeView->header()->saveState(), QgsSettings::Gui ); } ); QgsFilterLineEdit *groupEdit = new QgsFilterLineEdit(); groupEdit->setShowSearchIcon( true ); groupEdit->setShowClearButton( true ); groupEdit->setPlaceholderText( tr( "Filter symbols…" ) ); groupsCombo->setLineEdit( groupEdit ); populateGroups(); connect( groupsCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsSymbolsListWidget::groupsCombo_currentIndexChanged ); connect( groupsCombo, &QComboBox::currentTextChanged, this, &QgsSymbolsListWidget::updateModelFilters ); if ( mSymbol ) { updateSymbolInfo(); } // select correct page in stacked widget // there's a correspondence between symbol type number and page numbering => exploit it! stackedWidget->setCurrentIndex( symbol->type() ); connect( btnColor, &QgsColorButton::colorChanged, this, &QgsSymbolsListWidget::setSymbolColor ); connect( spinAngle, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSymbolsListWidget::setMarkerAngle ); connect( spinSize, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSymbolsListWidget::setMarkerSize ); connect( spinWidth, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSymbolsListWidget::setLineWidth ); registerDataDefinedButton( mRotationDDBtn, QgsSymbolLayer::PropertyAngle ); connect( mRotationDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedMarkerAngle ); registerDataDefinedButton( mSizeDDBtn, QgsSymbolLayer::PropertySize ); connect( mSizeDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedMarkerSize ); registerDataDefinedButton( mWidthDDBtn, QgsSymbolLayer::PropertyStrokeWidth ); connect( mWidthDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedLineWidth ); connect( this, &QgsSymbolsListWidget::changed, this, &QgsSymbolsListWidget::updateAssistantSymbol ); updateAssistantSymbol(); btnColor->setAllowOpacity( true ); btnColor->setColorDialogTitle( tr( "Select Color" ) ); btnColor->setContext( QStringLiteral( "symbology" ) ); connect( btnSaveSymbol, &QPushButton::clicked, this, &QgsSymbolsListWidget::saveSymbol ); connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsSymbolsListWidget::opacityChanged ); }
QgsLayoutMapWidget::QgsLayoutMapWidget( QgsLayoutItemMap *item ) : QgsLayoutItemBaseWidget( nullptr, item ) , mMapItem( item ) { setupUi( this ); connect( mScaleLineEdit, &QLineEdit::editingFinished, this, &QgsLayoutMapWidget::mScaleLineEdit_editingFinished ); connect( mSetToMapCanvasExtentButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mSetToMapCanvasExtentButton_clicked ); connect( mViewExtentInCanvasButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mViewExtentInCanvasButton_clicked ); connect( mUpdatePreviewButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mUpdatePreviewButton_clicked ); connect( mFollowVisibilityPresetCheckBox, &QCheckBox::stateChanged, this, &QgsLayoutMapWidget::mFollowVisibilityPresetCheckBox_stateChanged ); connect( mKeepLayerListCheckBox, &QCheckBox::stateChanged, this, &QgsLayoutMapWidget::mKeepLayerListCheckBox_stateChanged ); connect( mKeepLayerStylesCheckBox, &QCheckBox::stateChanged, this, &QgsLayoutMapWidget::mKeepLayerStylesCheckBox_stateChanged ); connect( mDrawCanvasItemsCheckBox, &QCheckBox::stateChanged, this, &QgsLayoutMapWidget::mDrawCanvasItemsCheckBox_stateChanged ); connect( mOverviewBlendModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapWidget::mOverviewBlendModeComboBox_currentIndexChanged ); connect( mOverviewInvertCheckbox, &QCheckBox::toggled, this, &QgsLayoutMapWidget::mOverviewInvertCheckbox_toggled ); connect( mOverviewCenterCheckbox, &QCheckBox::toggled, this, &QgsLayoutMapWidget::mOverviewCenterCheckbox_toggled ); connect( mXMinLineEdit, &QLineEdit::editingFinished, this, &QgsLayoutMapWidget::mXMinLineEdit_editingFinished ); connect( mXMaxLineEdit, &QLineEdit::editingFinished, this, &QgsLayoutMapWidget::mXMaxLineEdit_editingFinished ); connect( mYMinLineEdit, &QLineEdit::editingFinished, this, &QgsLayoutMapWidget::mYMinLineEdit_editingFinished ); connect( mYMaxLineEdit, &QLineEdit::editingFinished, this, &QgsLayoutMapWidget::mYMaxLineEdit_editingFinished ); connect( mAtlasMarginRadio, &QRadioButton::toggled, this, &QgsLayoutMapWidget::mAtlasMarginRadio_toggled ); connect( mAtlasCheckBox, &QgsCollapsibleGroupBoxBasic::toggled, this, &QgsLayoutMapWidget::mAtlasCheckBox_toggled ); connect( mAtlasMarginSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsLayoutMapWidget::mAtlasMarginSpinBox_valueChanged ); connect( mAtlasFixedScaleRadio, &QRadioButton::toggled, this, &QgsLayoutMapWidget::mAtlasFixedScaleRadio_toggled ); connect( mAtlasPredefinedScaleRadio, &QRadioButton::toggled, this, &QgsLayoutMapWidget::mAtlasPredefinedScaleRadio_toggled ); connect( mAddGridPushButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mAddGridPushButton_clicked ); connect( mRemoveGridPushButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mRemoveGridPushButton_clicked ); connect( mGridUpButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mGridUpButton_clicked ); connect( mGridDownButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mGridDownButton_clicked ); connect( mDrawGridCheckBox, &QCheckBox::toggled, this, &QgsLayoutMapWidget::mDrawGridCheckBox_toggled ); connect( mGridListWidget, &QListWidget::currentItemChanged, this, &QgsLayoutMapWidget::mGridListWidget_currentItemChanged ); connect( mGridListWidget, &QListWidget::itemChanged, this, &QgsLayoutMapWidget::mGridListWidget_itemChanged ); connect( mGridPropertiesButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mGridPropertiesButton_clicked ); connect( mAddOverviewPushButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mAddOverviewPushButton_clicked ); connect( mRemoveOverviewPushButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mRemoveOverviewPushButton_clicked ); connect( mOverviewUpButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mOverviewUpButton_clicked ); connect( mOverviewDownButton, &QPushButton::clicked, this, &QgsLayoutMapWidget::mOverviewDownButton_clicked ); connect( mOverviewCheckBox, &QgsCollapsibleGroupBoxBasic::toggled, this, &QgsLayoutMapWidget::mOverviewCheckBox_toggled ); connect( mOverviewListWidget, &QListWidget::currentItemChanged, this, &QgsLayoutMapWidget::mOverviewListWidget_currentItemChanged ); connect( mOverviewListWidget, &QListWidget::itemChanged, this, &QgsLayoutMapWidget::mOverviewListWidget_itemChanged ); setPanelTitle( tr( "Map properties" ) ); mMapRotationSpinBox->setClearValue( 0 ); //add widget for general composer item properties mItemPropertiesWidget = new QgsLayoutItemPropertiesWidget( this, item ); mainLayout->addWidget( mItemPropertiesWidget ); mScaleLineEdit->setValidator( new QDoubleValidator( mScaleLineEdit ) ); mXMinLineEdit->setValidator( new QDoubleValidator( mXMinLineEdit ) ); mXMaxLineEdit->setValidator( new QDoubleValidator( mXMaxLineEdit ) ); mYMinLineEdit->setValidator( new QDoubleValidator( mYMinLineEdit ) ); mYMaxLineEdit->setValidator( new QDoubleValidator( mYMaxLineEdit ) ); blockAllSignals( true ); mCrsSelector->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true ); mCrsSelector->setNotSetText( tr( "Use project CRS" ) ); mOverviewFrameStyleButton->setSymbolType( QgsSymbol::Fill ); // follow preset combo mFollowVisibilityPresetCombo->setModel( new QStringListModel( mFollowVisibilityPresetCombo ) ); connect( mFollowVisibilityPresetCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapWidget::followVisibilityPresetSelected ); connect( QgsProject::instance()->mapThemeCollection(), &QgsMapThemeCollection::mapThemesChanged, this, &QgsLayoutMapWidget::onMapThemesChanged ); onMapThemesChanged(); // keep layers from preset button QMenu *menuKeepLayers = new QMenu( this ); mLayerListFromPresetButton->setMenu( menuKeepLayers ); mLayerListFromPresetButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowAllLayers.svg" ) ) ); mLayerListFromPresetButton->setToolTip( tr( "Set layer list from a map theme" ) ); connect( menuKeepLayers, &QMenu::aboutToShow, this, &QgsLayoutMapWidget::aboutToShowKeepLayersVisibilityPresetsMenu ); mOverviewFrameMapComboBox->setItemType( QgsLayoutItemRegistry::LayoutMap ); if ( item ) { connect( item, &QgsLayoutObject::changed, this, &QgsLayoutMapWidget::updateGuiElements ); #if 0 //TODO QgsAtlasComposition *atlas = atlasComposition(); if ( atlas ) { connect( atlas, &QgsAtlasComposition::coverageLayerChanged, this, &QgsLayoutMapWidget::atlasLayerChanged ); connect( atlas, &QgsAtlasComposition::toggled, this, &QgsLayoutMapWidget::compositionAtlasToggled ); compositionAtlasToggled( atlas->enabled() ); } #endif mOverviewFrameMapComboBox->setCurrentLayout( item->layout() ); mOverviewFrameStyleButton->registerExpressionContextGenerator( item ); } connect( mOverviewFrameMapComboBox, &QgsLayoutItemComboBox::itemChanged, this, &QgsLayoutMapWidget::overviewMapChanged ); connect( mCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsLayoutMapWidget::mapCrsChanged ); connect( mOverviewFrameStyleButton, &QgsSymbolButton::changed, this, &QgsLayoutMapWidget::overviewSymbolChanged ); registerDataDefinedButton( mScaleDDBtn, QgsLayoutObject::MapScale ); registerDataDefinedButton( mMapRotationDDBtn, QgsLayoutObject::MapRotation ); registerDataDefinedButton( mXMinDDBtn, QgsLayoutObject::MapXMin ); registerDataDefinedButton( mYMinDDBtn, QgsLayoutObject::MapYMin ); registerDataDefinedButton( mXMaxDDBtn, QgsLayoutObject::MapXMax ); registerDataDefinedButton( mYMaxDDBtn, QgsLayoutObject::MapYMax ); registerDataDefinedButton( mAtlasMarginDDBtn, QgsLayoutObject::MapAtlasMargin ); registerDataDefinedButton( mStylePresetsDDBtn, QgsLayoutObject::MapStylePreset ); registerDataDefinedButton( mLayersDDBtn, QgsLayoutObject::MapLayers ); updateGuiElements(); loadGridEntries(); loadOverviewEntries(); connect( mMapRotationSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsLayoutMapWidget::rotationChanged ); blockAllSignals( false ); }