Skip to content

Commit cd5642a

Browse files
committed
[FEATURE] Make the custom dash pattern dialog a style dock widget
1 parent 5a088bf commit cd5642a

File tree

10 files changed

+297
-123
lines changed

10 files changed

+297
-123
lines changed

python/core/auto_generated/qgsunittypes.sip.in

+10
Original file line numberDiff line numberDiff line change
@@ -414,13 +414,23 @@ Decodes a render unit from a string.
414414
.. seealso:: :py:func:`encodeUnit`
415415
%End
416416

417+
417418
static QString toString( QgsUnitTypes::RenderUnit unit );
418419
%Docstring
419420
Returns a translated string representing a render ``unit``.
420421

421422
.. versionadded:: 3.0
422423
%End
423424

425+
static QString toAbbreviatedString( QgsUnitTypes::RenderUnit unit );
426+
%Docstring
427+
Returns a translated abbreviation representing a render unit.
428+
429+
:param unit: unit to convert to string
430+
431+
.. versionadded:: 3.8
432+
%End
433+
424434

425435

426436
static QString encodeUnit( QgsUnitTypes::LayoutUnit unit );

python/gui/auto_generated/symbology/qgsdashspacedialog.sip.in

+47-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,41 @@
88

99

1010

11-
class QgsDashSpaceDialog: QDialog
11+
12+
13+
class QgsDashSpaceWidget: QgsPanelWidget
14+
{
15+
%Docstring
16+
A widget to enter a custom dash space pattern for lines
17+
18+
.. versionadded:: 3.8
19+
%End
20+
21+
%TypeHeaderCode
22+
#include "qgsdashspacedialog.h"
23+
%End
24+
public:
25+
26+
QgsDashSpaceWidget( const QVector<qreal> &vectorPattern, QWidget *parent /TransferThis/ = 0 );
27+
%Docstring
28+
Constructor for QgsDashSpaceWidget
29+
%End
30+
31+
QVector<qreal> dashDotVector() const;
32+
%Docstring
33+
Returns the dash pattern as a list of numbers
34+
%End
35+
36+
void setUnit( QgsUnitTypes::RenderUnit unit );
37+
%Docstring
38+
Sets the unit type used for the dash space pattern (used to update interface labels)
39+
40+
:param unit: the unit type
41+
%End
42+
43+
};
44+
45+
class QgsDashSpaceDialog : QDialog
1246
{
1347
%Docstring
1448
A dialog to enter a custom dash space pattern for lines
@@ -25,6 +59,18 @@ Constructor for QgsDashSpaceDialog
2559
%End
2660

2761
QVector<qreal> dashDotVector() const;
62+
%Docstring
63+
Returns the dash pattern as a list of numbers
64+
%End
65+
66+
void setUnit( QgsUnitTypes::RenderUnit unit );
67+
%Docstring
68+
Sets the unit type used for the dash space pattern (used to update interface labels)
69+
70+
:param unit: the unit type
71+
72+
.. versionadded:: 3.8
73+
%End
2874

2975
};
3076

src/core/qgsunittypes.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,39 @@ QString QgsUnitTypes::toString( DistanceUnit unit )
186186
return QString();
187187
}
188188

