Skip to content

Commit 4b29b80

Browse files
author
wonder
committedFeb 20, 2011
[FEATURE] Labels for rules in rule-based renderers and some other goodies.
Applied patch #3222 from Mayeul Kauffmann with various modifications. git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@15217 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

6 files changed

+229
-65
lines changed

6 files changed

+229
-65
lines changed
 

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
***************************************************************************/
1515

1616
#include "qgsrulebasedrendererv2.h"
17-
17+
#include "qgssymbollayerv2.h"
1818
#include "qgssearchtreenode.h"
1919
#include "qgssymbollayerv2utils.h"
2020
#include "qgsrendercontext.h"
@@ -28,10 +28,10 @@
2828

2929

3030

31-
QgsRuleBasedRendererV2::Rule::Rule( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp )
31+
QgsRuleBasedRendererV2::Rule::Rule( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description )
3232
: mSymbol( symbol ),
3333
mScaleMinDenom( scaleMinDenom ), mScaleMaxDenom( scaleMaxDenom ),
34-
mFilterExp( filterExp )
34+
mFilterExp( filterExp ), mLabel( label ), mDescription( description )
3535
{
3636
initFilter();
3737
}
@@ -62,8 +62,8 @@ void QgsRuleBasedRendererV2::Rule::initFilter()
6262

