Review fixes, sip, doc fixes, icons, style panel fix

This commit is contained in:
Martin Dobias 2019-01-18 09:32:53 +01:00
parent f069342b35
commit 9875821b04
11 changed files with 344 additions and 44 deletions

View File

@ -1,6 +1,7 @@
// Include auto-generated SIP files // Include auto-generated SIP files
%Include auto_generated/qgs3dtypes.sip %Include auto_generated/qgs3dtypes.sip
%Include auto_generated/qgsphongmaterialsettings.sip %Include auto_generated/qgsphongmaterialsettings.sip
%Include auto_generated/qgsrulebased3drenderer.sip
%Include auto_generated/qgsvectorlayer3drenderer.sip %Include auto_generated/qgsvectorlayer3drenderer.sip
%Include auto_generated/symbols/qgsabstract3dsymbol.sip %Include auto_generated/symbols/qgsabstract3dsymbol.sip
%Include auto_generated/symbols/qgsline3dsymbol.sip %Include auto_generated/symbols/qgsline3dsymbol.sip

View File

@ -0,0 +1,280 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsrulebased3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
class QgsRuleBased3DRendererMetadata : Qgs3DRendererAbstractMetadata
{
%Docstring
Metadata for rule-based 3D renderer to allow creation of its instances from XML
.. warning::
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.
.. versionadded:: 3.6
%End
%TypeHeaderCode
#include "qgsrulebased3drenderer.h"
%End
public:
QgsRuleBased3DRendererMetadata();
virtual QgsAbstract3DRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) /Factory/;
%Docstring
Creates an instance of a 3D renderer based on a DOM element with renderer configuration
%End
};
class QgsRuleBased3DRenderer : QgsAbstract3DRenderer
{
%Docstring
Rule-based 3D renderer.
Similar to rule-based 2D renderer and rule-based labeling, it allows specification of rules for 3D symbols.
.. warning::
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.
.. versionadded:: 3.6
%End
%TypeHeaderCode
#include "qgsrulebased3drenderer.h"
%End
public:
typedef QList<QgsRuleBased3DRenderer::Rule *> RuleList;
typedef QMap<const QgsRuleBased3DRenderer::Rule *, QgsFeature3DHandler *> RuleToHandlerMap;
class Rule
{
%Docstring
.. versionadded:: 3.6
%End
%TypeHeaderCode
#include "qgsrulebased3drenderer.h"
%End
public:
Rule( QgsAbstract3DSymbol *symbol /Transfer/, const QString &filterExp = QString(), const QString &description = QString(), bool elseRule = false );
%Docstring
takes ownership of symbol, symbol may be None
%End
~Rule();
enum RegisterResult
{
Filtered,
Inactive,
Registered
};
QgsAbstract3DSymbol *symbol() const;
%Docstring
Gets the labeling settings. May return a null pointer.
%End
QString filterExpression() const;
%Docstring
A filter that will check if this rule applies
:return: An expression
%End
QString description() const;
%Docstring
A human readable description for this rule
:return: Description
%End
bool active() const;
%Docstring
Returns if this rule is active
:return: True if the rule is active
%End
bool isElse() const;
%Docstring
Check if this rule is an ELSE rule
:return: True if this rule is an else rule
%End
QString ruleKey() const;
%Docstring
Unique rule identifier (for identification of rule within labeling, used as provider ID)
%End
void setSymbol( QgsAbstract3DSymbol *symbol /Transfer/ );
%Docstring
Sets new symbol (or NULL). Deletes old symbol if any.
%End
void setFilterExpression( const QString &filterExp );
%Docstring
Set the expression used to check if a given feature shall be rendered with this rule
:param filterExp: An expression
%End
void setDescription( const QString &description );
%Docstring
Set a human readable description for this rule
:param description: Description
%End
void setActive( bool state );
%Docstring
Sets if this rule is active
:param state: Determines if the rule should be activated or deactivated
%End
void setIsElse( bool iselse );
%Docstring
Sets if this rule is an ELSE rule
:param iselse: If true, this rule is an ELSE rule
%End
void setRuleKey( const QString &key );
%Docstring
Override the assigned rule key (should be used just internally by rule-based renderer)
%End
const QgsRuleBased3DRenderer::RuleList &children() const;
%Docstring
Returns all children rules of this rule
:return: A list of rules
%End
QgsRuleBased3DRenderer::RuleList descendants() const;
%Docstring
Returns all children, grand-children, grand-grand-children, grand-gra... you get it
:return: A list of descendant rules
%End
QgsRuleBased3DRenderer::Rule *parent();
%Docstring
The parent rule
:return: Parent rule
%End
void appendChild( QgsRuleBased3DRenderer::Rule *rule /Transfer/ );
%Docstring
add child rule, take ownership, sets this as parent
%End
void insertChild( int i, QgsRuleBased3DRenderer::Rule *rule /Transfer/ );
%Docstring
add child rule, take ownership, sets this as parent
%End
void removeChildAt( int i );
%Docstring
delete child rule
%End
const QgsRuleBased3DRenderer::Rule *findRuleByKey( const QString &key ) const;
%Docstring
Try to find a rule given its unique key
%End
QgsRuleBased3DRenderer::Rule *clone() const /Factory/;
%Docstring
clone this rule, return new instance
%End
static QgsRuleBased3DRenderer::Rule *create( const QDomElement &ruleElem, const QgsReadWriteContext &context ) /Factory/;
%Docstring
Create a rule from an XML definition
:param ruleElem: The XML rule element
:param context: reading context
:return: A new rule
%End
QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const;
%Docstring
store labeling info to XML element
%End
private:
Rule( const QgsRuleBased3DRenderer::Rule &rh );
};
QgsRuleBased3DRenderer( QgsRuleBased3DRenderer::Rule *root /Transfer/ );
%Docstring
Construct renderer with the given root rule (takes ownership)
%End
~QgsRuleBased3DRenderer();
void setLayer( QgsVectorLayer *layer );
%Docstring
Sets vector layer associated with the renderer
%End
QgsVectorLayer *layer() const;
%Docstring
Returns vector layer associated with the renderer
%End
QgsRuleBased3DRenderer::Rule *rootRule();
%Docstring
Returns pointer to the root rule
%End
virtual QString type() const;
virtual QgsRuleBased3DRenderer *clone() const /Factory/;
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
virtual void resolveReferences( const QgsProject &project );
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsrulebased3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/

View File

@ -378,18 +378,26 @@ QgsVector3D Qgs3DUtils::transformWorldCoordinates( const QgsVector3D &worldPoint
return mapToWorldCoordinates( mapPoint2, origin2 ); return mapToWorldCoordinates( mapPoint2, origin2 );
} }
QgsAbstract3DSymbol *Qgs3DUtils::symbolForGeometryType( QgsWkbTypes::GeometryType geomType ) std::unique_ptr<QgsAbstract3DSymbol> Qgs3DUtils::symbolForGeometryType( QgsWkbTypes::GeometryType geomType )
{ {
switch ( geomType ) switch ( geomType )
{ {
case QgsWkbTypes::PointGeometry: case QgsWkbTypes::PointGeometry:
return new QgsPoint3DSymbol; return std::unique_ptr<QgsAbstract3DSymbol>( new QgsPoint3DSymbol );
case QgsWkbTypes::LineGeometry: case QgsWkbTypes::LineGeometry:
return new QgsLine3DSymbol; return std::unique_ptr<QgsAbstract3DSymbol>( new QgsLine3DSymbol );
case QgsWkbTypes::PolygonGeometry: case QgsWkbTypes::PolygonGeometry:
return new QgsPolygon3DSymbol; return std::unique_ptr<QgsAbstract3DSymbol>( new QgsPolygon3DSymbol );
default: default:
return nullptr; return nullptr;
} }
} }
QgsExpressionContext Qgs3DUtils::globalProjectLayerExpressionContext( QgsVectorLayer *layer )
{
QgsExpressionContext exprContext;
exprContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() )
<< QgsExpressionContextUtils::layerScope( layer );
return exprContext;
}

