9 changes: 7 additions & 2 deletions src/core/symbology-ng/qgsrendererv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,10 @@ class CORE_EXPORT QgsFeatureRendererV2

QString type() const { return mType; }

// to be overridden
/** to be overridden
* @param feature feature
* @return returns pointer to symbol or 0 if symbol was not found
*/
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ) = 0;

virtual void startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ) = 0;
Expand All @@ -97,7 +100,9 @@ class CORE_EXPORT QgsFeatureRendererV2
{
SymbolLevels = 1, // rendering with symbol levels (i.e. implements symbols(), symbolForFeature())
RotationField = 1 << 1, // rotate symbols by attribute value
MoreSymbolsPerFeature = 1 << 2 // may use more than one symbol to render a feature: symbolsForFeature() will return them
MoreSymbolsPerFeature = 1 << 2, // may use more than one symbol to render a feature: symbolsForFeature() will return them
Filter = 1 << 3, // features may be filtered, i.e. some features may not be rendered (categorized, rule based ...)
ScaleDependent = 1 << 4 // dependends on scale if feature will be rendered (rule based )
};

//! returns bitwise OR-ed capabilities of the renderer
Expand Down
2 changes: 2 additions & 0 deletions src/core/symbology-ng/qgsrulebasedrendererv2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ bool QgsRuleBasedRendererV2::Rule::isFilterOK( QgsFeature& f ) const

bool QgsRuleBasedRendererV2::Rule::isScaleOK( double scale ) const
{
if ( scale == 0 ) // so that we can count features in classes without scale context
return true;
if ( mScaleMinDenom == 0 && mScaleMaxDenom == 0 )
return true;
if ( mScaleMinDenom != 0 && mScaleMinDenom > scale )
Expand Down
2 changes: 1 addition & 1 deletion src/core/symbology-ng/qgsrulebasedrendererv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2

//! returns bitwise OR-ed capabilities of the renderer
//! \note added in 2.0
virtual int capabilities() { return MoreSymbolsPerFeature; }
virtual int capabilities() { return MoreSymbolsPerFeature | Filter | ScaleDependent; }

/////

Expand Down
92 changes: 81 additions & 11 deletions src/gui/attributetable/qgsattributetablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "qgslogger.h"
#include "qgsattributeaction.h"
#include "qgsmapcanvas.h"
#include "qgsrendererv2.h"

#include <QtGui>
#include <QVariant>
Expand All @@ -44,7 +45,9 @@ QgsAttributeTableModel::QgsAttributeTableModel( QgsMapCanvas *canvas, QgsVectorL
connect( mLayer, SIGNAL( attributeAdded( int ) ), this, SLOT( attributeAdded( int ) ) );
connect( mLayer, SIGNAL( attributeDeleted( int ) ), this, SLOT( attributeDeleted( int ) ) );

connect( mLayer, SIGNAL( repaintRequested() ), this, SLOT( layerRepaintRequested() ) );
connect( mCanvas, SIGNAL( extentsChanged() ), this, SLOT( extentsChanged() ) );

extentsChanged();
}

Expand Down Expand Up @@ -289,21 +292,66 @@ void QgsAttributeTableModel::loadLayer()
rect = mCurrentExtent;
}

mLayer->select( QgsAttributeList(), rect, false );

QgsFeature f;
for ( i = 0; mLayer->nextFeature( f ); ++i )
QgsFeatureRendererV2* renderer = mLayer->rendererV2();
if ( !renderer )
{
QgsDebugMsg( "Cannot get renderer" );
}
else if ( mLayer->hasScaleBasedVisibility() &&
( mLayer->minimumScale() > mCanvas->mapRenderer()->scale() ||
mLayer->maximumScale() <= mCanvas->mapRenderer()->scale() ) )
{
featureAdded( f.id() );
QgsDebugMsg( "Out of scale limits" );
}
else
{
QgsRenderContext renderContext;
if ( renderer->capabilities() & QgsFeatureRendererV2::ScaleDependent )
{
// setup scale
// mapRenderer()->renderContext()->scale is not automaticaly updated when
// render extent changes (because it's scale is used to identify if changed
// since last render) -> use local context
renderContext.setExtent( mCanvas->mapRenderer()->rendererContext()->extent() );
renderContext.setMapToPixel( mCanvas->mapRenderer()->rendererContext()->mapToPixel() );
renderContext.setRendererScale( mCanvas->mapRenderer()->scale() );
renderer->startRender( renderContext, mLayer );
}

if ( t.elapsed() > 5000 )
bool filter = renderer->capabilities() & QgsFeatureRendererV2::Filter;

QgsAttributeList attributeList = QgsAttributeList();
if ( filter )
{
bool cancel = false;
emit progress( i, cancel );
if ( cancel )
break;
QList<QString> attributeNameList = renderer->usedAttributes();
foreach ( QString attributeName, attributeNameList )
{
attributeList.append( mLayer->fieldNameIndex( attributeName ) );
}
}
mLayer->select( attributeList, rect, false );

t.restart();
QgsFeature f;
for ( i = 0; mLayer->nextFeature( f ); ++i )
{
if ( !filter || renderer->willRenderFeature( f ) )
{
featureAdded( f.id() );
}

if ( t.elapsed() > 5000 )
{
bool cancel = false;
emit progress( i, cancel );
if ( cancel )
break;

t.restart();
}
}
if ( renderer->capabilities() & QgsFeatureRendererV2::ScaleDependent )
{
renderer->stopRender( renderContext );
}
}
emit finished();
Expand Down Expand Up @@ -612,5 +660,27 @@ QgsFeature QgsAttributeTableModel::feature( const QModelIndex &idx ) const

