Skip to content

Commit ef35c8b

Browse files
committedMar 31, 2013
Data defined properties for svg marker
1 parent 9acdcb7 commit ef35c8b

File tree

5 files changed

+416
-68
lines changed

5 files changed

+416
-68
lines changed
 

‎src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

Lines changed: 275 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,9 @@ void QgsSimpleMarkerSymbolLayerV2::prepareExpressions( const QgsVectorLayer* vl
895895
//////////
896896

897897

898-
QgsSvgMarkerSymbolLayerV2::QgsSvgMarkerSymbolLayerV2( QString name, double size, double angle )
898+
QgsSvgMarkerSymbolLayerV2::QgsSvgMarkerSymbolLayerV2( QString name, double size, double angle ): mSizeExpression( 0 ),
899+
mOutlineWidthExpression( 0 ), mAngleExpression( 0 ), mOffsetExpression( 0 ), mNameExpression( 0 ), mFillExpression( 0 ),
900+
mOutlineExpression( 0 )
899901
{
900902
mPath = QgsSymbolLayerV2Utils::symbolNameToPath( name );
901903
mSize = size;
@@ -958,6 +960,36 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create( const QgsStringMap& props )
958960
m->setOutlineWidth( props["outline-width"].toDouble() );
959961
if ( props.contains( "outline_width_unit" ) )
960962
m->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["outline_width_unit"] ) );
963+
964+
//data defined properties
965+
if ( props.contains( "size_expression" ) )
966+
{
967+
m->setDataDefinedProperty( "size", props["size_expression"] );
968+
}
969+
if ( props.contains( "outline-width_expression" ) )
970+
{
971+
m->setDataDefinedProperty( "outline-width", props["outline-width_expression"] );
972+
}
973+
if ( props.contains( "angle_expression" ) )
974+
{
975+
m->setDataDefinedProperty( "angle", props["angle_expression"] );
976+
}
977+
if ( props.contains( "offset_expression" ) )
978+
{
979+
m->setDataDefinedProperty( "offset", props["offset_expression"] );
980+
}
981+
if ( props.contains( "name_expression" ) )
982+
{
983+
m->setDataDefinedProperty( "name", props["name_expression"] );
984+
}
985+
if ( props.contains( "fill_expression" ) )
986+
{
987+
m->setDataDefinedProperty( "fill", props["fill_expression"] );
988+
}
989+
if ( props.contains( "outline_expression" ) )
990+
{
991+
m->setDataDefinedProperty( "outline", props["outline_expression"] );
992+
}
961993
return m;
962994
}
963995

@@ -992,6 +1024,7 @@ void QgsSvgMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context )
9921024
{
9931025
mOrigSize = mSize; // save in case the size would be data defined
9941026
Q_UNUSED( context );
1027+
prepareExpressions( context.layer() );
9951028
}
9961029

9971030
void QgsSvgMarkerSymbolLayerV2::stopRender( QgsSymbolV2RenderContext& context )
@@ -1007,7 +1040,12 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
10071040
return;
10081041
}
10091042

1010-
double size = mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit );
1043+
double size = mSize;
1044+
if ( mSizeExpression )
1045+
{
1046+
size = mSizeExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
1047+
}
1048+
size *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit );
10111049
//don't render symbols with size below one or above 10,000 pixels
10121050
if (( int )size < 1 || 10000.0 < size )
10131051
{
@@ -1019,14 +1057,19 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
10191057
double offsetY = mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit );
10201058
QPointF outputOffset( offsetX, offsetY );
10211059

1022-
if ( mAngle )
1023-
outputOffset = _rotatedOffset( outputOffset, mAngle );
1060+
double angle = mAngle;
1061+
if ( mAngleExpression )
1062+
{
1063+
angle = mAngleExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
1064+
}
1065+
if ( angle )
1066+
outputOffset = _rotatedOffset( outputOffset, angle );
10241067
p->translate( point + outputOffset );
10251068

1026-
bool rotated = !doubleNear( mAngle, 0 );
1069+
bool rotated = !doubleNear( angle, 0 );
10271070
bool drawOnScreen = doubleNear( context.renderContext().rasterScaleFactor(), 1.0, 0.1 );
10281071
if ( rotated )
1029-
p->rotate( mAngle );
1072+
p->rotate( angle );
10301073

