116 changes: 116 additions & 0 deletions src/gui/layertree/qgslayertreeembeddedconfigwidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/***************************************************************************
qgslayertreeembeddedconfigwidget.cpp
--------------------------------------
Date : May 2016
Copyright : (C) 2016 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgslayertreeembeddedconfigwidget.h"

#include "qgsmaplayer.h"
#include "qgslayertreeembeddedwidgetregistry.h"

#include <QStringListModel>
#include <QStandardItemModel>

QgsLayerTreeEmbeddedConfigWidget::QgsLayerTreeEmbeddedConfigWidget( QWidget* parent )
: QWidget( parent )
, mLayer( nullptr )
{
setupUi( this );
}

void QgsLayerTreeEmbeddedConfigWidget::setLayer( QgsMapLayer* layer )
{
mLayer = layer;

connect( mBtnAdd, SIGNAL( clicked( bool ) ), this, SLOT( onAddClicked() ) );
connect( mBtnRemove, SIGNAL( clicked( bool ) ), this, SLOT( onRemoveClicked() ) );

QStandardItemModel* modelAvailable = new QStandardItemModel( this );
QStandardItemModel* modelUsed = new QStandardItemModel( this );

// populate available
Q_FOREACH ( const QString& providerId, QgsLayerTreeEmbeddedWidgetRegistry::instance()->providers() )
{
QgsLayerTreeEmbeddedWidgetProvider* provider = QgsLayerTreeEmbeddedWidgetRegistry::instance()->provider( providerId );
QStandardItem* item = new QStandardItem( provider->name() );
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
item->setData( provider->id(), Qt::UserRole + 1 );
modelAvailable->appendRow( item );
}
mListAvailable->setModel( modelAvailable );

// populate used
int widgetsCount = layer->customProperty( "embeddedWidgets/count", 0 ).toInt();
for ( int i = 0; i < widgetsCount; ++i )
{
QString providerId = layer->customProperty( QString( "embeddedWidgets/%1/id" ).arg( i ) ).toString();
if ( QgsLayerTreeEmbeddedWidgetProvider* provider = QgsLayerTreeEmbeddedWidgetRegistry::instance()->provider( providerId ) )
{
QStandardItem* item = new QStandardItem( provider->name() );
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
item->setData( provider->id(), Qt::UserRole + 1 );
modelUsed->appendRow( item );
}
}
mListUsed->setModel( modelUsed );
}

void QgsLayerTreeEmbeddedConfigWidget::onAddClicked()
{
if ( !mListAvailable->currentIndex().isValid() )
return;

QString providerId = mListAvailable->model()->data( mListAvailable->currentIndex(), Qt::UserRole + 1 ).toString();
QgsLayerTreeEmbeddedWidgetProvider* provider = QgsLayerTreeEmbeddedWidgetRegistry::instance()->provider( providerId );
if ( !provider )
return;

if ( QStandardItemModel* model = qobject_cast<QStandardItemModel*>( mListUsed->model() ) )
{
QStandardItem* item = new QStandardItem( provider->name() );
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
item->setData( provider->id(), Qt::UserRole + 1 );
model->appendRow( item );
}
}

void QgsLayerTreeEmbeddedConfigWidget::onRemoveClicked()
{
if ( !mListUsed->currentIndex().isValid() )
return;

int row = mListUsed->currentIndex().row();
mListUsed->model()->removeRow( row );
}

void QgsLayerTreeEmbeddedConfigWidget::applyToLayer()
{
if ( !mLayer )
return;

// clear old properties
int widgetsCount = mLayer->customProperty( "embeddedWidgets/count", 0 ).toInt();
for ( int i = 0; i < widgetsCount; ++i )
{
mLayer->removeCustomProperty( QString( "embeddedWidgets/%1/id" ).arg( i ) );
}

// setup new properties
int newCount = mListUsed->model()->rowCount();
mLayer->setCustomProperty( "embeddedWidgets/count", newCount );
for ( int i = 0; i < newCount; ++i )
{
QString providerId = mListUsed->model()->data( mListUsed->model()->index( i, 0 ), Qt::UserRole + 1 ).toString();
mLayer->setCustomProperty( QString( "embeddedWidgets/%1/id" ).arg( i ), providerId );
}
}
48 changes: 48 additions & 0 deletions src/gui/layertree/qgslayertreeembeddedconfigwidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/***************************************************************************
qgslayertreeembeddedconfigwidget.h
--------------------------------------
Date : May 2016
Copyright : (C) 2016 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSLAYERTREEEMBEDDEDCONFIGWIDGET_H
#define QGSLAYERTREEEMBEDDEDCONFIGWIDGET_H

#include "ui_qgslayertreeembeddedconfigwidget.h"

class QgsMapLayer;

/** \ingroup gui
* \class QgsLayerTreeEmbeddedConfigWidget
* A widget to configure layer tree embedded widgets for a particular map layer.
* @note introduced in QGIS 2.16
*/
class GUI_EXPORT QgsLayerTreeEmbeddedConfigWidget : public QWidget, protected Ui::QgsLayerTreeEmbeddedConfigWidget
{
Q_OBJECT
public:
QgsLayerTreeEmbeddedConfigWidget( QWidget* parent = nullptr );

//! Initialize widget with a map layer
void setLayer( QgsMapLayer* layer );

//! Store changes made in the widget to the layer
void applyToLayer();

private slots:
void onAddClicked();
void onRemoveClicked();

private:
QgsMapLayer* mLayer;
};