void QgsAttributeTableModel::extentsChanged()
{
QgsDebugMsg( "Entered" );
mCurrentExtent = mCanvas->mapRenderer()->mapToLayerCoordinates( mLayer, mCanvas->extent() );

QSettings settings;
int behaviour = settings.value( "/qgis/attributeTableBehaviour", 0 ).toInt();
if ( behaviour == 2 ) // features in current canvas
{
loadLayer();
}
}

void QgsAttributeTableModel::layerRepaintRequested()
{
QgsDebugMsg( "Entered" );
// Added to reload table if properties changed and so some features could become invisible
// TODO: in theory we need to reload table only if previous or new renderer
// capabilities are ScaleDependent or Filter
QSettings settings;
int behaviour = settings.value( "/qgis/attributeTableBehaviour", 0 ).toInt();
if ( behaviour == 2 ) // features in current canvas
{
loadLayer();
}
}
2 changes: 2 additions & 0 deletions src/gui/attributetable/qgsattributetablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ class GUI_EXPORT QgsAttributeTableModel: public QAbstractTableModel
public slots:
void extentsChanged();

void layerRepaintRequested();

private slots:
/**
* Launched when attribute has been added
Expand Down
82 changes: 67 additions & 15 deletions src/ui/qgsrasterlayerpropertiesbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>652</width>
<width>797</width>
<height>515</height>
</rect>
</property>
Expand Down Expand Up @@ -34,7 +34,7 @@
<item row="0" column="0" colspan="4">
<widget class="QTabWidget" name="tabBar">
<property name="currentIndex">
<number>0</number>
<number>2</number>
</property>
<property name="iconSize">
<size>
Expand Down Expand Up @@ -622,31 +622,83 @@
<property name="margin">
<number>11</number>
</property>
<item row="0" column="2">
<widget class="QLabel" name="textLabel1_2_2_2">
<item row="0" column="0">
<widget class="QLabel" name="textLabel1_3">
<property name="toolTip">
<string>MInimum scale denominator.</string>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
<enum>Qt::LeftToRight</enum>
</property>
<property name="text">
<string>Less than:</string>
<string>Maximum scale:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="textLabel1_3">
<item row="0" column="4">
<widget class="QgsScaleComboBox" name="cbMaximumScale" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Minimum scale (maximum scale denominator).</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsScaleComboBox" name="cbMinimumScale" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Maximum scale (minimum scale denominator).</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="textLabel1_2_2_2">
<property name="toolTip">
<string>Maximum scale denominator</string>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
<enum>Qt::LeftToRight</enum>
</property>
<property name="text">
<string>More than or equal to:</string>
<string>Minimum scale</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsScaleComboBox" name="cbMaximumScale" native="true"/>
<item row="0" column="2">
<widget class="QPushButton" name="mMinimumScaleSetCurrentPushButton">
<property name="text">
<string>Set current</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsScaleComboBox" name="cbMinimumScale" native="true"/>
<item row="0" column="5">
<widget class="QPushButton" name="mMaximumScaleSetCurrentPushButton">
<property name="text">
<string>Set current</string>
</property>
</widget>
</item>
</layout>
</widget>
Expand Down Expand Up @@ -938,7 +990,7 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Cantarell'; font-size:11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
Expand Down
91 changes: 78 additions & 13 deletions src/ui/qgsvectorlayerpropertiesbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
<item row="1" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<number>4</number>
</property>
<property name="iconSize">
<size>
Expand Down Expand Up @@ -391,8 +391,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>914</width>
<height>746</height>
<width>920</width>
<height>756</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
Expand Down Expand Up @@ -489,25 +489,83 @@
<property name="margin">
<number>11</number>
</property>
<item row="0" column="2">
<item row="0" column="3">
<widget class="QLabel" name="textLabel1_2_2">
<property name="toolTip">
<string>Maximum scale (minimum scale denominator).</string>
</property>
<property name="text">
<string>Less than:</string>
<string>Minimum scale:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="textLabel1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Minimum scale denominator.</string>
</property>
<property name="text">
<string>More than or equal to:</string>
<string>Maximum scale:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsScaleComboBox" name="cbMinimumScale"/>
<widget class="QgsScaleComboBox" name="cbMinimumScale" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Maximum scale (minimum scale denominator).</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsScaleComboBox" name="cbMaximumScale"/>
<item row="0" column="4">
<widget class="QgsScaleComboBox" name="cbMaximumScale" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Minimum scale (maximum scale denominator).</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="mMinimumScaleSetCurrentPushButton">
<property name="text">
<string>Set current</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QPushButton" name="mMaximumScaleSetCurrentPushButton">
<property name="text">
<string>Set current</string>
</property>
</widget>
</item>
</layout>
</widget>
Expand Down Expand Up @@ -760,8 +818,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>896</width>
<height>728</height>
<width>912</width>
<height>748</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
Expand Down Expand Up @@ -872,8 +930,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>896</width>
<height>728</height>
<width>912</width>
<height>748</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_17">
Expand Down Expand Up @@ -966,6 +1024,13 @@
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsScaleComboBox</class>
<extends>QWidget</extends>
<header>qgsscalecombobox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>pbnIndex</tabstop>
<tabstop>cbMinimumScale</tabstop>
Expand Down