10311074
bool fitsInCache = true;
10321075
bool usePict = true;
@@ -1102,6 +1145,36 @@ QgsStringMap QgsSvgMarkerSymbolLayerV2::properties() const
11021145
map["outline"] = mOutlineColor.name();
11031146
map["outline-width"] = QString::number( mOutlineWidth );
11041147
map["outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit );
1148+
1149+
//data defined properties
1150+
if ( mSizeExpression )
1151+
{
1152+
map["size_expression"] = mSizeExpression->dump();
1153+
}
1154+
if ( mOutlineWidthExpression )
1155+
{
1156+
map["outline-width_expression"] = mOutlineWidthExpression->dump();
1157+
}
1158+
if ( mAngleExpression )
1159+
{
1160+
map["angle_expression"] = mAngleExpression->dump();
1161+
}
1162+
if ( mOffsetExpression )
1163+
{
1164+
map["offset_expression"] = mOffsetExpression->dump();
1165+
}
1166+
if ( mNameExpression )
1167+
{
1168+
map["name_expression"] = mNameExpression->dump();
1169+
}
1170+
if ( mFillExpression )
1171+
{
1172+
map["fill_expression"] = mFillExpression->dump();
1173+
}
1174+
if ( mOutlineExpression )
1175+
{
1176+
map["outline_expression"] = mOutlineExpression->dump();
1177+
}
11051178
return map;
11061179
}
11071180

@@ -1115,9 +1188,205 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::clone() const
11151188
m->setOffset( mOffset );
11161189
m->setOffsetUnit( mOffsetUnit );
11171190
m->setSizeUnit( mSizeUnit );
1191+
1192+
//data defined properties
1193+
if ( mSizeExpression )
1194+
{
1195+
m->setDataDefinedProperty( "size", mSizeExpression->dump() );
1196+
}
1197+
if ( mOutlineWidthExpression )
1198+
{
1199+
m->setDataDefinedProperty( "outline-width", mOutlineWidthExpression->dump() );
1200+
}
1201+
if ( mAngleExpression )
1202+
{
1203+
m->setDataDefinedProperty( "angle", mAngleExpression->dump() );
1204+
}
1205+
if ( mOffsetExpression )
1206+
{
1207+
m->setDataDefinedProperty( "offset", mOffsetExpression->dump() );
1208+
}
1209+
if ( mNameExpression )
1210+
{
1211+
m->setDataDefinedProperty( "name", mNameExpression->dump() );
1212+
}
1213+
if ( mFillExpression )
1214+
{
1215+
m->setDataDefinedProperty( "fill", mFillExpression->dump() );
1216+
}
1217+
if ( mOutlineExpression )
1218+
{
1219+
m->setDataDefinedProperty( "outline", mOutlineExpression->dump() );
1220+
}
1221+
11181222
return m;
11191223
}
11201224