#endif // QGSLAYERTREEEMBEDDEDCONFIGWIDGET_H
68 changes: 68 additions & 0 deletions src/gui/layertree/qgslayertreeembeddedwidgetregistry.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/***************************************************************************
qgslayertreeembeddedwidgetregistry.cpp
--------------------------------------
Date : May 2016
Copyright : (C) 2016 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgslayertreeembeddedwidgetregistry.h"

#include "qgslayertreeembeddedwidgetsimpl.h"



QgsLayerTreeEmbeddedWidgetRegistry* QgsLayerTreeEmbeddedWidgetRegistry::instance()
{
static QgsLayerTreeEmbeddedWidgetRegistry* sInstance( new QgsLayerTreeEmbeddedWidgetRegistry() );
return sInstance;
}

QgsLayerTreeEmbeddedWidgetRegistry::QgsLayerTreeEmbeddedWidgetRegistry()
{
// populate with default implementations
addProvider( new QgsLayerTreeTransparencyWidget::Provider() );
}

QgsLayerTreeEmbeddedWidgetRegistry::~QgsLayerTreeEmbeddedWidgetRegistry()
{
Q_FOREACH ( QgsLayerTreeEmbeddedWidgetProvider* provider, mProviders )
{
removeProvider( provider->id() );
}
}

QStringList QgsLayerTreeEmbeddedWidgetRegistry::providers() const
{
return mProviders.keys();
}

QgsLayerTreeEmbeddedWidgetProvider* QgsLayerTreeEmbeddedWidgetRegistry::provider( const QString& providerId ) const
{
return mProviders.value( providerId );
}

bool QgsLayerTreeEmbeddedWidgetRegistry::addProvider( QgsLayerTreeEmbeddedWidgetProvider* provider )
{
if ( mProviders.contains( provider->id() ) )
return false;

mProviders.insert( provider->id(), provider );
return true;
}

bool QgsLayerTreeEmbeddedWidgetRegistry::removeProvider( const QString& providerId )
{
if ( !mProviders.contains( providerId ) )
return false;

delete mProviders.take( providerId );
return true;
}
93 changes: 93 additions & 0 deletions src/gui/layertree/qgslayertreeembeddedwidgetregistry.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/***************************************************************************
qgslayertreeembeddedwidgetregistry.h
--------------------------------------
Date : May 2016
Copyright : (C) 2016 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSLAYERTREEEMBEDDEDWIDGETREGISTRY_H
#define QGSLAYERTREEEMBEDDEDWIDGETREGISTRY_H

#include <QMap>
#include <QWidget>


class QgsMapLayer;

/** \ingroup gui
* \class QgsLayerTreeEmbeddedWidgetProvider
* Provider interface to be implemented in order to introduce new kinds of embedded widgets for use in layer tree.
* Embedded widgets are assigned per individual map layers and they are shown before any legend entries.
* @see QgsLayerTreeEmbeddedWidgetRegistry
* @note introduced in QGIS 2.16
*/
class GUI_EXPORT QgsLayerTreeEmbeddedWidgetProvider
{
public:
virtual ~QgsLayerTreeEmbeddedWidgetProvider() {}

//! Unique name of the provider (among other providers)
virtual QString id() const = 0;

//! Human readable name - may be translatable with tr()
virtual QString name() const = 0;

//! Factory to create widgets. The returned widget is owned by the caller.
//! The widgetIndex argument may be used to identify which widget is being
//! created (useful when using multiple widgets from the same provider for one layer).
virtual QWidget* createWidget( QgsMapLayer* layer, int widgetIndex ) = 0;

//! Whether it makes sense to use this widget for a particular layer
virtual bool supportsLayer( QgsMapLayer* layer ) = 0;
};

