mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-08 00:05:09 -04:00
When rendering layout legends, respect exclude-by-default flag
This commit is contained in:
parent
88c261259c
commit
c549f43bf9
@ -59,7 +59,6 @@ Emitted to refresh the legend.
|
||||
};
|
||||
|
||||
|
||||
|
||||
class QgsLayoutItemLegend : QgsLayoutItem
|
||||
{
|
||||
%Docstring(signature="appended")
|
||||
|
@ -59,7 +59,6 @@ Emitted to refresh the legend.
|
||||
};
|
||||
|
||||
|
||||
|
||||
class QgsLayoutItemLegend : QgsLayoutItem
|
||||
{
|
||||
%Docstring(signature="appended")
|
||||
|
@ -40,12 +40,50 @@
|
||||
#include "qgslayoutreportcontext.h"
|
||||
#include "qgslayertreefiltersettings.h"
|
||||
#include "qgsreferencedgeometry.h"
|
||||
#include "qgsmaplayerlegend.h"
|
||||
|
||||
#include <QDomDocument>
|
||||
#include <QDomElement>
|
||||
#include <QPainter>
|
||||
#include "qgsexpressioncontext.h"
|
||||
|
||||
//
|
||||
// QgsLegendFilterProxyModel
|
||||
//
|
||||
|
||||
QgsLegendFilterProxyModel::QgsLegendFilterProxyModel( QObject *parent )
|
||||
: QgsLayerTreeFilterProxyModel( parent )
|
||||
{
|
||||
setIsDefaultLegend( true );
|
||||
}
|
||||
|
||||
void QgsLegendFilterProxyModel::setIsDefaultLegend( bool isDefault )
|
||||
{
|
||||
mIsDefaultLegend = isDefault;
|
||||
|
||||
// only show private layers when not in default mode
|
||||
setShowPrivateLayers( !mIsDefaultLegend );
|
||||
|
||||
invalidateFilter();
|
||||
}
|
||||
|
||||
bool QgsLegendFilterProxyModel::layerShown( QgsMapLayer *layer ) const
|
||||
{
|
||||
if ( !layer )
|
||||
return true;
|
||||
|
||||
if ( QgsMapLayerLegend *layerLegend = layer->legend(); mIsDefaultLegend && layerLegend->flags().testFlag( Qgis::MapLayerLegendFlag::ExcludeByDefault ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// QgsLayoutItemLegend
|
||||
//
|
||||
|
||||
QgsLayoutItemLegend::QgsLayoutItemLegend( QgsLayout *layout )
|
||||
: QgsLayoutItem( layout )
|
||||
, mLegendModel( new QgsLegendModel( nullptr, this ) )
|
||||
@ -330,9 +368,8 @@ QgsLegendRenderer QgsLayoutItemLegend::createRenderer() const
|
||||
{
|
||||
QgsLegendRenderer res( mLegendModel.get(), mSettings );
|
||||
|
||||
// only show private layers when not in auto update mode
|
||||
QgsLayerTreeFilterProxyModel *proxy = new QgsLayerTreeFilterProxyModel();
|
||||
proxy->setShowPrivateLayers( static_cast< bool >( mCustomLayerTree ) );
|
||||
QgsLegendFilterProxyModel *proxy = new QgsLegendFilterProxyModel();
|
||||
proxy->setIsDefaultLegend( !static_cast< bool >( mCustomLayerTree ) );
|
||||
res.setProxyModel( proxy );
|
||||
|
||||
return res;
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "qgis_sip.h"
|
||||
#include "qgslayoutitem.h"
|
||||
#include "qgslayertreemodel.h"
|
||||
#include "qgslayertreefilterproxymodel.h"
|
||||
#include "qgslegendsettings.h"
|
||||
#include "qgslayertree.h"
|
||||
#include "qgsexpressioncontext.h"
|
||||
@ -102,7 +103,37 @@ class CORE_EXPORT QgsLegendModel : public QgsLayerTreeModel
|
||||
|
||||
};
|
||||
|
||||
#ifndef SIP_RUN
|
||||
/**
|
||||
* \ingroup core
|
||||
* \brief A layout item subclass for map legend filtering.
|
||||
* \note Not available in Python bindings
|
||||
* \since QGIS 4.0
|
||||
*/
|
||||
class CORE_EXPORT QgsLegendFilterProxyModel : public QgsLayerTreeFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor for QgsLegendFilterProxyModel, with the specified \a parent object.
|
||||
*/
|
||||
QgsLegendFilterProxyModel( QObject *parent SIP_TRANSFERTHIS = nullptr );
|
||||
|
||||
/**
|
||||
* Sets whether the legend is showing the default legend for a project (as opposed
|
||||
* to a customised legend).
|
||||
*/
|
||||
void setIsDefaultLegend( bool isDefault );
|
||||
|
||||
private:
|
||||
|
||||
bool layerShown( QgsMapLayer *layer ) const override;
|
||||
|
||||
bool mIsDefaultLegend = true;
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \ingroup core
|
||||
|
@ -2046,6 +2046,70 @@ class TestQgsLayoutItemLegend(QgisTestCase, LayoutItemTestCase):
|
||||
|
||||
self.assertTrue(self.render_layout_check("composer_legend_auto_wrap", layout))
|
||||
|
||||
def test_exclude_from_default_legend(self):
|
||||
"""
|
||||
Test layer legend setting for excluding from default legends
|
||||
"""
|
||||
point_path = os.path.join(TEST_DATA_DIR, "points.shp")
|
||||
point_layer1 = QgsVectorLayer(point_path, "layer 1", "ogr")
|
||||
point_layer2 = QgsVectorLayer(point_path, "layer 2", "ogr")
|
||||
point_layer3 = QgsVectorLayer(point_path, "layer 3", "ogr")
|
||||
p = QgsProject()
|
||||
p.addMapLayers([point_layer1, point_layer2, point_layer3])
|
||||
|
||||
point_layer2.legend().setFlag(Qgis.MapLayerLegendFlag.ExcludeByDefault, True)
|
||||
|
||||
marker_symbol = QgsMarkerSymbol.createSimple(
|
||||
{
|
||||
"color": "#ff0000",
|
||||
"outline_style": "no",
|
||||
"size": "5",
|
||||
"size_unit": "MapUnit",
|
||||
}
|
||||
)
|
||||
|
||||
point_layer1.setRenderer(QgsSingleSymbolRenderer(marker_symbol.clone()))
|
||||
point_layer2.setRenderer(QgsSingleSymbolRenderer(marker_symbol.clone()))
|
||||
point_layer3.setRenderer(QgsSingleSymbolRenderer(marker_symbol.clone()))
|
||||
|
||||
layout = QgsLayout(p)
|
||||
layout.initializeDefaults()
|
||||
|
||||
legend = QgsLayoutItemLegend(layout)
|
||||
legend.setTitle("Legend")
|
||||
legend.attemptSetSceneRect(QRectF(120, 20, 80, 80))
|
||||
legend.setFrameEnabled(True)
|
||||
legend.setFrameStrokeWidth(QgsLayoutMeasurement(2))
|
||||
legend.setBackgroundColor(QColor(200, 200, 200))
|
||||
legend.setTitle("")
|
||||
layout.addLayoutItem(legend)
|
||||
legend.setResizeToContents(True)
|
||||
|
||||
legend.setStyleFont(
|
||||
QgsLegendStyle.Style.Title, QgsFontUtils.getStandardTestFont("Bold", 16)
|
||||
)
|
||||
legend.setStyleFont(
|
||||
QgsLegendStyle.Style.Group, QgsFontUtils.getStandardTestFont("Bold", 16)
|
||||
)
|
||||
legend.setStyleFont(
|
||||
QgsLegendStyle.Style.Subgroup, QgsFontUtils.getStandardTestFont("Bold", 16)
|
||||
)
|
||||
legend.setStyleFont(
|
||||
QgsLegendStyle.Style.Symbol, QgsFontUtils.getStandardTestFont("Bold", 16)
|
||||
)
|
||||
legend.setStyleFont(
|
||||
QgsLegendStyle.Style.SymbolLabel,
|
||||
QgsFontUtils.getStandardTestFont("Bold", 16),
|
||||
)
|
||||
|
||||
legend.refresh()
|
||||
legend.setResizeToContents(True)
|
||||
legend.updateLegend()
|
||||
|
||||
self.assertTrue(
|
||||
self.render_layout_check("composer_legend_exclude_by_default", layout)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
Binary file not shown.
After Width: | Height: | Size: 8.3 KiB |
Loading…
x
Reference in New Issue
Block a user