1225+
const QgsExpression* QgsSvgMarkerSymbolLayerV2::dataDefinedProperty( const QString& property ) const
1226+
{
1227+
if ( property == "size" )
1228+
{
1229+
return mSizeExpression;
1230+
}
1231+
else if ( property == "outline-width" )
1232+
{
1233+
return mOutlineWidthExpression;
1234+
}
1235+
else if ( property == "angle" )
1236+
{
1237+
return mAngleExpression;
1238+
}
1239+
else if ( property == "offset" )
1240+
{
1241+
return mOffsetExpression;
1242+
}
1243+
else if ( property == "name" )
1244+
{
1245+
return mNameExpression;
1246+
}
1247+
else if ( property == "fill" )
1248+
{
1249+
return mFillExpression;
1250+
}
1251+
else if ( property == "outline" )
1252+
{
1253+
return mOutlineExpression;
1254+
}
1255+
return 0;
1256+
}
1257+
1258+
QString QgsSvgMarkerSymbolLayerV2::dataDefinedPropertyString( const QString& property ) const
1259+
{
1260+
const QgsExpression* ex = dataDefinedProperty( property );
1261+
return ( ex ? ex->dump() : QString() );
1262+
}
1263+
1264+
void QgsSvgMarkerSymbolLayerV2::setDataDefinedProperty( const QString& property, const QString& expressionString )
1265+
{
1266+
if ( property == "size" )
1267+
{
1268+
delete mSizeExpression; mSizeExpression = new QgsExpression( expressionString );
1269+
}
1270+
else if ( property == "outline-width" )
1271+
{
1272+
delete mOutlineWidthExpression; mOutlineWidthExpression = new QgsExpression( expressionString );
1273+
}
1274+
else if ( property == "angle" )
1275+
{
1276+
delete mAngleExpression; mAngleExpression = new QgsExpression( expressionString );
1277+
}
1278+
else if ( property == "offset" )
1279+
{
1280+
delete mOffsetExpression; mOffsetExpression = new QgsExpression( expressionString );
1281+
}
1282+
else if ( property == "name" )
1283+
{
1284+
delete mNameExpression; mNameExpression = new QgsExpression( expressionString );
1285+
}
1286+
else if ( property == "fill" )
1287+
{
1288+
delete mFillExpression; mFillExpression = new QgsExpression( expressionString );
1289+
}
1290+
else if ( property == "outline" )
1291+
{
1292+
delete mOutlineExpression; mOutlineExpression = new QgsExpression( expressionString );
1293+
}
1294+
}
1295+
1296+
void QgsSvgMarkerSymbolLayerV2::removeDataDefinedProperty( const QString& property )
1297+
{
1298+
if ( property == "size" )
1299+
{
1300+
delete mSizeExpression; mSizeExpression = 0;
1301+
}
1302+
else if ( property == "outline-width" )
1303+
{
1304+
delete mOutlineWidthExpression; mOutlineWidthExpression = 0;
1305+
}
1306+
else if ( property == "angle" )
1307+
{
1308+
delete mAngleExpression; mAngleExpression = 0;
1309+
}
1310+
else if ( property == "offset" )
1311+
{
1312+
delete mOffsetExpression; mOffsetExpression = 0;
1313+
}
1314+
else if ( property == "name" )
1315+
{
1316+
delete mNameExpression; mNameExpression = 0;
1317+
}
1318+
else if ( property == "fill" )
1319+
{
1320+
delete mFillExpression; mFillExpression = 0;
1321+
}
1322+
else if ( property == "outline" )
1323+
{
1324+
delete mOutlineExpression; mOutlineExpression = 0;
1325+
}
1326+
}
1327+
1328+
void QgsSvgMarkerSymbolLayerV2::removeDataDefinedProperties()
1329+
{
1330+
delete mSizeExpression; mSizeExpression = 0;
1331+
delete mOutlineWidthExpression; mOutlineWidthExpression = 0;
1332+
delete mAngleExpression; mAngleExpression = 0;
1333+
delete mOffsetExpression; mOffsetExpression = 0;
1334+
delete mNameExpression; mNameExpression = 0;
1335+
delete mFillExpression; mFillExpression = 0;
1336+
delete mOutlineExpression; mOutlineExpression = 0;
1337+
}
1338+
1339+
QSet<QString> QgsSvgMarkerSymbolLayerV2::usedAttributes() const
1340+
{
1341+
QSet<QString> attributes;
1342+
1343+
//add data defined attributes
1344+
QStringList columns;
1345+
if ( mSizeExpression )
1346+
columns.append( mSizeExpression->referencedColumns() );
1347+
if ( mOutlineWidthExpression )
1348+
columns.append( mOutlineWidthExpression->referencedColumns() );
1349+
if ( mAngleExpression )
1350+
columns.append( mAngleExpression->referencedColumns() );
1351+
if ( mOffsetExpression )
1352+
columns.append( mOffsetExpression->referencedColumns() );
1353+
if ( mNameExpression )
1354+
columns.append( mNameExpression->referencedColumns() );
1355+
if ( mFillExpression )
1356+
columns.append( mFillExpression->referencedColumns() );
1357+
if ( mOutlineExpression )
1358+
columns.append( mOutlineExpression->referencedColumns() );
1359+
1360+
QStringList::const_iterator it = columns.constBegin();
1361+
for ( ; it != columns.constEnd(); ++it )
1362+
{
1363+
attributes.insert( *it );
1364+
}
1365+
return attributes;
1366+
}
1367+
1368+
void QgsSvgMarkerSymbolLayerV2::prepareExpressions( const QgsVectorLayer* vl )
1369+
{
1370+
if ( !vl )
1371+
{
1372+
return;
1373+
}
1374+
1375+
const QgsFields& fields = vl->pendingFields();
1376+
if ( mSizeExpression )
1377+
mSizeExpression->prepare( fields );
1378+
if ( mOutlineWidthExpression )
1379+
mOutlineWidthExpression->prepare( fields );
1380+
if ( mAngleExpression )
1381+
mAngleExpression->prepare( fields );
1382+
if ( mOffsetExpression )
1383+
mOffsetExpression->prepare( fields );
1384+
if ( mNameExpression )
1385+
mNameExpression->prepare( fields );
1386+
if ( mFillExpression )
1387+
mFillExpression->prepare( fields );
1388+
}
1389+
11211390
void QgsSvgMarkerSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit )
11221391
{
11231392
mSizeUnit = unit;

‎src/core/symbology-ng/qgsmarkersymbollayerv2.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,14 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2
166166
void setOutputUnit( QgsSymbolV2::OutputUnit unit );
167167
QgsSymbolV2::OutputUnit outputUnit() const;
168168

169+
const QgsExpression* dataDefinedProperty( const QString& property ) const;
170+
QString dataDefinedPropertyString( const QString& property ) const;
171+
void setDataDefinedProperty( const QString& property, const QString& expressionString );
172+
void removeDataDefinedProperty( const QString& property );
173+
void removeDataDefinedProperties();
174+
175+
QSet<QString> usedAttributes() const;
176+
169177
protected:
170178
QString mPath;
171179

@@ -176,6 +184,17 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2
176184
double mOutlineWidth;
177185
QgsSymbolV2::OutputUnit mOutlineWidthUnit;
178186
double mOrigSize;
187+
188+
QgsExpression* mSizeExpression;
189+
QgsExpression* mOutlineWidthExpression;
190+
QgsExpression* mAngleExpression;
191+
QgsExpression* mOffsetExpression;
192+
QgsExpression* mNameExpression;
193+
QgsExpression* mFillExpression;
194+
QgsExpression* mOutlineExpression;
195+
196+
private:
197+
void prepareExpressions( const QgsVectorLayer* vl );
179198
};
180199