View File

@ -29,6 +29,7 @@ class Qgs3DMapScene;
#include "qgs3dtypes.h" #include "qgs3dtypes.h"
#include "qgsaabb.h" #include "qgsaabb.h"
#include <memory>
#ifndef SIP_RUN #ifndef SIP_RUN
@ -101,7 +102,11 @@ class _3D_EXPORT Qgs3DUtils
static QgsVector3D transformWorldCoordinates( const QgsVector3D &worldPoint1, const QgsVector3D &origin1, const QgsCoordinateReferenceSystem &crs1, const QgsVector3D &origin2, const QgsCoordinateReferenceSystem &crs2, static QgsVector3D transformWorldCoordinates( const QgsVector3D &worldPoint1, const QgsVector3D &origin1, const QgsCoordinateReferenceSystem &crs1, const QgsVector3D &origin2, const QgsCoordinateReferenceSystem &crs2,
const QgsCoordinateTransformContext &context ); const QgsCoordinateTransformContext &context );
static QgsAbstract3DSymbol *symbolForGeometryType( QgsWkbTypes::GeometryType geomType ); //! Returns a new 3D symbol based on given geometry type (or null pointer if geometry type is not supported)
static std::unique_ptr<QgsAbstract3DSymbol> symbolForGeometryType( QgsWkbTypes::GeometryType geomType );
//! Returns expression context for use in preparation of 3D data of a layer
static QgsExpressionContext globalProjectLayerExpressionContext( QgsVectorLayer *layer );
}; };
#endif #endif

