Skip to content

Commit 28aa735

Browse files
committed
Rule-based renderer: fixed parent(), fixed drag'n'drop
1 parent 63d6a0a commit 28aa735

File tree

4 files changed

+44
-20
lines changed

4 files changed

+44
-20
lines changed

src/core/symbology-ng/qgsrulebasedrendererv2.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,19 @@ void QgsRuleBasedRendererV2::Rule::initFilter()
5858
}
5959
}
6060

61-
QString QgsRuleBasedRendererV2::Rule::dump() const
61+
QString QgsRuleBasedRendererV2::Rule::dump( int offset ) const
6262
{
63+
QString off;
64+
off.fill( QChar( ' ' ), offset );
6365
QString symbolDump = ( mSymbol ? mSymbol->dump() : QString( "[]" ) );
64-
QString msg = QString( "RULE %1 - scale [%2,%3] - filter %4 - symbol %5\n" )
66+
QString msg = off + QString( "RULE %1 - scale [%2,%3] - filter %4 - symbol %5\n" )
6567
.arg( mLabel ).arg( mScaleMinDenom ).arg( mScaleMaxDenom )
6668
.arg( mFilterExp ).arg( symbolDump );
6769

6870
QStringList lst;
6971
foreach( Rule* rule, mChildren )
7072
{
71-
lst.append( "- " + rule->dump() );
73+
lst.append( rule->dump( offset + 2 ) );
7274
}
7375
msg += lst.join( "\n" );
7476
return msg;

src/core/symbology-ng/qgsrulebasedrendererv2.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
7777
QString label = QString(), QString description = QString() );
7878
//Rule( const Rule& other );
7979
~Rule();
80-
QString dump() const;
80+
QString dump( int offset = 0 ) const;
8181
QSet<QString> usedAttributes();
8282
QgsSymbolV2List symbols();
8383
QgsLegendSymbolList legendSymbolItems();
@@ -129,8 +129,12 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
129129
void insertChild( int i, Rule* rule ) { mChildren.insert( i, rule ); rule->mParent = this; }
130130
//! delete child rule
131131
void removeChild( Rule* rule ) { mChildren.removeAll( rule ); delete rule; }
132+
//! delete child rule
133+
void removeChildAt( int i ) { Rule* rule = mChildren[i]; mChildren.removeAt( i ); delete rule; }
132134
//! take child rule out, set parent as null
133135
void takeChild( Rule* rule ) { mChildren.removeAll( rule ); rule->mParent = NULL; }
136+
//! take child rule out, set parent as null
137+
Rule* takeChildAt( int i ) { Rule* rule = mChildren.takeAt( i ); rule->mParent = NULL; return rule; }
134138

135139
protected:
136140

src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp

+28-16
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include <QVBoxLayout>
3131
#include <QMessageBox>
3232