181200

‎src/gui/symbology-ng/qgssymbollayerv2widget.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,41 @@ void QgsSvgMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged
11331133
emit changed();
11341134
}
11351135

1136+
void QgsSvgMarkerSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
1137+
{
1138+
if ( !mLayer )
1139+
{
1140+
return;
1141+
}
1142+
1143+
QMap<QString, QPair< QString, QString> > dataDefinedProperties;
1144+
dataDefinedProperties.insert( "size", qMakePair( tr( "Size" ), mLayer->dataDefinedPropertyString( "size" ) ) );
1145+
dataDefinedProperties.insert( "outline-width", qMakePair( tr( "Border width" ), mLayer->dataDefinedPropertyString( "outline-width" ) ) );
1146+
dataDefinedProperties.insert( "angle", qMakePair( tr( "Angle" ), mLayer->dataDefinedPropertyString( "angle" ) ) );
1147+
dataDefinedProperties.insert( "offset", qMakePair( tr( "Offset" ), mLayer->dataDefinedPropertyString( "offset" ) ) );
1148+
dataDefinedProperties.insert( "name", qMakePair( tr( "SVG file" ), mLayer->dataDefinedPropertyString( "name" ) ) );
1149+
dataDefinedProperties.insert( "fill", qMakePair( tr( "Color" ), mLayer->dataDefinedPropertyString( "fill" ) ) );
1150+
dataDefinedProperties.insert( "outline", qMakePair( tr( "Border color" ), mLayer->dataDefinedPropertyString( "outline" ) ) );
1151+
1152+
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
1153+
if ( d.exec() == QDialog::Accepted )
1154+
{
1155+
//empty all existing properties first
1156+
mLayer->removeDataDefinedProperties();
1157+
1158+
QMap<QString, QString> properties = d.dataDefinedProperties();
1159+
QMap<QString, QString>::const_iterator it = properties.constBegin();
1160+
for ( ; it != properties.constEnd(); ++it )
1161+
{
1162+
if ( !it.value().isEmpty() )
1163+
{
1164+
mLayer->setDataDefinedProperty( it.key(), it.value() );
1165+
}
1166+
}
1167+
emit changed();
1168+
}
1169+
}
1170+
11361171
///////////////
11371172

11381173
QgsLineDecorationSymbolLayerV2Widget::QgsLineDecorationSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )

‎src/gui/symbology-ng/qgssymbollayerv2widget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget
217217
void on_mSizeUnitComboBox_currentIndexChanged( int index );
218218
void on_mBorderWidthUnitComboBox_currentIndexChanged( int index );
219219
void on_mOffsetUnitComboBox_currentIndexChanged( int index );
220+
void on_mDataDefinedPropertiesButton_clicked();
220221

221222
protected:
222223

‎src/ui/symbollayer/widget_svgmarker.ui