6363
QString QgsRuleBasedRendererV2::Rule::dump() const
6464
{
65-
return QString( "RULE - scale [%1,%2] - filter %3 - symbol %4" )
66-
.arg( mScaleMinDenom ).arg( mScaleMaxDenom )
65+
return QString( "RULE %1 - scale [%2,%3] - filter %4 - symbol %5" )
66+
.arg( mLabel ).arg( mScaleMinDenom ).arg( mScaleMaxDenom )
6767
.arg( mFilterExp ).arg( mSymbol->dump() );
6868

6969
}
@@ -107,6 +107,8 @@ QgsRuleBasedRendererV2::Rule& QgsRuleBasedRendererV2::Rule::operator=( const Qgs
107107
mScaleMinDenom = other.mScaleMinDenom;
108108
mScaleMaxDenom = other.mScaleMaxDenom;
109109
mFilterExp = other.mFilterExp;
110+
mLabel = other.mLabel;
111+
mDescription = other.mDescription;
110112
initFilter();
111113
}
112114
return *this;
@@ -233,6 +235,8 @@ QDomElement QgsRuleBasedRendererV2::save( QDomDocument& doc )
233235
ruleElem.setAttribute( "filter", rule.filterExpression() );
234236
ruleElem.setAttribute( "scalemindenom", rule.scaleMinDenom() );
235237
ruleElem.setAttribute( "scalemaxdenom", rule.scaleMaxDenom() );
238+
ruleElem.setAttribute( "label", rule.label() );
239+
ruleElem.setAttribute( "description", rule.description() );
236240
rulesElem.appendChild( ruleElem );
237241
}
238242
rendererElem.appendChild( rulesElem );
@@ -250,7 +254,7 @@ QgsLegendSymbologyList QgsRuleBasedRendererV2::legendSymbologyItems( QSize iconS
250254
for ( QList<Rule>::iterator it = mRules.begin(); it != mRules.end(); ++it )
251255
{
252256
QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( it->symbol(), iconSize );
253-
lst << qMakePair( it->filterExpression(), pix );
257+
lst << qMakePair( it->label(), pix );
254258
}
255259
return lst;
256260
}
@@ -260,7 +264,7 @@ QgsLegendSymbolList QgsRuleBasedRendererV2::legendSymbolItems()
260264
QgsLegendSymbolList lst;
261265
for ( QList<Rule>::iterator it = mRules.begin(); it != mRules.end(); ++it )
262266
{
263-
lst << qMakePair( it->filterExpression(), it->symbol() );
267+
lst << qMakePair( it->label(), it->symbol() );
264268
}
265269
return lst;
266270
}
@@ -292,9 +296,11 @@ QgsFeatureRendererV2* QgsRuleBasedRendererV2::create( QDomElement& element )
292296
if ( symbolMap.contains( symbolIdx ) )
293297
{
294298
QString filterExp = ruleElem.attribute( "filter" );
299+
QString label = ruleElem.attribute( "label" );
300+
QString description = ruleElem.attribute( "description" );
295301
int scaleMinDenom = ruleElem.attribute( "scalemindenom", "0" ).toInt();
296302
int scaleMaxDenom = ruleElem.attribute( "scalemaxdenom", "0" ).toInt();
297-
r->mRules.append( Rule( symbolMap.take( symbolIdx ), scaleMinDenom, scaleMaxDenom, filterExp ) );
303+
r->mRules.append( Rule( symbolMap.take( symbolIdx ), scaleMinDenom, scaleMaxDenom, filterExp, label, description ) );
298304
}
299305
else
300306
{
@@ -350,11 +356,13 @@ QList<QgsRuleBasedRendererV2::Rule> QgsRuleBasedRendererV2::refineRuleCategories
350356
{
351357
QString newfilter = QString( "%1 = '%2'" ).arg( r->classAttribute() ).arg( cat.value().toString() );
352358
QString filter = initialRule.filterExpression();
359+
QString label = initialRule.label();
360+
QString description = initialRule.description();
353361
if ( filter.isEmpty() )
354362
filter = newfilter;
355363
else
356364
filter = QString( "(%1) AND (%2)" ).arg( filter ).arg( newfilter );
357-
rules.append( Rule( cat.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter ) );
365+
rules.append( Rule( cat.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter, initialRule.label(), initialRule.description() ) );
358366
}
359367
return rules;
360368
}
@@ -366,11 +374,13 @@ QList<QgsRuleBasedRendererV2::Rule> QgsRuleBasedRendererV2::refineRuleRanges( Qg
366374
{
367375
QString newfilter = QString( "%1 >= '%2' AND %1 <= '%3'" ).arg( r->classAttribute() ).arg( rng.lowerValue() ).arg( rng.upperValue() );
368376
QString filter = initialRule.filterExpression();
377+
QString label = initialRule.label();
378+
QString description = initialRule.description();
369379
if ( filter.isEmpty() )
370380
filter = newfilter;
371381
else
372382
filter = QString( "(%1) AND (%2)" ).arg( filter ).arg( newfilter );
373-
rules.append( Rule( rng.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter ) );
383+
rules.append( Rule( rng.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter, initialRule.label(), initialRule.description() ) );
374384
}
375385
return rules;
376386
}
@@ -387,10 +397,10 @@ QList<QgsRuleBasedRendererV2::Rule> QgsRuleBasedRendererV2::refineRuleScales( Qg
387397
continue; // jump over the first scales out of the interval
388398
if ( maxDenom != 0 && maxDenom <= scale )
389399
break; // ignore the latter scales out of the interval
390-
rules.append( Rule( initialRule.symbol()->clone(), oldScale, scale, initialRule.filterExpression() ) );
400+
rules.append( Rule( initialRule.symbol()->clone(), oldScale, scale, initialRule.filterExpression(), initialRule.label(), initialRule.description() ) );
391401
oldScale = scale;
392402
}
393403
// last rule
394-
rules.append( Rule( initialRule.symbol()->clone(), oldScale, maxDenom, initialRule.filterExpression() ) );
404+
rules.append( Rule( initialRule.symbol()->clone(), oldScale, maxDenom, initialRule.filterExpression(), initialRule.label(), initialRule.description() ) );
395405
return rules;
396406
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
4444
{
4545
public:
4646
//! Constructor takes ownership of the symbol
47-
Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString() );
47+
Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(), QString label = QString(), QString description = QString() );
4848
Rule( const Rule& other );
4949
~Rule();
5050
QString dump() const;
@@ -57,10 +57,14 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
5757
int scaleMinDenom() const { return mScaleMinDenom; }
5858
int scaleMaxDenom() const { return mScaleMaxDenom; }
5959
QString filterExpression() const { return mFilterExp; }
60+
QString label() const { return mLabel; }
61+
QString description() const { return mDescription; }
6062

6163
void setScaleMinDenom( int scaleMinDenom ) { mScaleMinDenom = scaleMinDenom; }
6264
void setScaleMaxDenom( int scaleMaxDenom ) { mScaleMaxDenom = scaleMaxDenom; }
6365
void setFilterExpression( QString filterExp ) { mFilterExp = filterExp; initFilter(); }
66+
void setLabel( QString label ) { mLabel = label; }
67+
void setDescription( QString description ) { mDescription = description; }
6468

6569
Rule& operator=( const Rule& other );
6670

@@ -70,7 +74,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
7074

7175
QgsSymbolV2* mSymbol;
7276
int mScaleMinDenom, mScaleMaxDenom;
73-
QString mFilterExp;
77+
QString mFilterExp, mLabel, mDescription;
7478

7579
// temporary
7680
QgsSearchString mFilterParsed;
@@ -81,7 +85,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
8185

