Skip to content

Commit

Permalink
Add global config for snapping limit on scale (with action and icon t…
Browse files Browse the repository at this point in the history
…o enable). Also use 0.0 for disabling value and display NULL to be more explicit.
  • Loading branch information
obrix committed Apr 7, 2020
1 parent 7b4be2b commit b484cae
Show file tree
Hide file tree
Showing 8 changed files with 364 additions and 12 deletions.
1 change: 1 addition & 0 deletions images/images.qrc
Expand Up @@ -684,6 +684,7 @@
<file>themes/default/mIconSnappingArea.svg</file>
<file>themes/default/mIconSnappingCentroid.svg</file>
<file>themes/default/mIconSnappingMiddle.svg</file>
<file>themes/default/mIconSnappingOnScale.svg</file>
<file>themes/default/mIconSnappingVertex.svg</file>
<file>themes/default/mIconSnappingSegment.svg</file>
<file>themes/default/mIconTopologicalEditing.svg</file>
Expand Down
158 changes: 158 additions & 0 deletions images/themes/default/mIconSnappingOnScale.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 20 additions & 4 deletions src/app/qgssnappinglayertreemodel.cpp
Expand Up @@ -104,19 +104,21 @@ QWidget *QgsSnappingLayerDelegate::createEditor( QWidget *parent, const QStyleOp
{
QDoubleSpinBox *minLimitSp = new QDoubleSpinBox( parent );
minLimitSp->setDecimals( 5 );
minLimitSp->setMinimum( -1.0 );
minLimitSp->setMinimum( 0.0 );
minLimitSp->setMaximum( 99999999.990000 );
minLimitSp->setToolTip( tr( "Min Scale" ) );
minLimitSp->setSpecialValueText("NULL");
return minLimitSp;
}

if ( index.column() == QgsSnappingLayerTreeModel::MaxScaleColumn )
{
QDoubleSpinBox *maxLimitSp = new QDoubleSpinBox( parent );
maxLimitSp->setDecimals( 5 );
maxLimitSp->setMinimum( -1.0 );
maxLimitSp->setMinimum( 0.0 );
maxLimitSp->setMaximum( 99999999.990000 );
maxLimitSp->setToolTip( tr( "Max Scale" ) );
maxLimitSp->setSpecialValueText("NULL");
return maxLimitSp;
}

Expand Down Expand Up @@ -626,7 +628,14 @@ QVariant QgsSnappingLayerTreeModel::data( const QModelIndex &idx, int role ) con
{
if ( role == Qt::DisplayRole )
{
return QString::number( ls.minScale() );
if( ls.minScale() <= 0.0)
{
return QString( "NULL" );
}
else
{
return QString::number( ls.minScale() );
}
}

if ( role == Qt::UserRole )
Expand All @@ -639,7 +648,14 @@ QVariant QgsSnappingLayerTreeModel::data( const QModelIndex &idx, int role ) con
{
if ( role == Qt::DisplayRole )
{
return QString::number( ls.maxScale() );
if( ls.maxScale() <= 0.0 )
{
return QString( "NULL" );
}
else
{
return QString::number( ls.maxScale() );
}
}

if ( role == Qt::UserRole )
Expand Down
82 changes: 82 additions & 0 deletions src/app/qgssnappingwidget.cpp
Expand Up @@ -24,6 +24,7 @@
#include <QToolBar>
#include <QToolButton>
#include <QWidgetAction>
#include <QCheckBox>

#include "qgisapp.h"
#include "qgsapplication.h"
Expand Down Expand Up @@ -173,6 +174,31 @@ QgsSnappingWidget::QgsSnappingWidget( QgsProject *project, QgsMapCanvas *canvas,
mToleranceSpinBox->setObjectName( QStringLiteral( "SnappingToleranceSpinBox" ) );
connect( mToleranceSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSnappingWidget::changeTolerance );

mMinScaleSpinBox = new QDoubleSpinBox();
mMinScaleSpinBox->setDecimals( 2 );
mMinScaleSpinBox->setMaximum( 99999999.990000 );
mMinScaleSpinBox->setMinimum( 0.0 );
mMinScaleSpinBox->setToolTip( tr( "Min scale on which snapping is enabled" ) );
mMinScaleSpinBox->setObjectName( QStringLiteral( "SnappingMinScaleSpinBox" ) );
mMinScaleSpinBox->setSpecialValueText("NULL");
connect( mMinScaleSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSnappingWidget::changeMinScale );

mMaxScaleSpinBox = new QDoubleSpinBox();
mMaxScaleSpinBox->setDecimals( 2 );
mMaxScaleSpinBox->setMaximum( 99999999.990000 );
mMaxScaleSpinBox->setMinimum( 0.0 );
mMaxScaleSpinBox->setToolTip( tr( "Max scale on which snapping is enabled" ) );
mMaxScaleSpinBox->setObjectName( QStringLiteral( "SnappingMaxScaleSpinBox" ) );
mMaxScaleSpinBox->setSpecialValueText("NULL");
connect( mMaxScaleSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSnappingWidget::changeMaxScale );


mLimitToScale = new QAction( tr( "Toggle Snapping limit on scale" ), this );
mLimitToScale->setCheckable( true );
mLimitToScale->setIcon( QIcon( QgsApplication::getThemeIcon( "/mIconSnappingOnScale.svg" ) ) );
mLimitToScale->setObjectName( QStringLiteral( "EnableSnappinLimitOnScaleAction" ) );
connect( mLimitToScale, &QAction::toggled, this, &QgsSnappingWidget::changeLimitToScale );

// units
mUnitsComboBox = new QComboBox();
mUnitsComboBox->addItem( tr( "px" ), QgsTolerance::Pixels );
Expand Down Expand Up @@ -261,6 +287,10 @@ QgsSnappingWidget::QgsSnappingWidget( QgsProject *project, QgsMapCanvas *canvas,
mTypeAction = tb->addWidget( mTypeButton );
mToleranceAction = tb->addWidget( mToleranceSpinBox );
mUnitAction = tb->addWidget( mUnitsComboBox );
tb->addAction( mLimitToScale );
mMinScaleAction = tb->addWidget( mMinScaleSpinBox );
mMaxScaleAction = tb->addWidget( mMaxScaleSpinBox );

tb->addAction( mTopologicalEditingAction );
tb->addAction( mIntersectionSnappingAction );
tb->addAction( mEnableTracingAction );
Expand All @@ -279,6 +309,12 @@ QgsSnappingWidget::QgsSnappingWidget( QgsProject *project, QgsMapCanvas *canvas,
layout->addWidget( mTypeButton );
layout->addWidget( mToleranceSpinBox );
layout->addWidget( mUnitsComboBox );
QToolButton *limitToScaleButton = new QToolButton();
limitToScaleButton->addAction( mLimitToScale );
limitToScaleButton->setDefaultAction( mLimitToScale );
layout->addWidget( limitToScaleButton );
layout->addWidget( mMinScaleSpinBox );
layout->addWidget( mMaxScaleSpinBox );

QToolButton *topoButton = new QToolButton();
topoButton->addAction( mTopologicalEditingAction );
Expand Down Expand Up @@ -401,12 +437,29 @@ void QgsSnappingWidget::projectSnapSettingsChanged()
mToleranceSpinBox->setValue( config.tolerance() );
}

if ( mMinScaleSpinBox->value() != config.minScale() )
{
mMinScaleSpinBox->setValue( config.minScale() );
}

if ( mMaxScaleSpinBox->value() != config.maxScale() )
{
mMaxScaleSpinBox->setValue( config.maxScale() );
}

mLimitToScale->setChecked(config.limitToScale());
/*if( mLimitToScale->isChecked() != config.limitToScale() )
{
mLimitToScale->setCheckState( config.limitToScale() ? Qt::Checked : Qt::Unchecked );
}*/

if ( config.intersectionSnapping() != mIntersectionSnappingAction->isChecked() )
{
mIntersectionSnappingAction->setChecked( config.intersectionSnapping() );
}

toggleSnappingWidgets( config.enabled() );

}

void QgsSnappingWidget::projectTopologicalEditingChanged()
Expand All @@ -429,6 +482,9 @@ void QgsSnappingWidget::toggleSnappingWidgets( bool enabled )
mModeButton->setEnabled( enabled );
mTypeButton->setEnabled( enabled );
mToleranceSpinBox->setEnabled( enabled );
mLimitToScale->setEnabled( enabled );
mMinScaleSpinBox->setEnabled( enabled && mConfig.limitToScale() );
mMaxScaleSpinBox->setEnabled( enabled && mConfig.limitToScale() );
mUnitsComboBox->setEnabled( enabled );
if ( mEditAdvancedConfigAction )
{
Expand All @@ -448,6 +504,26 @@ void QgsSnappingWidget::changeTolerance( double tolerance )
mProject->setSnappingConfig( mConfig );
}

void QgsSnappingWidget::changeMinScale( double pMinScale )
{
mConfig.setMinScale( pMinScale );
mProject->setSnappingConfig( mConfig );
}

void QgsSnappingWidget::changeMaxScale( double pMaxScale )
{
mConfig.setMaxScale( pMaxScale );
mProject->setSnappingConfig( mConfig );
}

void QgsSnappingWidget::changeLimitToScale( bool enabled )
{
mConfig.setLimitToScale( enabled );
mMinScaleSpinBox->setEnabled(mConfig.limitToScale());
mMaxScaleSpinBox->setEnabled(mConfig.limitToScale());
mProject->setSnappingConfig( mConfig );
}

void QgsSnappingWidget::changeUnit( int idx )
{
QgsTolerance::UnitType unit = static_cast<QgsTolerance::UnitType>( mUnitsComboBox->itemData( idx ).toInt() );
Expand Down Expand Up @@ -564,6 +640,9 @@ void QgsSnappingWidget::modeChanged()
mToleranceAction->setVisible( !advanced );
mUnitAction->setVisible( !advanced );
mEditAdvancedConfigAction->setVisible( advanced );
mMaxScaleAction->setVisible( advanced );
mMinScaleAction->setVisible( advanced );
mLimitToScale->setVisible( advanced );
}
else
{
Expand All @@ -574,6 +653,9 @@ void QgsSnappingWidget::modeChanged()
{
mAdvancedConfigWidget->setVisible( advanced );
}
mMinScaleSpinBox->setVisible( advanced );
mMaxScaleSpinBox->setVisible( advanced );
mLimitToScale->setVisible( advanced );
}
}

Expand Down

0 comments on commit b484cae

Please sign in to comment.