QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgslayertreeembeddedwidgetsimpl.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayertreeembeddedwidgetsimpl.h
3  --------------------------------------
4  Date : May 2016
5  Copyright : (C) 2016 by Martin Dobias
6  Email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
17 
18 #include <QFontMetrics>
19 #include <QHBoxLayout>
20 #include <QLabel>
21 #include <QSlider>
22 #include <QTimer>
23 
24 #include "qgsrasterlayer.h"
25 #include "qgsrasterrenderer.h"
26 #include "qgsvectorlayer.h"
27 
28 
30 
31 QgsLayerTreeOpacityWidget::QgsLayerTreeOpacityWidget( QgsMapLayer *layer )
32  : mLayer( layer )
33 {
34  setAutoFillBackground( true ); // override the content from model
35  QLabel *l = new QLabel( tr( "Opacity" ), this );
36  mSlider = new QSlider( Qt::Horizontal, this );
37  mSlider->setRange( 0, 1000 );
38 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
39  int sliderW = static_cast< int >( QFontMetricsF( font() ).width( 'X' ) * 16 * Qgis::UI_SCALE_FACTOR );
40 #else
41  int sliderW = static_cast< int >( QFontMetricsF( font() ).horizontalAdvance( 'X' ) * 16 * Qgis::UI_SCALE_FACTOR );
42 #endif
43  mSlider->setMinimumWidth( sliderW / 2 );
44  mSlider->setMaximumWidth( sliderW );
45  QHBoxLayout *lay = new QHBoxLayout();
46  QSpacerItem *spacerItem = new QSpacerItem( 1, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum );
47  lay->addWidget( l );
48  lay->addWidget( mSlider );
49  lay->addItem( spacerItem );
50  setLayout( lay );
51 
52  // timer for delayed transparency update - for more responsive GUI
53  mTimer = new QTimer( this );
54  mTimer->setSingleShot( true );
55  mTimer->setInterval( 100 );
56  connect( mTimer, &QTimer::timeout, this, &QgsLayerTreeOpacityWidget::updateOpacityFromSlider );
57 
58  connect( mSlider, &QAbstractSlider::valueChanged, this, &QgsLayerTreeOpacityWidget::sliderValueChanged );
59 
60  // init from layer
61  switch ( mLayer->type() )
62  {
64  {
65  QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mLayer );
66  mSlider->setValue( vl->opacity() * 1000.0 );
67  connect( vl, &QgsVectorLayer::opacityChanged, this, &QgsLayerTreeOpacityWidget::layerTrChanged );
68  break;
69  }
70 
72  {
73  mSlider->setValue( qobject_cast<QgsRasterLayer *>( mLayer )->renderer()->opacity() * 1000 );
74  // TODO: there is no signal for raster layers
75  break;
76  }
77 
82  break;
83 
84  }
85 }
86 
87 QSize QgsLayerTreeOpacityWidget::sizeHint() const
88 {
89  return QWidget::sizeHint();
90  //return QSize(200,200); // horizontal seems ignored, vertical is used for spacing
91 }
92 
93 void QgsLayerTreeOpacityWidget::sliderValueChanged( int value )
94 {
95  Q_UNUSED( value )
96 
97  if ( mTimer->isActive() )
98  return;
99  mTimer->start();
100 }
101 
102 void QgsLayerTreeOpacityWidget::updateOpacityFromSlider()
103 {
104  int value = mSlider->value();
105 
106  switch ( mLayer->type() )
107  {
109  {
110  qobject_cast<QgsVectorLayer *>( mLayer )->setOpacity( value / 1000.0 );
111  break;
112  }
114  {
115  qobject_cast<QgsRasterLayer *>( mLayer )->renderer()->setOpacity( value / 1000.0 );
116  break;
117  }
118 
123  break;
124  }
125 
126  mLayer->triggerRepaint();
127 }
128 
129 void QgsLayerTreeOpacityWidget::layerTrChanged()
130 {
131  mSlider->blockSignals( true );
132  mSlider->setValue( qobject_cast<QgsVectorLayer *>( mLayer )->opacity() * 1000.0 );
133  mSlider->blockSignals( false );
134 }
135 
136 //
137 
138 QString QgsLayerTreeOpacityWidget::Provider::id() const
139 {
140  return QStringLiteral( "transparency" );
141 }
142 
143 QString QgsLayerTreeOpacityWidget::Provider::name() const
144 {
145  return tr( "Opacity slider" );
146 }
147 
148 QgsLayerTreeOpacityWidget *QgsLayerTreeOpacityWidget::Provider::createWidget( QgsMapLayer *layer, int widgetIndex )
149 {
150  Q_UNUSED( widgetIndex )
151  return new QgsLayerTreeOpacityWidget( layer );
152 }
153 
154 bool QgsLayerTreeOpacityWidget::Provider::supportsLayer( QgsMapLayer *layer )
155 {
156  switch ( layer->type() )
157  {
160  return true;
161 
166  return false;
167  }
168  return false;
169 }
170 
qgsrasterlayer.h
QgsMapLayerType::MeshLayer
@ MeshLayer
Added in 3.2.
QgsMapLayerType::VectorLayer
@ VectorLayer
QgsVectorLayer::opacityChanged
void opacityChanged(double opacity)
Emitted when the layer's opacity is changed, where opacity is a value between 0 (transparent) and 1 (...
qgsrasterrenderer.h
QgsMapLayerType::RasterLayer
@ RasterLayer
Qgis::UI_SCALE_FACTOR
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition: qgis.h:182
qgsvectorlayer.h
QgsVectorLayer
Represents a vector layer which manages a vector based data sets.
Definition: qgsvectorlayer.h:387
QgsMapLayer
Base class for all map layer types.
Definition: qgsmaplayer.h:83
QgsMapLayerType::VectorTileLayer
@ VectorTileLayer
Added in 3.14.
QgsVectorLayer::opacity
double opacity
Definition: qgsvectorlayer.h:395
qgslayertreeembeddedwidgetsimpl.h
QgsMapLayerType::PluginLayer
@ PluginLayer
QgsMapLayer::type
QgsMapLayerType type
Definition: qgsmaplayer.h:90