189+
QString QgsUnitTypes::toAbbreviatedString( QgsUnitTypes::RenderUnit unit )
190+
{
191+
switch ( unit )
192+
{
193+
case RenderMillimeters:
194+
return QObject::tr( "mm", "render" );
195+
196+
case RenderMapUnits:
197+
return QObject::tr( "map units", "render" );
198+
199+
case RenderPixels:
200+
return QObject::tr( "px", "render" );
201+
202+
case RenderPercentage:
203+
return QObject::tr( "%", "render" );
204+
205+
case RenderPoints:
206+
return QObject::tr( "pt", "render" );
207+
208+
case RenderInches:
209+
return QObject::tr( "in", "render" );
210+
211+
case RenderUnknownUnit:
212+
return QObject::tr( "unknown", "render" );
213+
214+
case RenderMetersInMapUnits:
215+
return QObject::tr( "m", "render" );
216+
217+
}
218+
219+
return QString();
220+
}
221+
189222
QString QgsUnitTypes::toAbbreviatedString( QgsUnitTypes::DistanceUnit unit )
190223
{
191224
switch ( unit )

src/core/qgsunittypes.h

+9
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,21 @@ class CORE_EXPORT QgsUnitTypes
414414
*/
415415
Q_INVOKABLE static QgsUnitTypes::RenderUnit decodeRenderUnit( const QString &string, bool *ok SIP_OUT = nullptr );
416416

417+
417418
/**
418419
* Returns a translated string representing a render \a unit.
419420
* \since QGIS 3.0
420421
*/
421422
static QString toString( QgsUnitTypes::RenderUnit unit );
422423

424+
/**
425+
* Returns a translated abbreviation representing a render unit.
426+
* \param unit unit to convert to string
427+
*
428+
* \since QGIS 3.8
429+
*/
430+
Q_INVOKABLE static QString toAbbreviatedString( QgsUnitTypes::RenderUnit unit );
431+
423432

424433
// LAYOUT UNITS
425434

src/gui/symbology/qgsdashspacedialog.cpp

+41-9
Original file line numberDiff line numberDiff line change
@@ -15,53 +15,59 @@
1515

1616
#include "qgsdashspacedialog.h"
1717
#include "qgsapplication.h"
18+
19+
#include <QDialogButtonBox>
1820
#include <QFile>
1921

20-
QgsDashSpaceDialog::QgsDashSpaceDialog( const QVector<qreal> &v, QWidget *parent, Qt::WindowFlags f ): QDialog( parent, f )
22+
QgsDashSpaceWidget::QgsDashSpaceWidget( const QVector<qreal> &vectorPattern, QWidget *parent ) : QgsPanelWidget( parent )
2123
{
2224
setupUi( this );
23-
connect( mAddButton, &QPushButton::clicked, this, &QgsDashSpaceDialog::mAddButton_clicked );
24-
connect( mRemoveButton, &QPushButton::clicked, this, &QgsDashSpaceDialog::mRemoveButton_clicked );
2525

2626
mAddButton->setIcon( QgsApplication::getThemeIcon( "symbologyAdd.svg" ) );
2727
mRemoveButton->setIcon( QgsApplication::getThemeIcon( "symbologyRemove.svg" ) );
2828

2929
double dash = 0;
3030
double space = 0;
31-
for ( int i = 0; i < ( v.size() - 1 ); ++i )
31+
for ( int i = 0; i < ( vectorPattern.size() - 1 ); ++i )
3232
{
33-
dash = v.at( i );
33+
dash = vectorPattern.at( i );
3434
++i;
35-
space = v.at( i );
35+
space = vectorPattern.at( i );
3636
QTreeWidgetItem *entry = new QTreeWidgetItem();
3737
entry->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled );
3838
entry->setText( 0, QString::number( dash ) );
3939
entry->setText( 1, QString::number( space ) );
4040
mDashSpaceTreeWidget->addTopLevelItem( entry );
4141
}
42+
43+
connect( mAddButton, &QPushButton::clicked, this, &QgsDashSpaceWidget::mAddButton_clicked );
44+
connect( mRemoveButton, &QPushButton::clicked, this, &QgsDashSpaceWidget::mRemoveButton_clicked );
45+
connect( mDashSpaceTreeWidget, &QTreeWidget::itemChanged, this, [ this ] { emit widgetChanged(); } );
4246
}
4347

44-
void QgsDashSpaceDialog::mAddButton_clicked()
48+
void QgsDashSpaceWidget::mAddButton_clicked()
4549
{
4650
//add new (default) item
4751
QTreeWidgetItem *entry = new QTreeWidgetItem();
4852
entry->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled );
4953
entry->setText( 0, QStringLiteral( "5" ) );
5054
entry->setText( 1, QStringLiteral( "2" ) );
5155
mDashSpaceTreeWidget->addTopLevelItem( entry );
56+
emit widgetChanged();
5257
}
5358

54-
void QgsDashSpaceDialog::mRemoveButton_clicked()
59+
void QgsDashSpaceWidget::mRemoveButton_clicked()
5560
{
5661
//get active item
5762
QTreeWidgetItem *currentItem = mDashSpaceTreeWidget->currentItem();
5863
if ( currentItem )
5964
{
6065
mDashSpaceTreeWidget->takeTopLevelItem( mDashSpaceTreeWidget->indexOfTopLevelItem( currentItem ) );
6166
}
67+
emit widgetChanged();
6268
}
6369

64-
QVector<qreal> QgsDashSpaceDialog::dashDotVector() const
70+
QVector<qreal> QgsDashSpaceWidget::dashDotVector() const
6571
{
6672
QVector<qreal> dashVector;
6773
int nTopLevelItems = mDashSpaceTreeWidget->topLevelItemCount();
@@ -76,3 +82,29 @@ QVector<qreal> QgsDashSpaceDialog::dashDotVector() const
7682
return dashVector;
7783
}
7884

85+
void QgsDashSpaceWidget::setUnit( QgsUnitTypes::RenderUnit unit )
86+
{
87+
QTreeWidgetItem *headerItem = mDashSpaceTreeWidget->headerItem();
88+
headerItem->setText( 0, QStringLiteral( "%1 (%2)" ).arg( tr( "Dash" ), QgsUnitTypes::toAbbreviatedString( unit ) ) );
89+
headerItem->setText( 1, QStringLiteral( "%1 (%2)" ).arg( tr( "Space" ), QgsUnitTypes::toAbbreviatedString( unit ) ) );
90+
}
91+
92+
QgsDashSpaceDialog::QgsDashSpaceDialog( const QVector<qreal> &v, QWidget *parent, Qt::WindowFlags f ) : QDialog( parent, f )
93+
{
94+
QVBoxLayout *vLayout = new QVBoxLayout();
95+
mWidget = new QgsDashSpaceWidget( v );
96+
vLayout->addWidget( mWidget );
97+
QDialogButtonBox *bbox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
98+
vLayout->addWidget( bbox );
99+
setLayout( vLayout );
100+
}
101+
102+
QVector<qreal> QgsDashSpaceDialog::dashDotVector() const
103+
{
104+
return mWidget->dashDotVector();
105+
}
106+
107+
void QgsDashSpaceDialog::setUnit( QgsUnitTypes::RenderUnit unit )
108+
{
109+
mWidget->setUnit( unit );
110+
}