8286
static QgsFeatureRendererV2* create( QDomElement& element );
8387

84-
//! Constructor. Takes ownership of the defult symbol.
88+
//! Constructor. Takes ownership of the default symbol.
8589
QgsRuleBasedRendererV2( QgsSymbolV2* defaultSymbol );
8690

8791
//! return symbol for current feature. Should not be used individually: there could be more symbols for a feature

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

Lines changed: 113 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ QgsRuleBasedRendererV2Widget::QgsRuleBasedRendererV2Widget( QgsVectorLayer* laye
5757
setupUi( this );
5858

5959
treeRules->setRenderer( mRenderer );
60-
6160
mRefineMenu = new QMenu( btnRefineRule );
6261
mRefineMenu->addAction( tr( "Add scales" ), this, SLOT( refineRuleScales() ) );
6362
mRefineMenu->addAction( tr( "Add categories" ), this, SLOT( refineRuleCategories() ) );
@@ -303,6 +302,8 @@ QgsRendererRulePropsDialog::QgsRendererRulePropsDialog( const QgsRuleBasedRender
303302
setupUi( this );
304303

305304
editFilter->setText( mRule.filterExpression() );
305+
editLabel->setText( mRule.label() );
306+
editDescription->setText( mRule.description() );
306307

307308
if ( mRule.dependsOnScale() )
308309
{
@@ -368,6 +369,8 @@ void QgsRendererRulePropsDialog::testFilter()
368369
void QgsRendererRulePropsDialog::updateRuleFromGui()
369370
{
370371
mRule.setFilterExpression( editFilter->text() );
372+
mRule.setLabel( editLabel->text() );
373+
mRule.setDescription( editDescription->text() );
371374
mRule.setScaleMinDenom( groupScale->isChecked() ? spinMinScale->value() : 0 );
372375
mRule.setScaleMaxDenom( groupScale->isChecked() ? spinMaxScale->value() : 0 );
373376
}
@@ -377,6 +380,9 @@ void QgsRendererRulePropsDialog::updateRuleFromGui()
377380
QgsRendererRulesTreeWidget::QgsRendererRulesTreeWidget( QWidget* parent )
378381
: QTreeWidget( parent ), mR( NULL ), mGrouping( NoGrouping )
379382
{
383+
mLongestMinDenom = 0;
384+
mLongestMaxDenom = 0;
385+
380386
setSelectionMode( QAbstractItemView::SingleSelection );
381387
/*
382388
setDragEnabled(true);
@@ -401,54 +407,100 @@ void QgsRendererRulesTreeWidget::setGrouping( Grouping g )
401407
QString QgsRendererRulesTreeWidget::formatScaleRange( int minDenom, int maxDenom )
402408
{
403409
if ( maxDenom != 0 )
404-
return QString( "<1:%1, 1:%2>" ).arg( minDenom ).arg( maxDenom );
410+
return QString( "<1:%L1, 1:%L2>" ).arg( minDenom ).arg( maxDenom );
405411
else
406-
return QString( "<1:%1, 1:inf>" ).arg( minDenom );
412+
return QString( "<1:%L1, 1:inf>" ).arg( minDenom );
413+
407414
}
408415

416+
QString QgsRendererRulesTreeWidget::formatScale( int denom, int size )
417+
{
418+
if ( denom != 0 )
419+
{
420+
QString txt = QString( "1:%L1" ).arg( denom );
421+
if ( size > 0 )
422+
txt.prepend( QString( size - txt.count(), QChar( ' ' ) ) );
423+
return txt;
424+
}
425+
else
426+
return QString();
427+
}
409428

429+
#include "qgslogger.h"
410430
void QgsRendererRulesTreeWidget::populateRules()
411431
{
412432
if ( !mR ) return;
413433

414434
clear();
435+
436+
mLongestMinDenom = 0;
437+
mLongestMaxDenom = 0;
438+
// find longest scale string for future padding
439+
// TODO: use a custom model and implement custom sorting
440+
for ( int i = 0; i < mR->ruleCount(); ++i )
441+
{
442+
QgsRuleBasedRendererV2::Rule& rule = mR->ruleAt( i );
443+
444+
mLongestMinDenom = qMax( mLongestMinDenom, formatScale( rule.scaleMinDenom() ).size() );
445+
mLongestMaxDenom = qMax( mLongestMaxDenom, formatScale( rule.scaleMaxDenom() ).size() );
446+
}
447+
448+
449+
415450
if ( mGrouping == NoGrouping )
416451
populateRulesNoGrouping();
417452
else if ( mGrouping == GroupingByScale )
418453
populateRulesGroupByScale();
419454
else
420455
populateRulesGroupByFilter();
456+
457+
setColumnWidth( 1, 200 ); // make the column for filter a bit bigger
421458
}
422459

423460
void QgsRendererRulesTreeWidget::populateRulesNoGrouping()
424461
{
425462
QList<QTreeWidgetItem *> lst;
463+
426464
for ( int i = 0; i < mR->ruleCount(); ++i )
427465
{
428466
QgsRuleBasedRendererV2::Rule& rule = mR->ruleAt( i );
429467

430468
QTreeWidgetItem* item = new QTreeWidgetItem;
431-
QString txt = rule.filterExpression();
432-
if ( txt.isEmpty() ) txt = tr( "(no filter)" );
469+
470+
QString txtLabel = rule.label();
471+
item->setText( 0, txtLabel );
472+
item->setData( 0, Qt::UserRole + 1, i );
473+
item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) );
474+
475+
QString txtRule = rule.filterExpression();
476+
if ( txtRule.isEmpty() ) txtRule = tr( "(no filter)" );
477+
item->setText( 1, txtRule );
478+
433479
if ( rule.dependsOnScale() )
434480
{
435-
txt += tr( ", scale " ) + formatScaleRange( rule.scaleMinDenom(), rule.scaleMaxDenom() );
481+
item->setText( 2, formatScale( rule.scaleMinDenom(), mLongestMinDenom ) );
482+
item->setText( 3, formatScale( rule.scaleMaxDenom(), mLongestMaxDenom ) );
483+
item->setTextAlignment( 2, Qt::AlignRight );
484+
item->setTextAlignment( 3, Qt::AlignRight );
436485
}
437486

438-
item->setText( 0, txt );
439-
item->setData( 0, Qt::UserRole + 1, i );
440-
item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) );
487+
//item->setBackground( 1, Qt::lightGray );
488+
//item->setBackground( 3, Qt::lightGray );
441489

442490
lst << item;
443491
}
444492

493+
445494
addTopLevelItems( lst );
446495
}
447496

448497
void QgsRendererRulesTreeWidget::populateRulesGroupByScale()
449498
{
450499
QMap< QPair<int, int>, QTreeWidgetItem*> scale_items;
451500

501+
QFont italicFont;
502+
italicFont.setItalic( true );
503+
452504
for ( int i = 0; i < mR->ruleCount(); ++i )
453505
{
454506
QgsRuleBasedRendererV2::Rule& rule = mR->ruleAt( i );
@@ -466,15 +518,38 @@ void QgsRendererRulesTreeWidget::populateRulesGroupByScale()
466518
scale_item->setText( 0, txt );
467519
scale_item->setData( 0, Qt::UserRole + 1, -2 );
468520
scale_item->setFlags( scale_item->flags() & ~Qt::ItemIsDragEnabled ); // groups cannot be dragged
521+
scale_item->setFont( 0, italicFont );
469522
scale_items[scale] = scale_item;
523+
// need to add the item before setFirstColumnSpanned,
524+
// see http://qt.nokia.com/developer/task-tracker/index_html?method=entry&id=214686
525+
addTopLevelItem( scale_item );
526+
scale_item->setFirstColumnSpanned( true );
470527
}
471528

472529
QString filter = rule.filterExpression();
473530

474531
QTreeWidgetItem* item = new QTreeWidgetItem( scale_items[scale] );
475-
item->setText( 0, filter.isEmpty() ? tr( "(no filter)" ) : filter );
532+
533+
QString txtLabel = rule.label();
534+
item->setText( 0, txtLabel );
476535
item->setData( 0, Qt::UserRole + 1, i );
477536
item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) );
537+
538+
QString txtRule = rule.filterExpression();
539+
if ( txtRule.isEmpty() ) txtRule = tr( "(no filter)" );
540+
item->setText( 1, txtRule );
541+
542+
if ( rule.dependsOnScale() )
543+
{
544+
// Displaying scales is redundant here, but keeping them allows to keep constant the layout and width of all columns when switching to one of the two other views
545+
item->setText( 2, formatScale( rule.scaleMinDenom(), mLongestMinDenom ) );
546+
item->setText( 3, formatScale( rule.scaleMaxDenom(), mLongestMaxDenom ) );
547+
item->setTextAlignment( 2, Qt::AlignRight );
548+
item->setTextAlignment( 3, Qt::AlignRight );
549+
}
550+
551+
//item->setBackground( 1, Qt::lightGray );
552+
//item->setBackground( 3, Qt::lightGray );
478553
}
479554
addTopLevelItems( scale_items.values() );
480555
}
@@ -483,6 +558,9 @@ void QgsRendererRulesTreeWidget::populateRulesGroupByFilter()
483558
{
484559
QMap<QString, QTreeWidgetItem *> filter_items;
485560

561+
QFont italicFont;
562+
italicFont.setItalic( true );
563+
486564
for ( int i = 0; i < mR->ruleCount(); ++i )
487565
{
488566
QgsRuleBasedRendererV2::Rule& rule = mR->ruleAt( i );
@@ -494,20 +572,38 @@ void QgsRendererRulesTreeWidget::populateRulesGroupByFilter()
494572
filter_item->setText( 0, filter.isEmpty() ? tr( "(no filter)" ) : filter );
495573
filter_item->setData( 0, Qt::UserRole + 1, -1 );
496574
filter_item->setFlags( filter_item->flags() & ~Qt::ItemIsDragEnabled ); // groups cannot be dragged
575+
filter_item->setFont( 0, italicFont );
497576
filter_items[filter] = filter_item;
577+
// need to add the item before setFirstColumnSpanned,
578+
// see http://qt.nokia.com/developer/task-tracker/index_html?method=entry&id=214686
579+
addTopLevelItem( filter_item );
580+
filter_item->setFirstColumnSpanned( true );
498581
}
499582

500-
QString txt;
501-
if ( rule.dependsOnScale() )
502-
txt = QString( "scale <1:%1, 1:%2>" ).arg( rule.scaleMinDenom() ).arg( rule.scaleMaxDenom() );
503-
else
504-
txt = "any scale";
505-
506583
QTreeWidgetItem* item = new QTreeWidgetItem( filter_items[filter] );
507-
item->setText( 0, txt );
584+
585+
QString txtLabel = rule.label();
586+
item->setText( 0, txtLabel );
508587
item->setData( 0, Qt::UserRole + 1, i );
509588
item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) );
510589

590+
// Displaying filter is redundant here, but keeping it allows to keep constant the layout and width of all columns when switching to one of the two other views
591+
item->setText( 1, filter );
592+
593+
// Makes table layout slightly more readable when filters are long strings
594+
//item->setBackground( 1, Qt::lightGray );
595+
//item->setBackground( 3, Qt::lightGray );
596+
597+
if ( rule.dependsOnScale() )
598+
{
599+
item->setText( 2, formatScale( rule.scaleMinDenom(), mLongestMinDenom ) );
600+
item->setText( 3, formatScale( rule.scaleMaxDenom(), mLongestMaxDenom ) );
601+
item->setTextAlignment( 2, Qt::AlignRight );
602+
item->setTextAlignment( 3, Qt::AlignRight );
603+
}
511604
}
605+
512606
addTopLevelItems( filter_items.values() );
607+
608+
513609
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,13 @@ class GUI_EXPORT QgsRendererRulesTreeWidget : public QTreeWidget
4747

4848
QString formatScaleRange( int minDenom, int maxDenom );
4949

50+
QString formatScale( int denom, int size = 0 );
51+
5052
QgsRuleBasedRendererV2* mR;
5153
Grouping mGrouping;
54+
55+
int mLongestMinDenom;
56+
int mLongestMaxDenom;
5257
};
5358

5459
///////

‎src/ui/qgsrendererrulepropsdialogbase.ui

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>545</width>
9+
<width>558</width>
1010
<height>298</height>
1111
</rect>
1212
</property>
@@ -15,40 +15,61 @@
1515
</property>
1616
<layout class="QVBoxLayout" name="verticalLayout">
1717
<item>
18-
<layout class="QHBoxLayout" name="horizontalLayout">
19-
<property name="rightMargin">
20-
<number>0</number>
21-
</property>
22-
<item>
18+
<layout class="QFormLayout" name="formLayout">
19+
<item row="0" column="0">
2320
<widget class="QLabel" name="label">
2421
<property name="text">
25-
<string>Filter</string>
22+
<string>Label</string>
2623
</property>
2724
</widget>
2825
</item>
29-
<item>
30-
<widget class="QLineEdit" name="editFilter"/>
26+
<item row="0" column="1">
27+
<widget class="QLineEdit" name="editLabel"/>
3128
</item>
32-
<item>
33-
<widget class="QPushButton" name="btnExpressionBuilder">
34-
<property name="sizePolicy">
35-
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
36-
<horstretch>0</horstretch>
37-
<verstretch>0</verstretch>
38-
</sizepolicy>
39-
</property>
29+
<item row="1" column="0">
30+
<widget class="QLabel" name="label">
4031
<property name="text">
41-
<string>...</string>
32+
<string>Filter</string>
4233
</property>
4334
</widget>
4435
</item>
45-
<item>
46-
<widget class="QPushButton" name="btnTestFilter">
36+
<item row="1" column="1">
37+
<layout class="QHBoxLayout" name="horizontalLayout">
38+
<item>
39+
<widget class="QLineEdit" name="editFilter"/>
40+
</item>
41+
<item>
42+
<widget class="QPushButton" name="btnExpressionBuilder">
43+
<property name="sizePolicy">
44+
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
45+
<horstretch>0</horstretch>
46+
<verstretch>0</verstretch>
47+
</sizepolicy>
48+
</property>
49+
<property name="text">
50+
<string>...</string>
51+
</property>
52+
</widget>
53+
</item>
54+
<item>
55+
<widget class="QPushButton" name="btnTestFilter">
56+
<property name="text">
57+
<string>Test</string>
58+
</property>
59+
</widget>
60+
</item>
61+
</layout>
62+
</item>
63+
<item row="2" column="0">
64+
<widget class="QLabel" name="label_4">
4765
<property name="text">
48-
<string>Test</string>
66+
<string>Description</string>
4967
</property>
5068
</widget>
5169
</item>
70+
<item row="2" column="1">
71+
<widget class="QLineEdit" name="editDescription"/>
72+
</item>
5273
</layout>
5374
</item>
5475
<item>
@@ -149,6 +170,17 @@
149170
</item>
150171
</layout>
151172
</widget>
173+
<tabstops>
174+
<tabstop>editLabel</tabstop>
175+
<tabstop>editFilter</tabstop>
176+
<tabstop>btnExpressionBuilder</tabstop>
177+
<tabstop>btnTestFilter</tabstop>
178+
<tabstop>editDescription</tabstop>
179+
<tabstop>groupScale</tabstop>
180+
<tabstop>spinMinScale</tabstop>
181+
<tabstop>spinMaxScale</tabstop>
182+
<tabstop>buttonBox</tabstop>
183+
</tabstops>
152184
<resources/>
153185
<connections>
154186
<connection>

‎src/ui/qgsrulebasedrendererv2widget.ui

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,54 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>460</width>
10-
<height>221</height>
9+
<width>622</width>
10+
<height>273</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
1414
<string>Form</string>
1515
</property>
1616
<layout class="QGridLayout" name="gridLayout">
1717
<item row="0" column="0">
18-
<widget class="QLabel" name="label">
19-
<property name="text">
20-
<string>Rules</string>
21-
</property>
22-
</widget>
23-
</item>
24-
<item row="1" column="0">
2518
<widget class="QgsRendererRulesTreeWidget" name="treeRules">
2619
<property name="rootIsDecorated">
2720
<bool>false</bool>
2821
</property>
29-
<property name="headerHidden">
22+
<property name="sortingEnabled">
3023
<bool>true</bool>
3124
</property>
25+
<property name="headerHidden">
26+
<bool>false</bool>
27+
</property>
28+
<column>
29+
<property name="text">
30+
<string>Label</string>
31+
</property>
32+
</column>
3233
<column>
3334
<property name="text">
3435
<string>Rule</string>
3536
</property>
3637
</column>
38+
<column>
39+
<property name="text">
40+
<string>Min. scale</string>
41+
</property>
42+
<property name="textAlignment">
43+
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
44+
</property>
45+
</column>
46+
<column>
47+
<property name="text">
48+
<string>Max. scale</string>
49+
</property>
50+
<property name="textAlignment">
51+
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
52+
</property>
53+
</column>
3754
</widget>
3855
</item>
39-
<item row="1" column="1">
56+
<item row="0" column="1">
4057
<layout class="QVBoxLayout" name="verticalLayout">
4158
<item>
4259
<widget class="QPushButton" name="btnAddRule">
@@ -68,7 +85,7 @@
6885
</item>
6986
</layout>
7087
</item>
71-
<item row="2" column="0" colspan="2">
88+
<item row="1" column="0" colspan="2">
7289
<widget class="QGroupBox" name="groupBox">
7390
<property name="title">
7491
<string>Rule grouping</string>

0 commit comments

Comments
 (0)
Please sign in to comment.