Lines changed: 86 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>364</width>
10-
<height>361</height>
10+
<height>379</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -17,6 +17,77 @@
1717
<property name="margin">
1818
<number>1</number>
1919
</property>
20+
<item row="2" column="1">
21+
<widget class="QLabel" name="label">
22+
<property name="text">
23+
<string>SVG Image</string>
24+
</property>
25+
</widget>
26+
</item>
27+
<item row="5" column="0" colspan="2">
28+
<layout class="QHBoxLayout" name="horizontalLayout_2">
29+
<item>
30+
<widget class="QLineEdit" name="mFileLineEdit"/>
31+
</item>
32+
<item>
33+
<widget class="QToolButton" name="mFileToolButton">
34+
<property name="text">
35+
<string>...</string>
36+
</property>
37+
</widget>
38+
</item>
39+
</layout>
40+
</item>
41+
<item row="2" column="0">
42+
<widget class="QLabel" name="label_5">
43+
<property name="text">
44+
<string>SVG Groups</string>
45+
</property>
46+
</widget>
47+
</item>
48+
<item row="3" column="0">
49+
<widget class="QTreeView" name="viewGroups"/>
50+
</item>
51+
<item row="3" column="1">
52+
<widget class="QListView" name="viewImages">
53+
<property name="editTriggers">
54+
<set>QAbstractItemView::NoEditTriggers</set>
55+
</property>
56+
<property name="iconSize">
57+
<size>
58+
<width>32</width>
59+
<height>32</height>
60+
</size>
61+
</property>
62+
<property name="movement">
63+
<enum>QListView::Static</enum>
64+
</property>
65+
<property name="resizeMode">
66+
<enum>QListView::Adjust</enum>
67+
</property>
68+
<property name="layoutMode">
69+
<enum>QListView::Batched</enum>
70+
</property>
71+
<property name="spacing">
72+
<number>2</number>
73+
</property>
74+
<property name="gridSize">
75+
<size>
76+
<width>36</width>
77+
<height>36</height>
78+
</size>
79+
</property>
80+
<property name="viewMode">
81+
<enum>QListView::IconMode</enum>
82+
</property>
83+
<property name="uniformItemSizes">
84+
<bool>true</bool>
85+
</property>
86+
<property name="wordWrap">
87+
<bool>true</bool>
88+
</property>
89+
</widget>
90+
</item>
2091
<item row="0" column="0" colspan="2">
2192
<layout class="QGridLayout">
2293
<item row="2" column="1">
@@ -215,70 +286,23 @@
215286
</item>
216287
</layout>
217288
</item>
218-
<item row="1" column="0">
219-
<widget class="QLabel" name="label_5">
220-
<property name="text">
221-
<string>SVG Groups</string>
222-
</property>
223-
</widget>
224-
</item>
225-
<item row="1" column="1">
226-
<widget class="QLabel" name="label">
227-
<property name="text">
228-
<string>SVG Image</string>
229-
</property>
230-
</widget>
231-
</item>
232-
<item row="2" column="0">
233-
<widget class="QTreeView" name="viewGroups"/>
234-
</item>
235-
<item row="2" column="1">
236-
<widget class="QListView" name="viewImages">
237-
<property name="editTriggers">
238-
<set>QAbstractItemView::NoEditTriggers</set>
239-
</property>
240-
<property name="iconSize">
241-
<size>
242-
<width>32</width>
243-
<height>32</height>
244-
</size>
245-
</property>
246-
<property name="movement">
247-
<enum>QListView::Static</enum>
248-
</property>
249-
<property name="resizeMode">
250-
<enum>QListView::Adjust</enum>
251-
</property>
252-
<property name="layoutMode">
253-
<enum>QListView::Batched</enum>
254-
</property>
255-
<property name="spacing">
256-
<number>2</number>
257-
</property>
258-
<property name="gridSize">
259-
<size>
260-
<width>36</width>
261-
<height>36</height>
262-
</size>
263-
</property>
264-
<property name="viewMode">
265-
<enum>QListView::IconMode</enum>
266-
</property>
267-
<property name="uniformItemSizes">
268-
<bool>true</bool>
269-
</property>
270-
<property name="wordWrap">
271-
<bool>true</bool>
272-
</property>
273-
</widget>
274-
</item>
275-
<item row="3" column="0" colspan="2">
276-
<layout class="QHBoxLayout" name="horizontalLayout_2">
289+
<item row="4" column="0" colspan="2">
290+
<layout class="QHBoxLayout" name="horizontalLayout_3">
277291
<item>
278-
<widget class="QLineEdit" name="mFileLineEdit"/>
292+
<widget class="QLabel" name="mDataDefinedPropertiesLabel">
293+
<property name="text">
294+
<string>Data defined properties</string>
295+
</property>
296+
</widget>
279297
</item>
280298
<item>
281-
<widget class="QToolButton" name="mFileToolButton">
299+
<widget class="QPushButton" name="mDataDefinedPropertiesButton">
300+
<property name="sizePolicy">
301+
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
302+
<horstretch>0</horstretch>
303+
<verstretch>0</verstretch>
304+
</sizepolicy>
305+
</property>
282306
<property name="text">
283307
<string>...</string>
284308
</property>

0 commit comments

Comments
 (0)
Please sign in to comment.