src/gui/symbology/qgsdashspacedialog.h

+47-5
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,69 @@
1616
#ifndef QGSDASHSPACEDIALOG_H
1717
#define QGSDASHSPACEDIALOG_H
1818

19-
#include "ui_qgsdashspacedialogbase.h"
19+
#include "ui_qgsdashspacewidgetbase.h"
20+
2021
#include "qgis_gui.h"
2122
#include "qgis_sip.h"
23+
#include "qgspanelwidget.h"
24+
#include "qgsunittypes.h"
25+
26+
#include <QDialog>
2227

2328
/**
2429
* \ingroup gui
25-
* A dialog to enter a custom dash space pattern for lines
30+
* A widget to enter a custom dash space pattern for lines
31+
* \since QGIS 3.8
2632
*/
27-
class GUI_EXPORT QgsDashSpaceDialog: public QDialog, private Ui::QgsDashSpaceDialogBase
33+
class GUI_EXPORT QgsDashSpaceWidget: public QgsPanelWidget, private Ui::QgsDashSpaceWidgetBase
2834
{
2935
Q_OBJECT
3036
public:
3137

32-
//! Constructor for QgsDashSpaceDialog
33-
QgsDashSpaceDialog( const QVector<qreal> &v, QWidget *parent SIP_TRANSFERTHIS = nullptr, Qt::WindowFlags f = nullptr );
38+
//! Constructor for QgsDashSpaceWidget
39+
QgsDashSpaceWidget( const QVector<qreal> &vectorPattern, QWidget *parent SIP_TRANSFERTHIS = nullptr );
3440

41+
//! Returns the dash pattern as a list of numbers
3542
QVector<qreal> dashDotVector() const;
3643

44+
/**
45+
* Sets the unit type used for the dash space pattern (used to update interface labels)
46+
* \param unit the unit type
47+
*/
48+
void setUnit( QgsUnitTypes::RenderUnit unit );
49+
3750
private slots:
3851
void mAddButton_clicked();
3952
void mRemoveButton_clicked();
53+
54+
};
55+
56+
/**
57+
* \ingroup gui
58+
* A dialog to enter a custom dash space pattern for lines
59+
*/
60+
class GUI_EXPORT QgsDashSpaceDialog : public QDialog
61+
{
62+
Q_OBJECT
63+
public:
64+
65+
//! Constructor for QgsDashSpaceDialog
66+
QgsDashSpaceDialog( const QVector<qreal> &v, QWidget *parent SIP_TRANSFERTHIS = nullptr, Qt::WindowFlags f = nullptr );
67+
68+
//! Returns the dash pattern as a list of numbers
69+
QVector<qreal> dashDotVector() const;
70+
71+
/**
72+
* Sets the unit type used for the dash space pattern (used to update interface labels)
73+
* \param unit the unit type
74+
* \since QGIS 3.8
75+
*/
76+
void setUnit( QgsUnitTypes::RenderUnit unit );
77+
78+
private:
79+
80+
QgsDashSpaceWidget *mWidget = nullptr;
81+
4082
};
4183

4284
#endif // QGSDASHSPACEDIALOG_H

src/gui/symbology/qgssymbollayerwidget.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,24 @@ void QgsSimpleLineSymbolLayerWidget::mCustomCheckBox_stateChanged( int state )
364364

365365
void QgsSimpleLineSymbolLayerWidget::mChangePatternButton_clicked()
366366
{
367+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
368+
if ( panel && panel->dockMode() )
369+
{
370+
QgsDashSpaceWidget *widget = new QgsDashSpaceWidget( mLayer->customDashVector(), panel );
371+
widget->setPanelTitle( tr( "Custom Dash Pattern" ) );
372+
widget->setUnit( mDashPatternUnitWidget->unit() );
373+
connect( widget, &QgsPanelWidget::widgetChanged, this, [ this, widget ]()
374+
{
375+
mLayer->setCustomDashVector( widget->dashDotVector() );
376+
updatePatternIcon();
377+
} );
378+
connect( widget, &QgsPanelWidget::widgetChanged, this, &QgsSymbolLayerWidget::changed );
379+
panel->openPanel( widget );
380+
return;
381+
}
382+
367383
QgsDashSpaceDialog d( mLayer->customDashVector() );
384+
d.setUnit( mDashPatternUnitWidget->unit() );
368385
if ( d.exec() == QDialog::Accepted )
369386
{
370387
mLayer->setCustomDashVector( d.dashDotVector() );

0 commit comments

Comments
 (0)