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() ) ); } }
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" ) ); }