Skip to content

Commit d0fceef

Browse files
authoredMar 8, 2019
Merge pull request #9425 from 3nids/scope_base_enum
Scope based enum
2 parents 237e13c + 1281bcc commit d0fceef

File tree

7 files changed

+57
-22
lines changed

7 files changed

+57
-22
lines changed
 
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
# The following has been generated automatically from src/gui/qgsadvanceddigitizingdockwidget.h
22
QgsAdvancedDigitizingDockWidget.CadCapacities.baseClass = QgsAdvancedDigitizingDockWidget
33
CadCapacities = QgsAdvancedDigitizingDockWidget # dirty hack since SIP seems to introduce the flags in module
4+
# monkey patching scoped based enum
5+
QgsAdvancedDigitizingDockWidget.AdditionalConstraint.NoConstraint.__doc__ = "No additional constraint"
6+
QgsAdvancedDigitizingDockWidget.NoConstraint = QgsAdvancedDigitizingDockWidget.AdditionalConstraint.NoConstraint
7+
QgsAdvancedDigitizingDockWidget.AdditionalConstraint.Perpendicular.__doc__ = "Perpendicular"
8+
QgsAdvancedDigitizingDockWidget.Perpendicular = QgsAdvancedDigitizingDockWidget.AdditionalConstraint.Perpendicular
9+
QgsAdvancedDigitizingDockWidget.AdditionalConstraint.Parallel.__doc__ = "Parallel"
10+
QgsAdvancedDigitizingDockWidget.Parallel = QgsAdvancedDigitizingDockWidget.AdditionalConstraint.Parallel
11+
QgsAdvancedDigitizingDockWidget.AdditionalConstraint.__doc__ = 'Additional constraints which can be enabled\n' + '* NoConstraint: ' + QgsAdvancedDigitizingDockWidget.AdditionalConstraint.NoConstraint.__doc__ + '\n' + '* Perpendicular: ' + QgsAdvancedDigitizingDockWidget.AdditionalConstraint.Perpendicular.__doc__ + '\n' + '* Parallel: ' + QgsAdvancedDigitizingDockWidget.AdditionalConstraint.Parallel.__doc__
12+
# --

‎python/gui/auto_generated/qgsadvanceddigitizingdockwidget.sip.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,14 @@ by implementing filters called from QgsMapToolAdvancedDigitizing.
3535
typedef QFlags<QgsAdvancedDigitizingDockWidget::CadCapacity> CadCapacities;
3636

3737

38-
enum AdditionalConstraint
38+
enum class AdditionalConstraint
3939
{
4040
NoConstraint,
4141
Perpendicular,
4242
Parallel
4343
};
4444