33+
//#include "modeltest.h"
34+
3335
QgsRendererV2Widget* QgsRuleBasedRendererV2Widget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
3436
{
3537
return new QgsRuleBasedRendererV2Widget( layer, style, renderer );
@@ -59,6 +61,7 @@ QgsRuleBasedRendererV2Widget::QgsRuleBasedRendererV2Widget( QgsVectorLayer* laye
5961
setupUi( this );
6062

6163
mModel = new QgsRuleBasedRendererV2Model( mRenderer );
64+
//new ModelTest( mModel, this ); // for model validity checking
6265
viewRules->setModel( mModel );
6366

6467
mRefineMenu = new QMenu( btnRefineRule );
@@ -152,8 +155,10 @@ void QgsRuleBasedRendererV2Widget::editRule( const QModelIndex& index )
152155
void QgsRuleBasedRendererV2Widget::removeRule()
153156
{
154157
QItemSelection sel = viewRules->selectionModel()->selection();
158+
QgsDebugMsg( QString("REMOVE RULES!!! ranges: %1").arg( sel.count()) );
155159
foreach( QItemSelectionRange range, sel )
156160
{
161+
QgsDebugMsg( QString( "RANGE: r %1 - %2").arg(range.top()).arg(range.bottom()) );
157162
if ( range.isValid() )
158163
mModel->removeRows( range.top(), range.bottom() - range.top() + 1, range.parent() );
159164
}
@@ -471,9 +476,12 @@ Qt::ItemFlags QgsRuleBasedRendererV2Model::flags( const QModelIndex &index ) con
471476
if ( !index.isValid() )
472477
return Qt::ItemIsDropEnabled;
473478

479+
// allow drop only at first column
480+
Qt::ItemFlag drop = (index.column() == 0 ? Qt::ItemIsDropEnabled : Qt::NoItemFlags);
481+
474482
return Qt::ItemIsEnabled | Qt::ItemIsSelectable |
475483
Qt::ItemIsEditable |
476-
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
484+
Qt::ItemIsDragEnabled | drop;
477485
}
478486

479487
QVariant QgsRuleBasedRendererV2Model::data( const QModelIndex &index, int role ) const
@@ -545,16 +553,13 @@ int QgsRuleBasedRendererV2Model::columnCount( const QModelIndex & ) const
545553

546554
QModelIndex QgsRuleBasedRendererV2Model::index( int row, int column, const QModelIndex &parent ) const
547555
{
548-
if ( !hasIndex( row, column, parent ) )
549-
return QModelIndex();
550-
551-
QgsRuleBasedRendererV2::Rule* parentRule = ruleForIndex( parent );
552-
553-
QgsRuleBasedRendererV2::Rule* childRule = parentRule->children()[row];
554-
if ( childRule )
556+
if ( hasIndex( row, column, parent ) )
557+
{
558+
QgsRuleBasedRendererV2::Rule* parentRule = ruleForIndex( parent );
559+
QgsRuleBasedRendererV2::Rule* childRule = parentRule->children()[row];
555560
return createIndex( row, column, childRule );
556-
else
557-
return QModelIndex();
561+
}
562+
return QModelIndex();
558563
}
559564

560565
QModelIndex QgsRuleBasedRendererV2Model::parent( const QModelIndex &index ) const
@@ -568,7 +573,8 @@ QModelIndex QgsRuleBasedRendererV2Model::parent( const QModelIndex &index ) cons
568573
if ( parentRule == mR->rootRule() )
569574
return QModelIndex();
570575

571-
int row = parentRule->children().indexOf( childRule );
576+
// this is right: we need to know row number of our parent (in our grandparent)
577+
int row = parentRule->parent()->children().indexOf( parentRule );
572578

573579
return createIndex( row, 0, parentRule );
574580
}
@@ -654,7 +660,7 @@ bool QgsRuleBasedRendererV2Model::dropMimeData( const QMimeData *data,
654660
if ( !data->hasFormat( "application/vnd.text.list" ) )
655661
return false;
656662

657-
if ( column > 0 )
663+
if ( parent.column() > 0 )
658664
return false;
659665

660666
QByteArray encodedData = data->data( "application/vnd.text.list" );
@@ -708,15 +714,21 @@ bool QgsRuleBasedRendererV2Model::removeRows( int row, int count, const QModelIn
708714

709715
QgsDebugMsg( QString( "Called: row %1 count %2 parent ~~%3~~" ).arg( row ).arg( count ).arg( parentRule->dump() ) );
710716

711-
emit beginRemoveRows( parent, row, row + count - 1 );
717+
beginRemoveRows( parent, row, row + count - 1 );
712718

713719
for ( int i = 0; i < count; i++ )
714720
{
715-
QgsRuleBasedRendererV2::Rule* r = parentRule->children()[row];
716-
parentRule->removeChild( r );
721+
if ( row < parentRule->children().count() )
722+
{
723+
//QgsRuleBasedRendererV2::Rule* r = parentRule->children()[row];
724+
parentRule->removeChildAt( row );
725+
//parentRule->takeChildAt( row );
726+
}
727+
else
728+
QgsDebugMsg( "trying to remove invalid index - this should not happen!" );
717729
}
718730

719-
emit endRemoveRows();
731+
endRemoveRows();
720732

721733
return true;
722734
}

src/ui/qgsrulebasedrendererv2widget.ui

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
<property name="acceptDrops">
2020
<bool>true</bool>
2121
</property>
22+
<property name="editTriggers">
23+
<set>QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
24+
</property>
2225
<property name="dragEnabled">
2326
<bool>true</bool>
2427
</property>
@@ -28,6 +31,9 @@
2831
<property name="selectionMode">
2932
<enum>QAbstractItemView::ExtendedSelection</enum>
3033
</property>
34+
<property name="allColumnsShowFocus">
35+
<bool>true</bool>
36+
</property>
3137
</widget>
3238
</item>
3339
<item>

0 commit comments

Comments
 (0)