QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
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 #include "qgsmaplayer.h"
24 
26 
27 QgsLayerTreeOpacityWidget::QgsLayerTreeOpacityWidget( QgsMapLayer *layer )
28  : mLayer( layer )
29 {
30  setAutoFillBackground( true ); // override the content from model
31  QLabel *l = new QLabel( tr( "Opacity" ), this );
32  mSlider = new QSlider( Qt::Horizontal, this );
33  mSlider->setRange( 0, 1000 );
34 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
35  int sliderW = static_cast< int >( QFontMetricsF( font() ).width( 'X' ) * 16 * Qgis::UI_SCALE_FACTOR );
36 #else
37  int sliderW = static_cast< int >( QFontMetricsF( font() ).horizontalAdvance( 'X' ) * 16 * Qgis::UI_SCALE_FACTOR );
38 #endif
39  mSlider->setMinimumWidth( sliderW / 2 );
40  mSlider->setMaximumWidth( sliderW );
41  QHBoxLayout *lay = new QHBoxLayout();
42  QSpacerItem *spacerItem = new QSpacerItem( 1, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum );
43  lay->addWidget( l );
44  lay->addWidget( mSlider );
45  lay->addItem( spacerItem );
46  setLayout( lay );
47 
48  // timer for delayed transparency update - for more responsive GUI
49  mTimer = new QTimer( this );
50  mTimer->setSingleShot( true );
51  mTimer->setInterval( 100 );
52  connect( mTimer, &QTimer::timeout, this, &QgsLayerTreeOpacityWidget::updateOpacityFromSlider );
53 
54  connect( mSlider, &QAbstractSlider::valueChanged, this, &QgsLayerTreeOpacityWidget::sliderValueChanged );
55 
56  // init from layer
57  mSlider->setValue( mLayer->opacity() * 1000.0 );
58  connect( mLayer, &QgsMapLayer::opacityChanged, this, &QgsLayerTreeOpacityWidget::layerTrChanged );
59 }
60 
61 QSize QgsLayerTreeOpacityWidget::sizeHint() const
62 {
63  return QWidget::sizeHint();
64  //return QSize(200,200); // horizontal seems ignored, vertical is used for spacing
65 }
66 
67 void QgsLayerTreeOpacityWidget::sliderValueChanged( int value )
68 {
69  Q_UNUSED( value )
70 
71  if ( mTimer->isActive() )
72  return;
73  mTimer->start();
74 }
75 
76 void QgsLayerTreeOpacityWidget::updateOpacityFromSlider()
77 {
78  int value = mSlider->value();
79  mLayer->setOpacity( value / 1000.0 );
80  mLayer->triggerRepaint();
81 }
82 
83 void QgsLayerTreeOpacityWidget::layerTrChanged()
84 {
85  mSlider->blockSignals( true );
86  mSlider->setValue( mLayer->opacity() * 1000.0 );
87  mSlider->blockSignals( false );
88 }
89 
90 //
91 
92 QString QgsLayerTreeOpacityWidget::Provider::id() const
93 {
94  return QStringLiteral( "transparency" );
95 }
96 
97 QString QgsLayerTreeOpacityWidget::Provider::name() const
98 {
99  return tr( "Opacity slider" );
100 }
101 
102 QgsLayerTreeOpacityWidget *QgsLayerTreeOpacityWidget::Provider::createWidget( QgsMapLayer *layer, int widgetIndex )
103 {
104  Q_UNUSED( widgetIndex )
105  return new QgsLayerTreeOpacityWidget( layer );
106 }
107 
108 bool QgsLayerTreeOpacityWidget::Provider::supportsLayer( QgsMapLayer * )
109 {
110  return true;
111 }
112 
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition: qgis.h:183
Base class for all map layer types.
Definition: qgsmaplayer.h:85
void opacityChanged(double opacity)
Emitted when the layer's opacity is changed, where opacity is a value between 0 (transparent) and 1 (...