View File

@ -20,6 +20,7 @@
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
#include "qgs3dmapsettings.h" #include "qgs3dmapsettings.h"
#include "qgs3dutils.h"
/// @cond PRIVATE /// @cond PRIVATE
@ -31,9 +32,7 @@ namespace Qgs3DSymbolImpl
{ {
Qgs3DRenderContext context( map ); Qgs3DRenderContext context( map );
QgsExpressionContext exprContext; QgsExpressionContext exprContext( Qgs3DUtils::globalProjectLayerExpressionContext( layer ) );
exprContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() );
exprContext.setFields( layer->fields() ); exprContext.setFields( layer->fields() );
context.setExpressionContext( exprContext ); context.setExpressionContext( exprContext );

View File

@ -19,6 +19,7 @@
#include "qgsxmlutils.h" #include "qgsxmlutils.h"
#include "qgs3dmapsettings.h" #include "qgs3dmapsettings.h"
#include "qgs3dutils.h"
#include "qgsline3dsymbol.h" #include "qgsline3dsymbol.h"
#include "qgspoint3dsymbol.h" #include "qgspoint3dsymbol.h"
#include "qgspolygon3dsymbol.h" #include "qgspolygon3dsymbol.h"
@ -415,7 +416,10 @@ Qt3DCore::QEntity *QgsRuleBased3DRenderer::createEntity( const Qgs3DMapSettings
return nullptr; return nullptr;
Qgs3DRenderContext context( map ); Qgs3DRenderContext context( map );
// TODO: add expr. context
QgsExpressionContext exprContext( Qgs3DUtils::globalProjectLayerExpressionContext( vl ) );
exprContext.setFields( vl->fields() );
context.setExpressionContext( exprContext );
RuleToHandlerMap handlers; RuleToHandlerMap handlers;
mRootRule->createHandlers( vl, handlers ); mRootRule->createHandlers( vl, handlers );
@ -431,7 +435,7 @@ Qt3DCore::QEntity *QgsRuleBased3DRenderer::createEntity( const Qgs3DMapSettings
QgsFeatureIterator fi = vl->getFeatures( req ); QgsFeatureIterator fi = vl->getFeatures( req );
while ( fi.nextFeature( f ) ) while ( fi.nextFeature( f ) )
{ {
// TODO: set feature in expr context? context.expressionContext().setFeature( f );
mRootRule->registerFeature( f, context, handlers ); mRootRule->registerFeature( f, context, handlers );
} }

View File

@ -28,6 +28,15 @@ class Qgs3DRenderContext;
class QgsFeature3DHandler; class QgsFeature3DHandler;
/**
* \ingroup 3d
* Metadata for rule-based 3D renderer to allow creation of its instances from XML
*
* \warning This is not considered stable API, and may change in future QGIS releases. It is
* exposed to the Python bindings as a tech preview only.
*
* \since QGIS 3.6
*/
class _3D_EXPORT QgsRuleBased3DRendererMetadata : public Qgs3DRendererAbstractMetadata class _3D_EXPORT QgsRuleBased3DRendererMetadata : public Qgs3DRendererAbstractMetadata
{ {
public: public:
@ -43,6 +52,10 @@ class _3D_EXPORT QgsRuleBased3DRendererMetadata : public Qgs3DRendererAbstractMe
* Rule-based 3D renderer. * Rule-based 3D renderer.
* *
* Similar to rule-based 2D renderer and rule-based labeling, it allows specification of rules for 3D symbols. * Similar to rule-based 2D renderer and rule-based labeling, it allows specification of rules for 3D symbols.
*
* \warning This is not considered stable API, and may change in future QGIS releases. It is
* exposed to the Python bindings as a tech preview only.
*
* \since QGIS 3.6 * \since QGIS 3.6
*/ */
class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer
@ -279,6 +292,7 @@ class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer
}; };
//! Construct renderer with the given root rule (takes ownership)
QgsRuleBased3DRenderer( QgsRuleBased3DRenderer::Rule *root SIP_TRANSFER ); QgsRuleBased3DRenderer( QgsRuleBased3DRenderer::Rule *root SIP_TRANSFER );
~QgsRuleBased3DRenderer() override; ~QgsRuleBased3DRenderer() override;
@ -287,7 +301,9 @@ class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer
//! Returns vector layer associated with the renderer //! Returns vector layer associated with the renderer
QgsVectorLayer *layer() const; QgsVectorLayer *layer() const;
//! Returns pointer to the root rule
QgsRuleBased3DRenderer::Rule *rootRule() { return mRootRule; } QgsRuleBased3DRenderer::Rule *rootRule() { return mRootRule; }
//! Returns pointer to the root rule
const Rule *rootRule() const SIP_SKIP { return mRootRule; } const Rule *rootRule() const SIP_SKIP { return mRootRule; }
QString type() const override { return "rulebased"; } QString type() const override { return "rulebased"; }

View File

@ -26,18 +26,6 @@
#include <QMessageBox> #include <QMessageBox>
static QList<QgsExpressionContextScope *> _globalProjectLayerScopes( const QgsMapLayer *layer )
{
QList<QgsExpressionContextScope *> scopes;
scopes << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() )
<< QgsExpressionContextUtils::layerScope( layer );
return scopes;
}
// --------
QgsRuleBased3DRendererWidget::QgsRuleBased3DRendererWidget( QWidget *parent ) QgsRuleBased3DRendererWidget::QgsRuleBased3DRendererWidget( QWidget *parent )
: QgsPanelWidget( parent ) : QgsPanelWidget( parent )
{ {
@ -101,7 +89,7 @@ void QgsRuleBased3DRendererWidget::setLayer( QgsVectorLayer *layer )
void QgsRuleBased3DRendererWidget::addRule() void QgsRuleBased3DRendererWidget::addRule()
{ {
QgsRuleBased3DRenderer::Rule *newrule = new QgsRuleBased3DRenderer::Rule( Qgs3DUtils::symbolForGeometryType( mLayer->geometryType() ) ); QgsRuleBased3DRenderer::Rule *newrule = new QgsRuleBased3DRenderer::Rule( Qgs3DUtils::symbolForGeometryType( mLayer->geometryType() ).release() );
QgsRuleBased3DRenderer::Rule *current = currentRule(); QgsRuleBased3DRenderer::Rule *current = currentRule();
if ( current ) if ( current )
@ -543,7 +531,6 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
: QgsPanelWidget( parent ) : QgsPanelWidget( parent )
, mRule( rule ) , mRule( rule )
, mLayer( layer ) , mLayer( layer )
, mSymbol( nullptr )
{ {
setupUi( this ); setupUi( this );
@ -557,7 +544,7 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
if ( mRule->symbol() ) if ( mRule->symbol() )
{ {
groupSymbol->setChecked( true ); groupSymbol->setChecked( true );
mSymbol = mRule->symbol()->clone(); // use a clone! mSymbol.reset( mRule->symbol()->clone() ); // use a clone!
} }
else else
{ {
@ -566,7 +553,7 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
} }
mSymbolWidget = new QgsSymbol3DWidget( this ); mSymbolWidget = new QgsSymbol3DWidget( this );
mSymbolWidget->setSymbol( mSymbol, layer ); mSymbolWidget->setSymbol( mSymbol.get(), layer );
QVBoxLayout *l = new QVBoxLayout; QVBoxLayout *l = new QVBoxLayout;
l->addWidget( mSymbolWidget ); l->addWidget( mSymbolWidget );
groupSymbol->setLayout( l ); groupSymbol->setLayout( l );
@ -581,16 +568,7 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
connect( mElseRadio, &QRadioButton::toggled, this, [ = ]( bool toggled ) { if ( toggled ) editFilter->setText( QStringLiteral( "ELSE" ) );} ); connect( mElseRadio, &QRadioButton::toggled, this, [ = ]( bool toggled ) { if ( toggled ) editFilter->setText( QStringLiteral( "ELSE" ) );} );
} }
Qgs3DRendererRulePropsWidget::~Qgs3DRendererRulePropsWidget() Qgs3DRendererRulePropsWidget::~Qgs3DRendererRulePropsWidget() = default;
{
delete mSymbol;
}
void Qgs3DRendererRulePropsWidget::setDockMode( bool dockMode )
{
QgsPanelWidget::setDockMode( dockMode );
// TODO mLabelingGui->setDockMode( dockMode );
}
void Qgs3DRendererRulePropsWidget::testFilter() void Qgs3DRendererRulePropsWidget::testFilter()
{ {
@ -604,7 +582,7 @@ void Qgs3DRendererRulePropsWidget::testFilter()
return; return;
} }
QgsExpressionContext context( _globalProjectLayerScopes( mLayer ) ); QgsExpressionContext context( Qgs3DUtils::globalProjectLayerExpressionContext( mLayer ) );
if ( !filter.prepare( &context ) ) if ( !filter.prepare( &context ) )
{ {
@ -637,7 +615,7 @@ void Qgs3DRendererRulePropsWidget::testFilter()
void Qgs3DRendererRulePropsWidget::buildExpression() void Qgs3DRendererRulePropsWidget::buildExpression()
{ {
QgsExpressionContext context( _globalProjectLayerScopes( mLayer ) ); QgsExpressionContext context( Qgs3DUtils::globalProjectLayerExpressionContext( mLayer ) );
QgsExpressionBuilderDialog dlg( mLayer, editFilter->text(), this, QStringLiteral( "generic" ), context ); QgsExpressionBuilderDialog dlg( mLayer, editFilter->text(), this, QStringLiteral( "generic" ), context );

View File

@ -148,8 +148,6 @@ class Qgs3DRendererRulePropsWidget : public QgsPanelWidget, private Ui::Qgs3DRen
QgsRuleBased3DRenderer::Rule *rule() { return mRule; } QgsRuleBased3DRenderer::Rule *rule() { return mRule; }
void setDockMode( bool dockMode ) override;
public slots: public slots:
void testFilter(); void testFilter();
void buildExpression(); void buildExpression();
@ -164,7 +162,7 @@ class Qgs3DRendererRulePropsWidget : public QgsPanelWidget, private Ui::Qgs3DRen
QgsVectorLayer *mLayer = nullptr; QgsVectorLayer *mLayer = nullptr;
QgsSymbol3DWidget *mSymbolWidget = nullptr; QgsSymbol3DWidget *mSymbolWidget = nullptr;
QgsAbstract3DSymbol *mSymbol; // a clone of original symbol std::unique_ptr<QgsAbstract3DSymbol> mSymbol; // a clone of original symbol
}; };

View File

@ -72,9 +72,9 @@ QgsVectorLayer3DRendererWidget::QgsVectorLayer3DRendererWidget( QgsVectorLayer *
QVBoxLayout *layout = new QVBoxLayout( this ); QVBoxLayout *layout = new QVBoxLayout( this );
cboRendererType = new QComboBox( this ); cboRendererType = new QComboBox( this );
cboRendererType->addItem( tr( "No renderer" ) ); cboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererNullSymbol.svg" ) ), tr( "No symbols" ) );
cboRendererType->addItem( tr( "Single symbol renderer" ) ); cboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererSingleSymbol.svg" ) ), tr( "Single symbol" ) );
cboRendererType->addItem( tr( "Rule-based renderer" ) ); cboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererRuleBasedSymbol.svg" ) ), tr( "Rule-based" ) );
widgetRendererStack = new QStackedWidget( this ); widgetRendererStack = new QStackedWidget( this );
layout->addWidget( cboRendererType ); layout->addWidget( cboRendererType );
@ -91,8 +91,11 @@ QgsVectorLayer3DRendererWidget::QgsVectorLayer3DRendererWidget( QgsVectorLayer *
connect( cboRendererType, qgis::overload< int >::of( &QComboBox::currentIndexChanged ), this, &QgsVectorLayer3DRendererWidget::onRendererTypeChanged ); connect( cboRendererType, qgis::overload< int >::of( &QComboBox::currentIndexChanged ), this, &QgsVectorLayer3DRendererWidget::onRendererTypeChanged );
connect( widgetSingleSymbolRenderer, &QgsSingleSymbol3DRendererWidget::widgetChanged, this, &QgsVectorLayer3DRendererWidget::widgetChanged ); connect( widgetSingleSymbolRenderer, &QgsSingleSymbol3DRendererWidget::widgetChanged, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
connect( widgetRuleBasedRenderer, &QgsRuleBased3DRendererWidget::widgetChanged, this, &QgsVectorLayer3DRendererWidget::widgetChanged ); connect( widgetRuleBasedRenderer, &QgsRuleBased3DRendererWidget::widgetChanged, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
connect( widgetRuleBasedRenderer, &QgsRuleBased3DRendererWidget::showPanel, this, &QgsPanelWidget::openPanel );
} }
void QgsVectorLayer3DRendererWidget::setLayer( QgsVectorLayer *layer ) void QgsVectorLayer3DRendererWidget::setLayer( QgsVectorLayer *layer )
{ {
mLayer = layer; mLayer = layer;
@ -117,6 +120,12 @@ void QgsVectorLayer3DRendererWidget::setLayer( QgsVectorLayer *layer )
whileBlocking( cboRendererType )->setCurrentIndex( pageIndex ); whileBlocking( cboRendererType )->setCurrentIndex( pageIndex );
} }
void QgsVectorLayer3DRendererWidget::setDockMode( bool dockMode )
{
QgsPanelWidget::setDockMode( dockMode );
widgetRuleBasedRenderer->setDockMode( dockMode );
}
void QgsVectorLayer3DRendererWidget::apply() void QgsVectorLayer3DRendererWidget::apply()
{ {

View File

@ -64,6 +64,8 @@ class QgsVectorLayer3DRendererWidget : public QgsMapLayerConfigWidget
void setLayer( QgsVectorLayer *layer ); void setLayer( QgsVectorLayer *layer );
void setDockMode( bool dockMode ) override;
public slots: public slots:
void apply() override; void apply() override;