/** \ingroup gui
* \class QgsLayerTreeEmbeddedWidgetRegistry
* Registry of widgets that may be embedded into layer tree view.
* Embedded widgets are assigned per individual map layers and they are shown before any legend entries.
* Layer tree must have UseEmbeddedWidgets flag enabled in order to show assigned widgets.
*
* @see QgsLayerTreeEmbeddedWidgetRegistry
* @note introduced in QGIS 2.16
*/
class GUI_EXPORT QgsLayerTreeEmbeddedWidgetRegistry
{
public:

/** Means of accessing canonical single instance */
static QgsLayerTreeEmbeddedWidgetRegistry* instance();

~QgsLayerTreeEmbeddedWidgetRegistry();

/** Return list of all registered providers */
QStringList providers() const;

/** Get provider object from the provider's ID */
QgsLayerTreeEmbeddedWidgetProvider* provider( const QString& providerId ) const;

/** Register a provider, takes ownership of the object.
* Returns true on success, false if the provider is already registered. */
bool addProvider( QgsLayerTreeEmbeddedWidgetProvider* provider );

/** Unregister a provider, the provider object is deleted.
* Returns true on success, false if the provider was not registered. */
bool removeProvider( const QString& providerId );

protected:
//! Protected constructor - use instance() to access the registry.
QgsLayerTreeEmbeddedWidgetRegistry();

//! storage of all the providers
QMap<QString, QgsLayerTreeEmbeddedWidgetProvider*> mProviders;
};


#endif // QGSLAYERTREEEMBEDDEDWIDGETREGISTRY_H
122 changes: 122 additions & 0 deletions src/gui/layertree/qgslayertreeembeddedwidgetsimpl.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/***************************************************************************
qgslayertreeembeddedwidgetsimpl.h
--------------------------------------
Date : May 2016
Copyright : (C) 2016 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgslayertreeembeddedwidgetsimpl.h"

#include <QHBoxLayout>
#include <QLabel>
#include <QSlider>
#include <QTimer>

#include "qgsrasterlayer.h"
#include "qgsrasterrenderer.h"
#include "qgsvectorlayer.h"




QgsLayerTreeTransparencyWidget::QgsLayerTreeTransparencyWidget( QgsMapLayer* layer )
: mLayer( layer )
{
setAutoFillBackground( true ); // override the content from model
QLabel* l = new QLabel( "Transparency", this );
mSlider = new QSlider( Qt::Horizontal, this );
mSlider->setRange( 0, 100 );
QHBoxLayout* lay = new QHBoxLayout();
lay->addWidget( l );
lay->addWidget( mSlider );
setLayout( lay );

// timer for delayed transparency update - for more responsive GUI
mTimer = new QTimer( this );
mTimer->setSingleShot( true );
mTimer->setInterval( 100 );
connect( mTimer, SIGNAL( timeout() ), this, SLOT( updateTransparencyFromSlider() ) );

connect( mSlider, SIGNAL( valueChanged( int ) ), this, SLOT( sliderValueChanged( int ) ) );

// init from layer
if ( mLayer->type() == QgsMapLayer::VectorLayer )
{
mSlider->setValue( qobject_cast<QgsVectorLayer*>( mLayer )->layerTransparency() );
connect( mLayer, SIGNAL( layerTransparencyChanged( int ) ), this, SLOT( layerTrChanged() ) );
}
else if ( mLayer->type() == QgsMapLayer::RasterLayer )
{
mSlider->setValue( 100 - qobject_cast<QgsRasterLayer*>( mLayer )->renderer()->opacity() * 100 );
// TODO: there is no signal for raster layers
}
}

QSize QgsLayerTreeTransparencyWidget::sizeHint() const
{
return QWidget::sizeHint();
//return QSize(200,200); // horizontal seems ignored, vertical is used for spacing
}

void QgsLayerTreeTransparencyWidget::sliderValueChanged( int value )
{
Q_UNUSED( value );

if ( mTimer->isActive() )
return;
mTimer->start();
}

void QgsLayerTreeTransparencyWidget::updateTransparencyFromSlider()
{
int value = mSlider->value();

if ( mLayer->type() == QgsMapLayer::VectorLayer )
{
qobject_cast<QgsVectorLayer*>( mLayer )->setLayerTransparency( value );
}
else if ( mLayer->type() == QgsMapLayer::RasterLayer )
{
qobject_cast<QgsRasterLayer*>( mLayer )->renderer()->setOpacity( 1 - value / 100. );
}

mLayer->triggerRepaint();
}

void QgsLayerTreeTransparencyWidget::layerTrChanged()
{
mSlider->blockSignals( true );
mSlider->setValue( qobject_cast<QgsVectorLayer*>( mLayer )->layerTransparency() );
mSlider->blockSignals( false );
}

//

QString QgsLayerTreeTransparencyWidget::Provider::id() const
{
return "transparency";
}

QString QgsLayerTreeTransparencyWidget::Provider::name() const
{
return tr( "Transparency slider" );
}

QgsLayerTreeTransparencyWidget* QgsLayerTreeTransparencyWidget::Provider::createWidget( QgsMapLayer* layer, int widgetIndex )
{
Q_UNUSED( widgetIndex );
return new QgsLayerTreeTransparencyWidget( layer );
}

bool QgsLayerTreeTransparencyWidget::Provider::supportsLayer( QgsMapLayer* layer )
{
return layer->type() == QgsMapLayer::VectorLayer || layer->type() == QgsMapLayer::RasterLayer;
}
60 changes: 60 additions & 0 deletions src/gui/layertree/qgslayertreeembeddedwidgetsimpl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/***************************************************************************
qgslayertreeembeddedwidgetsimpl.h
--------------------------------------
Date : May 2016
Copyright : (C) 2016 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSLAYERTREEEMBEDDEDWIDGETSIMPL_H
#define QGSLAYERTREEEMBEDDEDWIDGETSIMPL_H

#include <QWidget>
#include "qgslayertreeembeddedwidgetregistry.h"


class QSlider;
class QTimer;
class QgsMapLayer;

/**
* @brief Implementation of simple transparency widget to be used in layer tree view
*
* @note private class - not in QGIS API
*/
class QgsLayerTreeTransparencyWidget : public QWidget
{
Q_OBJECT
public:
QgsLayerTreeTransparencyWidget( QgsMapLayer* layer );

virtual QSize sizeHint() const override;

class Provider : public QgsLayerTreeEmbeddedWidgetProvider
{
public:
virtual QString id() const override;
virtual QString name() const override;
virtual QgsLayerTreeTransparencyWidget* createWidget( QgsMapLayer* layer, int widgetIndex ) override;
virtual bool supportsLayer( QgsMapLayer *layer ) override;
};

public slots:
void sliderValueChanged( int value );
void updateTransparencyFromSlider();
void layerTrChanged();

private:
QgsMapLayer* mLayer;
QSlider* mSlider;
QTimer* mTimer;
};

