void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer( bool updateCount ) { disconnectUpdateHandlers(); updateGraduatedSymbolIcon(); // update UI from the graduated renderer (update combo boxes, view) if ( mRenderer->mode() < cboGraduatedMode->count() ) cboGraduatedMode->setCurrentIndex( mRenderer->mode() ); // Only update class count if different - otherwise typing value gets very messy int nclasses = mRenderer->ranges().count(); if ( nclasses && updateCount ) spinGraduatedClasses->setValue( mRenderer->ranges().count() ); // set column QString attrName = mRenderer->classAttribute(); mExpressionWidget->setField( attrName ); mHistogramWidget->setSourceFieldExp( attrName ); // set source symbol if ( mRenderer->sourceSymbol() ) { delete mGraduatedSymbol; mGraduatedSymbol = mRenderer->sourceSymbol()->clone(); updateGraduatedSymbolIcon(); } mModel->setRenderer( mRenderer ); viewGraduated->setModel( mModel ); if ( mGraduatedSymbol ) { mSizeUnitWidget->blockSignals( true ); mSizeUnitWidget->setUnit( mGraduatedSymbol->outputUnit() ); mSizeUnitWidget->setMapUnitScale( mGraduatedSymbol->mapUnitScale() ); mSizeUnitWidget->blockSignals( false ); } // set source color ramp methodComboBox->blockSignals( true ); if ( mRenderer->graduatedMethod() == QgsGraduatedSymbolRendererV2::GraduatedColor ) { methodComboBox->setCurrentIndex( 0 ); if ( mRenderer->sourceColorRamp() ) cboGraduatedColorRamp->setSourceColorRamp( mRenderer->sourceColorRamp() ); cbxInvertedColorRamp->setChecked( mRenderer->invertedColorRamp() ); } else { methodComboBox->setCurrentIndex( 1 ); if ( !mRenderer->ranges().isEmpty() ) // avoid overiding default size with zeros { minSizeSpinBox->setValue( mRenderer->minSymbolSize() ); maxSizeSpinBox->setValue( mRenderer->maxSymbolSize() ); } } mMethodStackedWidget->setCurrentIndex( methodComboBox->currentIndex() ); methodComboBox->blockSignals( false ); QgsRendererRangeV2LabelFormat labelFormat = mRenderer->labelFormat(); txtLegendFormat->setText( labelFormat.format() ); spinPrecision->setValue( labelFormat.precision() ); cbxTrimTrailingZeroes->setChecked( labelFormat.trimTrailingZeroes() ); viewGraduated->resizeColumnToContents( 0 ); viewGraduated->resizeColumnToContents( 1 ); viewGraduated->resizeColumnToContents( 2 ); mHistogramWidget->refresh(); connectUpdateHandlers(); emit widgetChanged(); }
void QgsGraduatedSymbolRendererWidget::updateUiFromRenderer( bool updateCount ) { disconnectUpdateHandlers(); updateGraduatedSymbolIcon(); spinSymmetryPointForOtherMethods->setShowClearButton( false ); // update UI from the graduated renderer (update combo boxes, view) if ( cboGraduatedMode->findData( mRenderer->mode() ) >= 0 ) { cboGraduatedMode->setCurrentIndex( cboGraduatedMode->findData( mRenderer->mode() ) ); } // symmetric classification const QgsGraduatedSymbolRenderer::Mode cboMode = static_cast< QgsGraduatedSymbolRenderer::Mode >( cboGraduatedMode->currentData().toInt() ); switch ( cboMode ) { case QgsGraduatedSymbolRenderer::EqualInterval: case QgsGraduatedSymbolRenderer::StdDev: { mGroupBoxSymmetric->setVisible( true ); cbxAstride->setVisible( true ); cboSymmetryPointForPretty->setVisible( false ); spinSymmetryPointForOtherMethods->setVisible( true ); spinSymmetryPointForOtherMethods->setValue( mRenderer->symmetryPoint() ); break; } case QgsGraduatedSymbolRenderer::Pretty: { mGroupBoxSymmetric->setVisible( true ); cbxAstride->setVisible( true ); spinSymmetryPointForOtherMethods->setVisible( false ); cboSymmetryPointForPretty->setVisible( true ); cboSymmetryPointForPretty->clear(); cboSymmetryPointForPretty->addItems( mRenderer->listForCboPrettyBreaks() ); // replace the combobox on the good old value cboSymmetryPointForPretty->setCurrentText( QString::number( mRenderer->symmetryPoint(), 'f', 2 ) ); break; } case QgsGraduatedSymbolRenderer::Quantile: case QgsGraduatedSymbolRenderer::Jenks: case QgsGraduatedSymbolRenderer::Custom: { mGroupBoxSymmetric->setVisible( false ); cbxAstride->setVisible( false ); cboSymmetryPointForPretty->setVisible( false ); spinSymmetryPointForOtherMethods->setVisible( false ); spinSymmetryPointForOtherMethods->setValue( mRenderer->symmetryPoint() ); break; } } if ( mRenderer->useSymmetricMode() ) { mGroupBoxSymmetric->setChecked( true ); spinSymmetryPointForOtherMethods->setEnabled( true ); cbxAstride->setEnabled( true ); cboSymmetryPointForPretty->setEnabled( true ); } else { mGroupBoxSymmetric->setChecked( false ); spinSymmetryPointForOtherMethods->setEnabled( false ); cbxAstride->setEnabled( false ); cboSymmetryPointForPretty->setEnabled( false ); } if ( mRenderer->astride() ) cbxAstride->setChecked( true ); else cbxAstride->setChecked( false ); // Only update class count if different - otherwise typing value gets very messy int nclasses = mRenderer->ranges().count(); if ( nclasses && updateCount ) spinGraduatedClasses->setValue( mRenderer->ranges().count() ); // set column QString attrName = mRenderer->classAttribute(); mExpressionWidget->setField( attrName ); mHistogramWidget->setSourceFieldExp( attrName ); // set source symbol if ( mRenderer->sourceSymbol() ) { mGraduatedSymbol.reset( mRenderer->sourceSymbol()->clone() ); updateGraduatedSymbolIcon(); } mModel->setRenderer( mRenderer.get() ); viewGraduated->setModel( mModel ); if ( mGraduatedSymbol ) { mSizeUnitWidget->blockSignals( true ); mSizeUnitWidget->setUnit( mGraduatedSymbol->outputUnit() ); mSizeUnitWidget->setMapUnitScale( mGraduatedSymbol->mapUnitScale() ); mSizeUnitWidget->blockSignals( false ); } // set source color ramp methodComboBox->blockSignals( true ); if ( mRenderer->graduatedMethod() == QgsGraduatedSymbolRenderer::GraduatedColor ) { methodComboBox->setCurrentIndex( 0 ); if ( mRenderer->sourceColorRamp() ) { btnColorRamp->setColorRamp( mRenderer->sourceColorRamp() ); } } else { methodComboBox->setCurrentIndex( 1 ); if ( !mRenderer->ranges().isEmpty() ) // avoid overriding default size with zeros { minSizeSpinBox->setValue( mRenderer->minSymbolSize() ); maxSizeSpinBox->setValue( mRenderer->maxSymbolSize() ); } } toggleMethodWidgets( methodComboBox->currentIndex() ); methodComboBox->blockSignals( false ); QgsRendererRangeLabelFormat labelFormat = mRenderer->labelFormat(); txtLegendFormat->setText( labelFormat.format() ); spinPrecision->setValue( labelFormat.precision() ); cbxTrimTrailingZeroes->setChecked( labelFormat.trimTrailingZeroes() ); viewGraduated->resizeColumnToContents( 0 ); viewGraduated->resizeColumnToContents( 1 ); viewGraduated->resizeColumnToContents( 2 ); mHistogramWidget->refresh(); connectUpdateHandlers(); emit widgetChanged(); }
QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) : QgsRendererV2Widget( layer, style ) , mRenderer( nullptr ) , mModel( nullptr ) { // try to recognize the previous renderer // (null renderer means "no previous renderer") if ( renderer ) { mRenderer = QgsGraduatedSymbolRendererV2::convertFromRenderer( renderer ); } if ( !mRenderer ) { mRenderer = new QgsGraduatedSymbolRendererV2( "", QgsRangeList() ); } // setup user interface setupUi( this ); mModel = new QgsGraduatedSymbolRendererV2Model( this ); mExpressionWidget->setFilters( QgsFieldProxyModel::Numeric | QgsFieldProxyModel::Date ); mExpressionWidget->setLayer( mLayer ); mSizeUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels ); cboGraduatedColorRamp->populate( mStyle ); spinPrecision->setMinimum( QgsRendererRangeV2LabelFormat::MinPrecision ); spinPrecision->setMaximum( QgsRendererRangeV2LabelFormat::MaxPrecision ); // set project default color ramp QString defaultColorRamp = QgsProject::instance()->readEntry( "DefaultStyles", "/ColorRamp", "" ); if ( defaultColorRamp != "" ) { int index = cboGraduatedColorRamp->findText( defaultColorRamp, Qt::MatchCaseSensitive ); if ( index >= 0 ) cboGraduatedColorRamp->setCurrentIndex( index ); } viewGraduated->setStyle( new QgsGraduatedSymbolRendererV2ViewStyle( viewGraduated->style() ) ); mGraduatedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() ); methodComboBox->blockSignals( true ); methodComboBox->addItem( "Color" ); if ( mGraduatedSymbol->type() == QgsSymbolV2::Marker ) { methodComboBox->addItem( "Size" ); minSizeSpinBox->setValue( 1 ); maxSizeSpinBox->setValue( 8 ); } else if ( mGraduatedSymbol->type() == QgsSymbolV2::Line ) { methodComboBox->addItem( "Size" ); minSizeSpinBox->setValue( .1 ); maxSizeSpinBox->setValue( 2 ); } methodComboBox->blockSignals( false ); connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( graduatedColumnChanged( QString ) ) ); connect( viewGraduated, SIGNAL( doubleClicked( const QModelIndex & ) ), this, SLOT( rangesDoubleClicked( const QModelIndex & ) ) ); connect( viewGraduated, SIGNAL( clicked( const QModelIndex & ) ), this, SLOT( rangesClicked( const QModelIndex & ) ) ); connect( viewGraduated, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( contextMenuViewCategories( const QPoint& ) ) ); connect( btnGraduatedClassify, SIGNAL( clicked() ), this, SLOT( classifyGraduated() ) ); connect( btnChangeGraduatedSymbol, SIGNAL( clicked() ), this, SLOT( changeGraduatedSymbol() ) ); connect( btnGraduatedDelete, SIGNAL( clicked() ), this, SLOT( deleteClasses() ) ); connect( btnDeleteAllClasses, SIGNAL( clicked() ), this, SLOT( deleteAllClasses() ) ); connect( btnGraduatedAdd, SIGNAL( clicked() ), this, SLOT( addClass() ) ); connect( cbxLinkBoundaries, SIGNAL( toggled( bool ) ), this, SLOT( toggleBoundariesLink( bool ) ) ); connect( mSizeUnitWidget, SIGNAL( changed() ), this, SLOT( on_mSizeUnitWidget_changed() ) ); connectUpdateHandlers(); // initialize from previously set renderer updateUiFromRenderer(); // menus for data-defined rotation/size QMenu* advMenu = new QMenu; advMenu->addAction( tr( "Symbol levels..." ), this, SLOT( showSymbolLevels() ) ); btnAdvanced->setMenu( advMenu ); mHistogramWidget->setLayer( mLayer ); mHistogramWidget->setRenderer( mRenderer ); connect( mHistogramWidget, SIGNAL( rangesModified( bool ) ), this, SLOT( refreshRanges( bool ) ) ); connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), mHistogramWidget, SLOT( setSourceFieldExp( QString ) ) ); mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, this ); }
QgsGraduatedSymbolRendererWidget::QgsGraduatedSymbolRendererWidget( QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer ) : QgsRendererWidget( layer, style ) { // try to recognize the previous renderer // (null renderer means "no previous renderer") if ( renderer ) { mRenderer.reset( QgsGraduatedSymbolRenderer::convertFromRenderer( renderer ) ); } if ( !mRenderer ) { mRenderer = qgis::make_unique< QgsGraduatedSymbolRenderer >( QString(), QgsRangeList() ); } // setup user interface setupUi( this ); cboGraduatedMode->addItem( tr( "Equal Interval" ), QgsGraduatedSymbolRenderer::EqualInterval ); cboGraduatedMode->addItem( tr( "Quantile (Equal Count)" ), QgsGraduatedSymbolRenderer::Quantile ); cboGraduatedMode->addItem( tr( "Natural Breaks (Jenks)" ), QgsGraduatedSymbolRenderer::Jenks ); cboGraduatedMode->addItem( tr( "Standard Deviation" ), QgsGraduatedSymbolRenderer::StdDev ); cboGraduatedMode->addItem( tr( "Pretty Breaks" ), QgsGraduatedSymbolRenderer::Pretty ); connect( methodComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsGraduatedSymbolRendererWidget::methodComboBox_currentIndexChanged ); this->layout()->setContentsMargins( 0, 0, 0, 0 ); mModel = new QgsGraduatedSymbolRendererModel( this ); mExpressionWidget->setFilters( QgsFieldProxyModel::Numeric | QgsFieldProxyModel::Date ); mExpressionWidget->setLayer( mLayer ); mSizeUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); spinPrecision->setMinimum( QgsRendererRangeLabelFormat::MIN_PRECISION ); spinPrecision->setMaximum( QgsRendererRangeLabelFormat::MAX_PRECISION ); btnColorRamp->setShowRandomColorRamp( true ); // set project default color ramp QString defaultColorRamp = QgsProject::instance()->readEntry( QStringLiteral( "DefaultStyles" ), QStringLiteral( "/ColorRamp" ), QString() ); if ( !defaultColorRamp.isEmpty() ) { btnColorRamp->setColorRampFromName( defaultColorRamp ); } else { QgsColorRamp *ramp = new QgsGradientColorRamp( QColor( 255, 255, 255 ), QColor( 255, 0, 0 ) ); btnColorRamp->setColorRamp( ramp ); delete ramp; } viewGraduated->setStyle( new QgsGraduatedSymbolRendererViewStyle( viewGraduated ) ); mGraduatedSymbol.reset( QgsSymbol::defaultSymbol( mLayer->geometryType() ) ); methodComboBox->blockSignals( true ); methodComboBox->addItem( QStringLiteral( "Color" ) ); if ( mGraduatedSymbol->type() == QgsSymbol::Marker ) { methodComboBox->addItem( QStringLiteral( "Size" ) ); minSizeSpinBox->setValue( 1 ); maxSizeSpinBox->setValue( 8 ); } else if ( mGraduatedSymbol->type() == QgsSymbol::Line ) { methodComboBox->addItem( QStringLiteral( "Size" ) ); minSizeSpinBox->setValue( .1 ); maxSizeSpinBox->setValue( 2 ); } methodComboBox->blockSignals( false ); connect( mExpressionWidget, static_cast < void ( QgsFieldExpressionWidget::* )( const QString & ) >( &QgsFieldExpressionWidget::fieldChanged ), this, &QgsGraduatedSymbolRendererWidget::graduatedColumnChanged ); connect( viewGraduated, &QAbstractItemView::doubleClicked, this, &QgsGraduatedSymbolRendererWidget::rangesDoubleClicked ); connect( viewGraduated, &QAbstractItemView::clicked, this, &QgsGraduatedSymbolRendererWidget::rangesClicked ); connect( viewGraduated, &QTreeView::customContextMenuRequested, this, &QgsGraduatedSymbolRendererWidget::contextMenuViewCategories ); connect( btnGraduatedClassify, &QAbstractButton::clicked, this, &QgsGraduatedSymbolRendererWidget::classifyGraduated ); connect( btnChangeGraduatedSymbol, &QAbstractButton::clicked, this, &QgsGraduatedSymbolRendererWidget::changeGraduatedSymbol ); connect( btnGraduatedDelete, &QAbstractButton::clicked, this, &QgsGraduatedSymbolRendererWidget::deleteClasses ); connect( btnDeleteAllClasses, &QAbstractButton::clicked, this, &QgsGraduatedSymbolRendererWidget::deleteAllClasses ); connect( btnGraduatedAdd, &QAbstractButton::clicked, this, &QgsGraduatedSymbolRendererWidget::addClass ); connect( cbxLinkBoundaries, &QAbstractButton::toggled, this, &QgsGraduatedSymbolRendererWidget::toggleBoundariesLink ); connect( mSizeUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsGraduatedSymbolRendererWidget::mSizeUnitWidget_changed ); connectUpdateHandlers(); // initialize from previously set renderer updateUiFromRenderer(); // default to collapsed symmetric group for ui simplicity mGroupBoxSymmetric->setCollapsed( true ); // // menus for data-defined rotation/size QMenu *advMenu = new QMenu( this ); advMenu->addAction( tr( "Symbol Levels…" ), this, SLOT( showSymbolLevels() ) ); if ( mGraduatedSymbol->type() == QgsSymbol::Marker ) { QAction *actionDdsLegend = advMenu->addAction( tr( "Data-defined Size Legend…" ) ); // only from Qt 5.6 there is convenience addAction() with new style connection connect( actionDdsLegend, &QAction::triggered, this, &QgsGraduatedSymbolRendererWidget::dataDefinedSizeLegend ); } btnAdvanced->setMenu( advMenu ); mHistogramWidget->setLayer( mLayer ); mHistogramWidget->setRenderer( mRenderer.get() ); connect( mHistogramWidget, &QgsGraduatedHistogramWidget::rangesModified, this, &QgsGraduatedSymbolRendererWidget::refreshRanges ); connect( mExpressionWidget, static_cast < void ( QgsFieldExpressionWidget::* )( const QString & ) >( &QgsFieldExpressionWidget::fieldChanged ), mHistogramWidget, &QgsHistogramWidget::setSourceFieldExp ); mExpressionWidget->registerExpressionContextGenerator( this ); }