45+
4546
class CadConstraint
4647
{
4748
%Docstring

‎scripts/sipify.pl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -950,8 +950,16 @@ sub detect_non_method_member{
950950
}
951951

952952
# Enum declaration
953-
if ( $LINE =~ m/^\s*enum\s+\w+.*?$/ ){
954-
write_output("ENU1", "$LINE\n");
953+
# For scoped and type based enum, the type has to be removed
954+
if ( $LINE =~ m/^(\s*enum\s+(class\s+)?(\w+))(:?\s+SIP_.*)?(\s*:\s*\w+)?(?<oneliner>.*)$/ ){
955+
write_output("ENU1", "$1");
956+
write_output("ENU1", $+{oneliner}) if defined $+{oneliner};
957+
write_output("ENU1", "\n");
958+
my $enum_qualname = $3;
959+
my $is_scope_based = "0";
960+
$is_scope_based = "1" if defined $2;
961+
my $monkeypatch = "0";
962+
$monkeypatch = "1" if defined $is_scope_based eq "1" and $LINE =~ m/SIP_MONKEYPATCH_SCOPEENUM/;
955963
if ($LINE =~ m/\{((\s*\w+)(\s*=\s*[\w\s\d<|]+.*?)?(,?))+\s*\}/){
956964
# one line declaration
957965
$LINE !~ m/=/ or exit_with_error("spify.pl does not handle enum one liners with value assignment. Use multiple lines instead.");
@@ -962,6 +970,8 @@ sub detect_non_method_member{
962970
$LINE = read_line();
963971
$LINE =~ m/^\s*\{\s*$/ or exit_with_error('Unexpected content: enum should be followed by {');
964972
write_output("ENU2", "$LINE\n");
973+
push @OUTPUT_PYTHON, "# monkey patching scoped based enum\n" if $is_scope_based eq "1";
974+
my @enum_members_doc = ();
965975
while ($LINE_IDX < $LINE_COUNT){
966976
$LINE = read_line();
967977
if (detect_comment_block()){
@@ -971,13 +981,19 @@ sub detect_non_method_member{
971981
next if ($LINE =~ m/^\s*\w+\s*\|/); # multi line declaration as sum of enums
972982

973983
do {no warnings 'uninitialized';
974-
my $enum_decl = $LINE =~ s/^(\s*\w+)(\s+SIP_\w+(?:\([^()]+\))?)?(?:\s*=\s*(?:[\w\s\d|+-]|::|<<)+)?(,?).*$/$1$2$3/r;
984+
my $enum_decl = $LINE =~ s/^(\s*(?<em>\w+))(\s+SIP_\w+(?:\([^()]+\))?)?(?:\s*=\s*(?:[\w\s\d|+-]|::|<<)+)?(,?)(:?\s*\/\/!<\s*(?<co>.*)|.*)$/$1$3$4/r;
985+
my $enum_member = $+{em};
986+
push @enum_members_doc, "'* $enum_member: ' + $ACTUAL_CLASS.$enum_qualname.$2.__doc__";
987+
my $comment = $+{co};
988+
push @OUTPUT_PYTHON, "$ACTUAL_CLASS.$enum_qualname.$enum_member.__doc__ = \"$comment\"\n" if $is_scope_based eq "1";
989+
push @OUTPUT_PYTHON, "$ACTUAL_CLASS.$enum_member = $ACTUAL_CLASS.$enum_qualname.$enum_member\n" if $monkeypatch eq "1";
975990
$enum_decl = fix_annotations($enum_decl);
976991
write_output("ENU3", "$enum_decl\n");
977992
};
978993
detect_comment_block(strict_mode => UNSTRICT);
979994
}
980995
write_output("ENU4", "$LINE\n");
996+
push @OUTPUT_PYTHON, "$ACTUAL_CLASS.$enum_qualname.__doc__ = '$COMMENT\\n' + " . join(" + '\\n' + ", @enum_members_doc) . "\n# --\n" if $is_scope_based eq "1";
981997
# enums don't have Docstring apparently
982998
$COMMENT = '';
983999
next;

‎src/core/qgis_sip.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,12 @@
232232
#define SIP_PYTHON_SPECIAL_BOOL(method_or_code)
233233
#define SIP_PYTHON_SPECIAL_REPR(method_or_code)
234234

235+
/*
236+
* If one reformat an enum to a scope based enum
237+
* sipify will take care of monkey patching to keep
238+
* API compatibility
239+
*/
240+
#define SIP_MONKEYPATCH_SCOPEENUM
241+
242+
235243
#endif // QGIS_SIP_H

‎src/gui/qgsadvanceddigitizingcanvasitem.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
116116
}
117117

118118
// Draw segment par/per input
119-
if ( mAdvancedDigitizingDockWidget->additionalConstraint() != QgsAdvancedDigitizingDockWidget::NoConstraint && hasSnappedSegment )
119+
if ( mAdvancedDigitizingDockWidget->additionalConstraint() != QgsAdvancedDigitizingDockWidget::AdditionalConstraint::NoConstraint && hasSnappedSegment )
120120
{
121121
painter->setPen( mConstruction2Pen );
122122
painter->drawLine( snapSegmentPix1, snapSegmentPix2 );
@@ -230,7 +230,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
230230
}
231231

232232
// Draw constr
233-
if ( mAdvancedDigitizingDockWidget->additionalConstraint() == QgsAdvancedDigitizingDockWidget::NoConstraint )
233+
if ( mAdvancedDigitizingDockWidget->additionalConstraint() == QgsAdvancedDigitizingDockWidget::AdditionalConstraint::NoConstraint )
234234
{
235235
if ( curPointExist && previousPointExist )
236236
{

‎src/gui/qgsadvanceddigitizingdockwidget.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas *
4848
mDistanceConstraint.reset( new CadConstraint( mDistanceLineEdit, mLockDistanceButton, nullptr, mRepeatingLockDistanceButton ) );
4949
mXConstraint.reset( new CadConstraint( mXLineEdit, mLockXButton, mRelativeXButton, mRepeatingLockXButton ) );
5050
mYConstraint.reset( new CadConstraint( mYLineEdit, mLockYButton, mRelativeYButton, mRepeatingLockYButton ) );
51-
mAdditionalConstraint = NoConstraint;
51+
mAdditionalConstraint = AdditionalConstraint::NoConstraint;
5252

5353
mMapCanvas->installEventFilter( this );
5454
mAngleLineEdit->installEventFilter( this );
@@ -187,15 +187,15 @@ void QgsAdvancedDigitizingDockWidget::additionalConstraintClicked( bool activate
187187
{
188188
if ( !activated )
189189
{
190-
lockAdditionalConstraint( NoConstraint );
190+
lockAdditionalConstraint( AdditionalConstraint::NoConstraint );
191191
}
192192
if ( sender() == mParallelAction )
193193
{
194-
lockAdditionalConstraint( Parallel );
194+
lockAdditionalConstraint( AdditionalConstraint::Parallel );
195195
}
196196
else if ( sender() == mPerpendicularAction )
197197
{
198-
lockAdditionalConstraint( Perpendicular );
198+
lockAdditionalConstraint( AdditionalConstraint::Perpendicular );
199199
}
200200
}
201201

@@ -258,7 +258,7 @@ void QgsAdvancedDigitizingDockWidget::releaseLocks( bool releaseRepeatingLocks )
258258
{
259259
// release all locks except construction mode
260260

261-
lockAdditionalConstraint( NoConstraint );
261+
lockAdditionalConstraint( AdditionalConstraint::NoConstraint );
262262

263263
if ( releaseRepeatingLocks || !mAngleConstraint->isRepeatingLock() )
264264
mAngleConstraint->setLockMode( CadConstraint::NoLock );
@@ -380,7 +380,7 @@ void QgsAdvancedDigitizingDockWidget::lockConstraint( bool activate /* default t
380380
// deactivate perpendicular/parallel if angle has been activated
381381
if ( constraint == mAngleConstraint.get() )
382382
{
383-
lockAdditionalConstraint( NoConstraint );
383+
lockAdditionalConstraint( AdditionalConstraint::NoConstraint );
384384
}
385385

386386
// run a fake map mouse event to update the paint item
@@ -417,8 +417,8 @@ void QgsAdvancedDigitizingDockWidget::constraintFocusOut()
417417
void QgsAdvancedDigitizingDockWidget::lockAdditionalConstraint( AdditionalConstraint constraint )
418418
{
419419
mAdditionalConstraint = constraint;
420-
mPerpendicularAction->setChecked( constraint == Perpendicular );
421-
mParallelAction->setChecked( constraint == Parallel );
420+
mPerpendicularAction->setChecked( constraint == AdditionalConstraint::Perpendicular );
421+
mParallelAction->setChecked( constraint == AdditionalConstraint::Parallel );
422422
}
423423

424424
void QgsAdvancedDigitizingDockWidget::updateCapacity( bool updateUIwithoutChange )
@@ -465,7 +465,7 @@ void QgsAdvancedDigitizingDockWidget::updateCapacity( bool updateUIwithoutChange
465465

466466
if ( !absoluteAngle )
467467
{
468-
lockAdditionalConstraint( NoConstraint );
468+
lockAdditionalConstraint( AdditionalConstraint::NoConstraint );
469469
}
470470

471471
// absolute angle = azimuth, relative = from previous line
@@ -663,7 +663,7 @@ QList<QgsPointXY> QgsAdvancedDigitizingDockWidget::snapSegmentToAllLayers( const
663663

664664
bool QgsAdvancedDigitizingDockWidget::alignToSegment( QgsMapMouseEvent *e, CadConstraint::LockMode lockMode )
665665
{
666-
if ( mAdditionalConstraint == NoConstraint )
666+
if ( mAdditionalConstraint == AdditionalConstraint::NoConstraint )
667667
{
668668
return false;
669669
}
@@ -685,7 +685,7 @@ bool QgsAdvancedDigitizingDockWidget::alignToSegment( QgsMapMouseEvent *e, CadCo
685685
angle -= std::atan2( previousPt.y() - penultimatePt.y(), previousPt.x() - penultimatePt.x() );
686686
}
687687

688-
if ( mAdditionalConstraint == Perpendicular )
688+
if ( mAdditionalConstraint == AdditionalConstraint::Perpendicular )
689689
{
690690
angle += M_PI_2;
691691
}
@@ -696,7 +696,7 @@ bool QgsAdvancedDigitizingDockWidget::alignToSegment( QgsMapMouseEvent *e, CadCo
696696
mAngleConstraint->setLockMode( lockMode );
697697
if ( lockMode == CadConstraint::HardLock )
698698
{
699-
mAdditionalConstraint = NoConstraint;
699+
mAdditionalConstraint = AdditionalConstraint::NoConstraint;
700700
}
701701

702702
return true;
@@ -931,15 +931,15 @@ bool QgsAdvancedDigitizingDockWidget::filterKeyPress( QKeyEvent *e )
931931

932932
if ( !parallel && !perpendicular )
933933
{
934-
lockAdditionalConstraint( Perpendicular );
934+
lockAdditionalConstraint( AdditionalConstraint::Perpendicular );
935935
}
936936
else if ( perpendicular )
937937
{
938-
lockAdditionalConstraint( Parallel );
938+
lockAdditionalConstraint( AdditionalConstraint::Parallel );
939939
}
940940
else
941941
{
942-
lockAdditionalConstraint( NoConstraint );
942+
lockAdditionalConstraint( AdditionalConstraint::NoConstraint );
943943
}
944944
e->accept();
945945
}

‎src/gui/qgsadvanceddigitizingdockwidget.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,14 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
6565
/**
6666
* Additional constraints which can be enabled
6767
*/
68-
enum AdditionalConstraint
68+
enum class AdditionalConstraint SIP_MONKEYPATCH_SCOPEENUM : int
6969
{
7070
NoConstraint, //!< No additional constraint
7171
Perpendicular, //!< Perpendicular
7272
Parallel //!< Parallel
7373
};
7474

75+
7576
/**
7677
* \ingroup gui
7778
* \brief The CadConstraint is an abstract class for all basic constraints (angle/distance/x/y).

0 commit comments

Comments
 (0)
Please sign in to comment.