#endif // QGSLAYERTREEEMBEDDEDWIDGETSIMPL_H
23 changes: 23 additions & 0 deletions src/gui/layertree/qgslayertreeview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "qgslayertreeview.h"

#include "qgslayertree.h"
#include "qgslayertreeembeddedwidgetregistry.h"
#include "qgslayertreemodel.h"
#include "qgslayertreemodellegendnode.h"
#include "qgslayertreeviewdefaultactions.h"
Expand All @@ -24,6 +25,7 @@
#include <QMenu>
#include <QContextMenuEvent>


QgsLayerTreeView::QgsLayerTreeView( QWidget *parent )
: QTreeView( parent )
, mDefaultActions( nullptr )
Expand Down Expand Up @@ -129,6 +131,27 @@ void QgsLayerTreeView::modelRowsInserted( const QModelIndex& index, int start, i
if ( !parentNode )
return;

// Embedded widgets - replace placeholders in the model by actual widgets
if ( layerTreeModel()->testFlag( QgsLayerTreeModel::UseEmbeddedWidgets ) && QgsLayerTree::isLayer( parentNode ) )
{
QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( parentNode );
if ( QgsMapLayer* layer = nodeLayer->layer() )
{
int widgetsCount = layer->customProperty( "embeddedWidgets/count", 0 ).toInt();
QList<QgsLayerTreeModelLegendNode*> legendNodes = layerTreeModel()->layerLegendNodes( nodeLayer );
for ( int i = 0; i < widgetsCount; ++i )
{
QString providerId = layer->customProperty( QString( "embeddedWidgets/%1/id" ).arg( i ) ).toString();
if ( QgsLayerTreeEmbeddedWidgetProvider* provider = QgsLayerTreeEmbeddedWidgetRegistry::instance()->provider( providerId ) )
{
QModelIndex index = layerTreeModel()->legendNode2index( legendNodes[i] );
setIndexWidget( index, provider->createWidget( layer, i ) );
}
}
}
}


if ( QgsLayerTree::isLayer( parentNode ) )
{
// if ShowLegendAsTree flag is enabled in model, we may need to expand some legend nodes
Expand Down
3 changes: 2 additions & 1 deletion src/plugins/georeferencer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,9 @@ ADD_LIBRARY (georefplugin MODULE ${GEOREF_SRCS} ${GEOREF_MOC_SRCS} ${GEOREF_RCC_
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/../../ui
../../core ../../core/geometry ../../core/raster ../../core/composer
../../gui ../../gui/editorwidgets
../../gui ../../gui/editorwidgets ../../gui/layertree
..
)
INCLUDE_DIRECTORIES(SYSTEM
Expand Down
95 changes: 95 additions & 0 deletions src/ui/qgslayertreeembeddedconfigwidget.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QgsLayerTreeEmbeddedConfigWidget</class>
<widget class="QWidget" name="QgsLayerTreeEmbeddedConfigWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>580</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Available widgets</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Used widgets</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QListView" name="mListAvailable"/>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="mBtnAdd">
<property name="text">
<string>-&gt;</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionArrowRight.png</normaloff>:/images/themes/default/mActionArrowRight.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mBtnRemove">
<property name="text">
<string>&lt;-</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionArrowLeft.png</normaloff>:/images/themes/default/mActionArrowLeft.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="2">
<widget class="QListView" name="mListUsed"/>
</item>
</layout>
</widget>
<resources>
<include location="../../images/images.qrc"/>
</resources>
<connections/>
</ui>
85 changes: 58 additions & 27 deletions src/ui/qgsrasterlayerpropertiesbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,15 @@
<normaloff>:/images/themes/default/propertyicons/metadata.png</normaloff>:/images/themes/default/propertyicons/metadata.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Legend</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/legend.svg</normaloff>:/images/themes/default/legend.svg</iconset>
</property>
</item>
</widget>
</item>
</layout>
Expand Down Expand Up @@ -229,8 +238,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>617</width>
<height>541</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
Expand Down Expand Up @@ -454,8 +463,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>603</width>
<height>544</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
Expand Down Expand Up @@ -1085,8 +1094,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>617</width>
<height>541</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
Expand Down Expand Up @@ -1501,8 +1510,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>659</width>
<height>527</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
Expand Down Expand Up @@ -1565,8 +1574,8 @@
<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:'Ubuntu'; font-size:11pt; 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';&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:13pt; 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>
</item>
Expand Down Expand Up @@ -1671,8 +1680,8 @@ p, li { white-space: pre-wrap; }
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>617</width>
<height>541</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_16">
Expand Down Expand Up @@ -1729,9 +1738,9 @@ p, li { white-space: pre-wrap; }
<property name="geometry">
<rect>
<x>0</x>
<y>-99</y>
<width>599</width>
<height>641</height>
<y>0</y>
<width>603</width>
<height>697</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_12">
Expand Down Expand Up @@ -2120,6 +2129,22 @@ p, li { white-space: pre-wrap; }
</item>
</layout>
</widget>
<widget class="QWidget" name="mOptsPage_Legend">
<layout class="QVBoxLayout" name="verticalLayout_18">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Embedded widgets in legend</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
<item>
<widget class="QgsLayerTreeEmbeddedConfigWidget" name="mLegendConfigEmbeddedWidget" native="true"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
Expand Down Expand Up @@ -2169,34 +2194,40 @@ p, li { white-space: pre-wrap; }
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsColorButtonV2</class>
<extends>QToolButton</extends>
<header>qgscolorbuttonv2.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsProjectionSelectionWidget</class>
<extends>QWidget</extends>
<header>qgsprojectionselectionwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsScaleRangeWidget</class>
<extends>QWidget</extends>
<header>qgsscalerangewidget.h</header>
</customwidget>
<customwidget>
<class>QgsBlendModeComboBox</class>
<extends>QComboBox</extends>
<header>qgsblendmodecombobox.h</header>
<class>QgsLayerTreeEmbeddedConfigWidget</class>
<extends>QWidget</extends>
<header>qgslayertreeembeddedconfigwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsProjectionSelectionWidget</class>
<extends>QWidget</extends>
<header location="global">qgsprojectionselectionwidget.h</header>
<class>QgsColorButtonV2</class>
<extends>QToolButton</extends>
<header>qgscolorbuttonv2.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsBlendModeComboBox</class>
<extends>QComboBox</extends>
<header>qgsblendmodecombobox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mOptionsListWidget</tabstop>
Expand Down
321 changes: 275 additions & 46 deletions src/ui/qgsvectorlayerpropertiesbase.ui

Large diffs are not rendered by default.