void QgsLabelingWidget::adaptToLayer() { if ( !mLayer ) return; mLabelModeComboBox->setCurrentIndex( -1 ); // pick the right mode of the layer if ( mLayer->labeling() && mLayer->labeling()->type() == "rule-based" ) { mLabelModeComboBox->setCurrentIndex( 2 ); } else { // load labeling settings from layer QgsPalLayerSettings lyr; lyr.readFromLayer( mLayer ); // enable/disable main options based upon whether layer is being labeled if ( !lyr.enabled ) { mLabelModeComboBox->setCurrentIndex( 0 ); } else { mLabelModeComboBox->setCurrentIndex( lyr.drawLabels ? 1 : 3 ); } } }
QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, QWidget* parent ) : QWidget( parent ), mLBL( lbl ), mLayer( layer ), mMapCanvas( mapCanvas ) { if ( !layer ) return; setupUi( this ); mRefFont = lblFontPreview->font(); mPreviewBackgroundBtn->setColor( Qt::white ); connect( mPreviewBackgroundBtn, SIGNAL( clicked() ), this, SLOT( changePreviewBackground( ) ) ); connect( btnTextColor, SIGNAL( clicked() ), this, SLOT( changeTextColor() ) ); connect( btnChangeFont, SIGNAL( clicked() ), this, SLOT( changeTextFont() ) ); connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ) ); connect( btnBufferColor, SIGNAL( clicked() ), this, SLOT( changeBufferColor() ) ); connect( spinBufferSize, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) ); connect( btnEngineSettings, SIGNAL( clicked() ), this, SLOT( showEngineConfigDialog() ) ); connect( btnExpression, SIGNAL( clicked() ), this, SLOT( showExpressionDialog() ) ); // set placement methods page based on geometry type switch ( layer->geometryType() ) { case QGis::Point: stackedPlacement->setCurrentWidget( pagePoint ); break; case QGis::Line: stackedPlacement->setCurrentWidget( pageLine ); break; case QGis::Polygon: stackedPlacement->setCurrentWidget( pagePolygon ); break; default: Q_ASSERT( 0 && "NOOOO!" ); } //mTabWidget->setEnabled( chkEnableLabeling->isChecked() ); chkMergeLines->setEnabled( layer->geometryType() == QGis::Line ); chkAddDirectionSymbol->setEnabled( layer->geometryType() == QGis::Line ); label_19->setEnabled( layer->geometryType() != QGis::Point ); mMinSizeSpinBox->setEnabled( layer->geometryType() != QGis::Point ); // load labeling settings from layer QgsPalLayerSettings lyr; lyr.readFromLayer( layer ); populateFieldNames(); populateDataDefinedCombos( lyr ); chkEnableLabeling->setChecked( lyr.enabled ); mTabWidget->setEnabled( lyr.enabled ); cboFieldName->setEnabled( lyr.enabled ); btnExpression->setEnabled( lyr.enabled ); //Add the current expression to the bottom of the list. if ( lyr.isExpression && !lyr.fieldName.isEmpty() ) cboFieldName->addItem( lyr.fieldName ); // placement int distUnitIndex = lyr.distInMapUnits ? 1 : 0; switch ( lyr.placement ) { case QgsPalLayerSettings::AroundPoint: radAroundPoint->setChecked( true ); radAroundCentroid->setChecked( true ); spinDistPoint->setValue( lyr.dist ); mPointDistanceUnitComboBox->setCurrentIndex( distUnitIndex ); //spinAngle->setValue(lyr.angle); break; case QgsPalLayerSettings::OverPoint: radOverPoint->setChecked( true ); radOverCentroid->setChecked( true ); break; case QgsPalLayerSettings::Line: radLineParallel->setChecked( true ); radPolygonPerimeter->setChecked( true ); break; case QgsPalLayerSettings::Curved: radLineCurved->setChecked( true ); break; case QgsPalLayerSettings::Horizontal: radPolygonHorizontal->setChecked( true ); radLineHorizontal->setChecked( true ); break; case QgsPalLayerSettings::Free: radPolygonFree->setChecked( true ); break; default: Q_ASSERT( 0 && "NOOO!" ); } if ( lyr.placement == QgsPalLayerSettings::Line || lyr.placement == QgsPalLayerSettings::Curved ) { spinDistLine->setValue( lyr.dist ); mLineDistanceUnitComboBox->setCurrentIndex( distUnitIndex ); chkLineAbove->setChecked( lyr.placementFlags & QgsPalLayerSettings::AboveLine ); chkLineBelow->setChecked( lyr.placementFlags & QgsPalLayerSettings::BelowLine ); chkLineOn->setChecked( lyr.placementFlags & QgsPalLayerSettings::OnLine ); if ( !( lyr.placementFlags & QgsPalLayerSettings::MapOrientation ) ) chkLineOrientationDependent->setChecked( true ); } cboFieldName->setCurrentIndex( cboFieldName->findText( lyr.fieldName ) ); chkEnableLabeling->setChecked( lyr.enabled ); sliderPriority->setValue( lyr.priority ); chkNoObstacle->setChecked( !lyr.obstacle ); chkLabelPerFeaturePart->setChecked( lyr.labelPerPart ); chkMergeLines->setChecked( lyr.mergeLines ); mMinSizeSpinBox->setValue( lyr.minFeatureSize ); chkAddDirectionSymbol->setChecked( lyr.addDirectionSymbol ); wrapCharacterEdit->setText( lyr.wrapChar ); chkPreserveRotation->setChecked( lyr.preserveRotation ); bool scaleBased = ( lyr.scaleMin != 0 && lyr.scaleMax != 0 ); chkScaleBasedVisibility->setChecked( scaleBased ); if ( scaleBased ) { spinScaleMin->setValue( lyr.scaleMin ); spinScaleMax->setValue( lyr.scaleMax ); } bool buffer = ( lyr.bufferSize != 0 ); chkBuffer->setChecked( buffer ); if ( buffer ) spinBufferSize->setValue( lyr.bufferSize ); btnTextColor->setColor( lyr.textColor ); mFontTranspSpinBox->setValue( lyr.textTransp ); btnBufferColor->setColor( lyr.bufferColor ); mBufferTranspSpinBox->setValue( lyr.bufferTransp ); bool formattedNumbers = lyr.formatNumbers; bool plusSign = lyr.plusSign; chkFormattedNumbers->setChecked( formattedNumbers ); if ( formattedNumbers ) { spinDecimals->setValue( lyr.decimals ); } if ( plusSign ) { chkPlusSign->setChecked( plusSign ); } if ( lyr.fontSizeInMapUnits ) { mFontSizeUnitComboBox->setCurrentIndex( 1 ); } else { mFontSizeUnitComboBox->setCurrentIndex( 0 ); } QFont textFont = lyr.textFont; updateFont( textFont ); mFontSizeSpinBox->setValue( textFont.pointSizeF() ); updateUi(); updateOptions(); connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkScaleBasedVisibility, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkFormattedNumbers, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkLineAbove, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkLineBelow, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); // setup connection to changes in the placement QRadioButton* placementRadios[] = { radAroundPoint, radOverPoint, // point radLineParallel, radLineCurved, radLineHorizontal, // line radAroundCentroid, radPolygonHorizontal, radPolygonFree, radPolygonPerimeter // polygon }; for ( unsigned int i = 0; i < sizeof( placementRadios ) / sizeof( QRadioButton* ); i++ ) { connect( placementRadios[i], SIGNAL( toggled( bool ) ), this, SLOT( updateOptions() ) ); } }
int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QSet<int>& attrIndices, QgsRenderContext& ctx ) { Q_ASSERT( mMapRenderer != NULL ); // start with a temporary settings class, find out labeling info QgsPalLayerSettings lyrTmp; lyrTmp.readFromLayer( layer ); if ( !lyrTmp.enabled ) return 0; // find out which field will be needed int fldIndex = layer->fieldNameIndex( lyrTmp.fieldName ); if ( fldIndex == -1 ) return 0; attrIndices.insert( fldIndex ); //add indices of data defined fields QMap< QgsPalLayerSettings::DataDefinedProperties, int >::const_iterator dIt = lyrTmp.dataDefinedProperties.constBegin(); for ( ; dIt != lyrTmp.dataDefinedProperties.constEnd(); ++dIt ) { attrIndices.insert( dIt.value() ); } // add layer settings to the pallabeling hashtable: <QgsVectorLayer*, QgsPalLayerSettings> mActiveLayers.insert( layer, lyrTmp ); // start using the reference to the layer in hashtable instead of local instance QgsPalLayerSettings& lyr = mActiveLayers[layer]; // how to place the labels Arrangement arrangement; switch ( lyr.placement ) { case QgsPalLayerSettings::AroundPoint: arrangement = P_POINT; break; case QgsPalLayerSettings::OverPoint: arrangement = P_POINT_OVER; break; case QgsPalLayerSettings::Line: arrangement = P_LINE; break; case QgsPalLayerSettings::Curved: arrangement = P_CURVED; break; case QgsPalLayerSettings::Horizontal: arrangement = P_HORIZ; break; case QgsPalLayerSettings::Free: arrangement = P_FREE; break; default: Q_ASSERT( "unsupported placement" && 0 ); return 0; } // create the pal layer double priority = 1 - lyr.priority / 10.0; // convert 0..10 --> 1..0 double min_scale = -1, max_scale = -1; if ( lyr.scaleMin != 0 && lyr.scaleMax != 0 ) { min_scale = lyr.scaleMin; max_scale = lyr.scaleMax; } Layer* l = mPal->addLayer( layer->id().toUtf8().data(), min_scale, max_scale, arrangement, METER, priority, lyr.obstacle, true, true ); if ( lyr.placementFlags ) l->setArrangementFlags( lyr.placementFlags ); // set label mode (label per feature is the default) l->setLabelMode( lyr.labelPerPart ? Layer::LabelPerFeaturePart : Layer::LabelPerFeature ); // set whether adjacent lines should be merged l->setMergeConnectedLines( lyr.mergeLines ); lyr.textFont.setPixelSize( lyr.sizeToPixel( lyr.textFont.pointSizeF(), ctx ) ); //raster and vector scale factors lyr.vectorScaleFactor = ctx.scaleFactor(); lyr.rasterCompressFactor = ctx.rasterScaleFactor(); // save the pal layer to our layer context (with some additional info) lyr.palLayer = l; lyr.fieldIndex = fldIndex; lyr.fontMetrics = new QFontMetricsF( lyr.textFont ); lyr.xform = mMapRenderer->coordinateTransform(); if ( mMapRenderer->hasCrsTransformEnabled() ) lyr.ct = new QgsCoordinateTransform( layer->crs(), mMapRenderer->destinationCrs() ); else lyr.ct = NULL; lyr.ptZero = lyr.xform->toMapCoordinates( 0, 0 ); lyr.ptOne = lyr.xform->toMapCoordinates( 1, 0 ); // rect for clipping lyr.extentGeom = QgsGeometry::fromRect( mMapRenderer->extent() ); return 1; // init successful }
QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, QWidget* parent ) : QWidget( parent ), mLBL( lbl ), mLayer( layer ), mMapCanvas( mapCanvas ) { if ( !layer ) return; setupUi( this ); mRefFont = lblFontPreview->font(); mPreviewSize = 24; connect( btnTextColor, SIGNAL( clicked() ), this, SLOT( changeTextColor() ) ); connect( btnChangeFont, SIGNAL( clicked() ), this, SLOT( changeTextFont() ) ); connect( mFontTranspSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( updatePreview() ) ); connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ) ); connect( btnBufferColor, SIGNAL( clicked() ), this, SLOT( changeBufferColor() ) ); connect( spinBufferSize, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) ); connect( mBufferTranspSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( updatePreview() ) ); connect( mBufferJoinStyleComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( updatePreview() ) ); connect( mBufferTranspFillChbx, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ) ); connect( btnEngineSettings, SIGNAL( clicked() ), this, SLOT( showEngineConfigDialog() ) ); connect( btnExpression, SIGNAL( clicked() ), this, SLOT( showExpressionDialog() ) ); // set placement methods page based on geometry type switch ( layer->geometryType() ) { case QGis::Point: stackedPlacement->setCurrentWidget( pagePoint ); break; case QGis::Line: stackedPlacement->setCurrentWidget( pageLine ); break; case QGis::Polygon: stackedPlacement->setCurrentWidget( pagePolygon ); break; default: Q_ASSERT( 0 && "NOOOO!" ); } //mTabWidget->setEnabled( chkEnableLabeling->isChecked() ); chkMergeLines->setEnabled( layer->geometryType() == QGis::Line ); chkAddDirectionSymbol->setEnabled( layer->geometryType() == QGis::Line ); label_19->setEnabled( layer->geometryType() != QGis::Point ); mMinSizeSpinBox->setEnabled( layer->geometryType() != QGis::Point ); // load labeling settings from layer QgsPalLayerSettings lyr; lyr.readFromLayer( layer ); populateFieldNames(); populateDataDefinedCombos( lyr ); populateFontCapitalsComboBox(); chkEnableLabeling->setChecked( lyr.enabled ); mTabWidget->setEnabled( lyr.enabled ); cboFieldName->setEnabled( lyr.enabled ); btnExpression->setEnabled( lyr.enabled ); //Add the current expression to the bottom of the list. if ( lyr.isExpression && !lyr.fieldName.isEmpty() ) cboFieldName->addItem( lyr.fieldName ); // placement int distUnitIndex = lyr.distInMapUnits ? 1 : 0; mXQuadOffset = lyr.xQuadOffset; mYQuadOffset = lyr.yQuadOffset; mCentroidRadioWhole->setChecked( lyr.centroidWhole ); mCentroidFrame->setVisible( false ); switch ( lyr.placement ) { case QgsPalLayerSettings::AroundPoint: radAroundPoint->setChecked( true ); radAroundCentroid->setChecked( true ); spinDistPoint->setValue( lyr.dist ); mPointDistanceUnitComboBox->setCurrentIndex( distUnitIndex ); mCentroidFrame->setVisible( layer->geometryType() == QGis::Polygon ); //spinAngle->setValue( lyr.angle ); break; case QgsPalLayerSettings::OverPoint: radOverPoint->setChecked( true ); radOverCentroid->setChecked( true ); mPointOffsetRadioAboveLeft->setChecked( mXQuadOffset == -1 && mYQuadOffset == 1 ); mPointOffsetRadioAbove->setChecked( mXQuadOffset == 0 && mYQuadOffset == 1 ); mPointOffsetRadioAboveRight->setChecked( mXQuadOffset == 1 && mYQuadOffset == 1 ); mPointOffsetRadioLeft->setChecked( mXQuadOffset == -1 && mYQuadOffset == 0 ); mPointOffsetRadioOver->setChecked( mXQuadOffset == 0 && mYQuadOffset == 0 ); mPointOffsetRadioRight->setChecked( mXQuadOffset == 1 && mYQuadOffset == 0 ); mPointOffsetRadioBelowLeft->setChecked( mXQuadOffset == -1 && mYQuadOffset == -1 ); mPointOffsetRadioBelow->setChecked( mXQuadOffset == 0 && mYQuadOffset == -1 ); mPointOffsetRadioBelowRight->setChecked( mXQuadOffset == 1 && mYQuadOffset == -1 ); mPointOffsetXOffsetSpinBox->setValue( lyr.xOffset ); mPointOffsetYOffsetSpinBox->setValue( lyr.yOffset ); mPointOffsetUnitsComboBox->setCurrentIndex( lyr.labelOffsetInMapUnits ? 1 : 0 ); mPointOffsetAngleSpinBox->setValue( lyr.angleOffset ); mCentroidFrame->setVisible( layer->geometryType() == QGis::Polygon ); break; case QgsPalLayerSettings::Line: radLineParallel->setChecked( true ); radPolygonPerimeter->setChecked( true ); break; case QgsPalLayerSettings::Curved: radLineCurved->setChecked( true ); break; case QgsPalLayerSettings::Horizontal: radPolygonHorizontal->setChecked( true ); radLineHorizontal->setChecked( true ); break; case QgsPalLayerSettings::Free: radPolygonFree->setChecked( true ); break; default: Q_ASSERT( 0 && "NOOO!" ); } if ( lyr.placement == QgsPalLayerSettings::Line || lyr.placement == QgsPalLayerSettings::Curved ) { spinDistLine->setValue( lyr.dist ); mLineDistanceUnitComboBox->setCurrentIndex( distUnitIndex ); chkLineAbove->setChecked( lyr.placementFlags & QgsPalLayerSettings::AboveLine ); chkLineBelow->setChecked( lyr.placementFlags & QgsPalLayerSettings::BelowLine ); chkLineOn->setChecked( lyr.placementFlags & QgsPalLayerSettings::OnLine ); if ( !( lyr.placementFlags & QgsPalLayerSettings::MapOrientation ) ) chkLineOrientationDependent->setChecked( true ); } cboFieldName->setCurrentIndex( cboFieldName->findText( lyr.fieldName ) ); chkEnableLabeling->setChecked( lyr.enabled ); sliderPriority->setValue( lyr.priority ); chkNoObstacle->setChecked( !lyr.obstacle ); chkLabelPerFeaturePart->setChecked( lyr.labelPerPart ); mPalShowAllLabelsForLayerChkBx->setChecked( lyr.displayAll ); chkMergeLines->setChecked( lyr.mergeLines ); mMinSizeSpinBox->setValue( lyr.minFeatureSize ); chkAddDirectionSymbol->setChecked( lyr.addDirectionSymbol ); wrapCharacterEdit->setText( lyr.wrapChar ); chkPreserveRotation->setChecked( lyr.preserveRotation ); mPreviewBackgroundBtn->setColor( lyr.previewBkgrdColor ); setPreviewBackground( lyr.previewBkgrdColor ); bool scaleBased = ( lyr.scaleMin != 0 && lyr.scaleMax != 0 ); chkScaleBasedVisibility->setChecked( scaleBased ); if ( scaleBased ) { spinScaleMin->setValue( lyr.scaleMin ); spinScaleMax->setValue( lyr.scaleMax ); } bool buffer = ( lyr.bufferSize != 0 ); chkBuffer->setChecked( buffer ); if ( buffer ) { spinBufferSize->setValue( lyr.bufferSize ); if ( lyr.bufferSizeInMapUnits ) { mBufferUnitComboBox->setCurrentIndex( 1 ); } else { mBufferUnitComboBox->setCurrentIndex( 0 ); } btnBufferColor->setColor( lyr.bufferColor ); mBufferTranspSpinBox->setValue( lyr.bufferTransp ); mBufferJoinStyleComboBox->setPenJoinStyle( lyr.bufferJoinStyle ); mBufferTranspFillChbx->setChecked( !lyr.bufferNoFill ); } bool formattedNumbers = lyr.formatNumbers; bool plusSign = lyr.plusSign; chkFormattedNumbers->setChecked( formattedNumbers ); if ( formattedNumbers ) { spinDecimals->setValue( lyr.decimals ); } if ( plusSign ) { chkPlusSign->setChecked( plusSign ); } if ( lyr.fontSizeInMapUnits ) { mFontSizeUnitComboBox->setCurrentIndex( 1 ); } else { mFontSizeUnitComboBox->setCurrentIndex( 0 ); } mRefFont = lyr.textFont; mFontSizeSpinBox->setValue( lyr.textFont.pointSizeF() ); btnTextColor->setColor( lyr.textColor ); mFontTranspSpinBox->setValue( lyr.textTransp ); updateFontViaStyle( lyr.textNamedStyle ); updateFont( mRefFont ); updateUi(); updateOptions(); connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkScaleBasedVisibility, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkFormattedNumbers, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkLineAbove, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); connect( chkLineBelow, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) ); // setup connection to changes in the placement QRadioButton* placementRadios[] = { radAroundPoint, radOverPoint, // point radLineParallel, radLineCurved, radLineHorizontal, // line radAroundCentroid, radPolygonHorizontal, radPolygonFree, radPolygonPerimeter // polygon }; for ( unsigned int i = 0; i < sizeof( placementRadios ) / sizeof( QRadioButton* ); i++ ) { connect( placementRadios[i], SIGNAL( toggled( bool ) ), this, SLOT( updateOptions() ) ); } // setup connections for label quadrant offsets QRadioButton* quadrantRadios[] = { mPointOffsetRadioAboveLeft, mPointOffsetRadioAbove, mPointOffsetRadioAboveRight, mPointOffsetRadioLeft, mPointOffsetRadioOver, mPointOffsetRadioRight, mPointOffsetRadioBelowLeft, mPointOffsetRadioBelow, mPointOffsetRadioBelowRight }; for ( unsigned int i = 0; i < sizeof( quadrantRadios ) / sizeof( QRadioButton* ); i++ ) { connect( quadrantRadios[i], SIGNAL( toggled( bool ) ), this, SLOT( updateQuadrant() ) ); } // Global settings group for groupboxes' saved/retored collapsed state // maintains state across different dialogs foreach ( QgsCollapsibleGroupBox *grpbox, findChildren<QgsCollapsibleGroupBox*>() ) { grpbox->setSettingGroup( QString( "mAdvLabelingDlg" ) ); }
bool QgsPalLabeling::willUseLayer( QgsVectorLayer* layer ) { QgsPalLayerSettings lyrTmp; lyrTmp.readFromLayer( layer ); return lyrTmp.enabled; }