QGIS API Documentation  3.22.4-Białowieża (ce8e65e95e)
qgsmeshvariablestrokewidthwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmeshvariablestrokewidthtwidget.cpp
3  -------------------------------------
4  begin : April 2020
5  copyright : (C) 2020 by Vincent Cloarec
6  email : vcloarec 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 <QDialog>
19 #include <QDialogButtonBox>
20 #include <QPointer>
21 
22 #include "qgssettings.h"
23 
25  const QgsInterpolatedLineWidth &variableStrokeWidth,
26  double defaultMinimumvalue,
27  double defaultMaximumValue,
28  QWidget *parent ):
29  QgsPanelWidget( parent ),
30  mDefaultMinimumValue( defaultMinimumvalue ),
31  mDefaultMaximumValue( defaultMaximumValue )
32 {
33  setupUi( this );
34 
35  mValueMinimumSpinBox->setSpecialValueText( QString( ) );
36  mValueMinimumSpinBox->setClearValueMode( QgsDoubleSpinBox::ClearValueMode::MinimumValue );
37  mValueMaximumSpinBox->setSpecialValueText( QString( ) );
38  mValueMaximumSpinBox->setClearValueMode( QgsDoubleSpinBox::ClearValueMode::MinimumValue );
39 
40  setPanelTitle( tr( "Variable Stroke Width" ) );
41 
43 
44  connect( mDefaultMinMaxButton, &QPushButton::clicked, this, &QgsMeshVariableStrokeWidthWidget::defaultMinMax );
45 
46  connect( mValueMinimumSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsMeshVariableStrokeWidthWidget::widgetChanged );
47  connect( mValueMaximumSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsMeshVariableStrokeWidthWidget::widgetChanged );
48  connect( mWidthMinimumSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsMeshVariableStrokeWidthWidget::widgetChanged );
49  connect( mWidthMaximumSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsMeshVariableStrokeWidthWidget::widgetChanged );
50  connect( mIgnoreOutOfRangecheckBox, &QCheckBox::toggled, this, &QgsMeshVariableStrokeWidthWidget::widgetChanged );
51  connect( mUseAbsoluteValueCheckBox, &QCheckBox::toggled, this, &QgsMeshVariableStrokeWidthWidget::widgetChanged );
52 }
53 
55 {
56  whileBlocking( mValueMinimumSpinBox )->setValue( variableStrokeWidth.minimumValue() );
57  whileBlocking( mValueMaximumSpinBox )->setValue( variableStrokeWidth.maximumValue() );
58  whileBlocking( mWidthMinimumSpinBox )->setValue( variableStrokeWidth.minimumWidth() );
59  whileBlocking( mWidthMaximumSpinBox )->setValue( variableStrokeWidth.maximumWidth() );
60  whileBlocking( mIgnoreOutOfRangecheckBox )->setChecked( variableStrokeWidth.ignoreOutOfRange() );
61  whileBlocking( mUseAbsoluteValueCheckBox )->setChecked( variableStrokeWidth.useAbsoluteValue() );
62 }
63 
64 void QgsMeshVariableStrokeWidthButton::setDefaultMinMaxValue( double minimum, double maximum )
65 {
66  mMinimumDefaultValue = minimum;
67  mMaximumDefaultValue = maximum;
68 }
69 
71 {
72  QgsInterpolatedLineWidth strokeWidth;
73  strokeWidth.setMinimumValue( lineEditValue( mValueMinimumSpinBox ) );
74  strokeWidth.setMaximumValue( lineEditValue( mValueMaximumSpinBox ) );
75  strokeWidth.setMinimumWidth( mWidthMinimumSpinBox->value() );
76  strokeWidth.setMaximumWidth( mWidthMaximumSpinBox->value() );
77  strokeWidth.setIgnoreOutOfRange( mIgnoreOutOfRangecheckBox->isChecked() );
78  strokeWidth.setUseAbsoluteValue( mUseAbsoluteValueCheckBox->isChecked() );
79  return strokeWidth;
80 }
81 
82 void QgsMeshVariableStrokeWidthWidget::defaultMinMax()
83 {
84  whileBlocking( mValueMinimumSpinBox )->setValue( mDefaultMinimumValue );
85  whileBlocking( mValueMaximumSpinBox )->setValue( mDefaultMaximumValue );
86  emit widgetChanged();
87 }
88 
90 {
91  updateText();
92  connect( this, &QPushButton::clicked, this, &QgsMeshVariableStrokeWidthButton::openWidget );
93 }
94 
96 {
97  return mVariableStrokeWidth;
98 }
99 
101 {
102  mVariableStrokeWidth = variableStrokeWidth;
103  updateText();
104 }
105 
106 void QgsMeshVariableStrokeWidthButton::openWidget()
107 {
110  new QgsMeshVariableStrokeWidthWidget( mVariableStrokeWidth,
111  mMinimumDefaultValue,
112  mMaximumDefaultValue,
113  panel );
114 
115  if ( panel && panel->dockMode() )
116  {
117  connect( widget, &QgsMeshVariableStrokeWidthWidget::widgetChanged, this, [this, widget]
118  {
119  // Update strokeWidth toward button
120  this->setVariableStrokeWidth( widget->variableStrokeWidth() );
121  this->emit widgetChanged();
122  } );
123 
124  panel->openPanel( widget );
125  return;
126  }
127  else
128  {
129  // Show the dialog version if not in a panel
130  QDialog *dlg = new QDialog( this );
131  const QString key = QStringLiteral( "/UI/paneldialog/%1" ).arg( widget->panelTitle() );
132  QgsSettings settings;
133  dlg->restoreGeometry( settings.value( key ).toByteArray() );
134  dlg->setWindowTitle( widget->panelTitle() );
135  dlg->setLayout( new QVBoxLayout() );
136  dlg->layout()->addWidget( widget );
137  QDialogButtonBox *buttonBox = new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Ok );
138  connect( buttonBox, &QDialogButtonBox::accepted, dlg, &QDialog::accept );
139  connect( buttonBox, &QDialogButtonBox::rejected, dlg, &QDialog::reject );
140  dlg->layout()->addWidget( buttonBox );
141 
142  if ( dlg->exec() == QDialog::Accepted )
143  {
144  this->setVariableStrokeWidth( widget->variableStrokeWidth() );
145  emit widgetChanged();
146  }
147  settings.setValue( key, dlg->saveGeometry() );
148  }
149 }
150 
151 void QgsMeshVariableStrokeWidthButton::updateText()
152 {
153  setText( QString( "%1 - %2" ).
154  arg( QLocale().toString( mVariableStrokeWidth.minimumWidth(), 'g', 3 ),
155  QLocale().toString( mVariableStrokeWidth.maximumWidth(), 'g', 3 ) ) );
156 }
157 
158 double QgsMeshVariableStrokeWidthWidget::lineEditValue( const QgsDoubleSpinBox *lineEdit ) const
159 {
160  if ( lineEdit->value() == lineEdit->clearValue() )
161  {
162  return std::numeric_limits<double>::quiet_NaN();
163  }
164 
165  return lineEdit->value();
166 }
167 
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
Represents a width than can vary depending on values.
void setUseAbsoluteValue(bool useAbsoluteValue)
Sets whether absolute value are used as input.
double minimumValue() const
Returns the minimum value used to defined the variable width.
void setIgnoreOutOfRange(bool ignoreOutOfRange)
Sets whether the variable width ignores out of range value.
void setMaximumValue(double maximumValue)
Sets the maximum value used to defined the variable width.
bool useAbsoluteValue() const
Returns whether absolute value are used as input.
void setMinimumValue(double minimumValue)
Sets the minimum value used to defined the variable width.
double maximumWidth() const
Returns the maximum width used to defined the variable width.
void setMaximumWidth(double maximumWidth)
Sets the maximum width used to defined the variable width.
double maximumValue() const
Returns the maximum value used to defined the variable width.
void setMinimumWidth(double minimumWidth)
Sets the minimum width used to defined the variable width.
bool ignoreOutOfRange() const
Returns whether the variable width ignores out of range value.
double minimumWidth() const
Returns the minimum width used to defined the variable width.
void setDefaultMinMaxValue(double minimum, double maximum)
Sets the default min/max values that will be reload if needed.
QgsMeshVariableStrokeWidthButton(QWidget *parent=nullptr)
Constructor.
void setVariableStrokeWidth(const QgsInterpolatedLineWidth &variableStrokeWidth)
Sets the variable stroke width.
QgsInterpolatedLineWidth variableStrokeWidth() const
Returns the variable stroke width.
A widget to set parameters of variable stroke width.
QgsMeshVariableStrokeWidthWidget(const QgsInterpolatedLineWidth &variableStrokeWidth, double defaultMinimumvalue, double defaultMaximumValue, QWidget *parent=nullptr)
Constructor.
QgsInterpolatedLineWidth variableStrokeWidth() const
Returns the variable stroke width.
void setVariableStrokeWidth(const QgsInterpolatedLineWidth &variableStrokeWidth)
Sets the variable stroke width.
Base class for any widget that can be shown as a inline panel.
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
QString panelTitle()
The title of the panel.
void widgetChanged()
Emitted when the widget state changes.
static QgsPanelWidget * findParentPanel(QWidget *widget)
Traces through the parents of a widget to find if it is contained within a QgsPanelWidget widget.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
bool dockMode()
Returns the dock mode state.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:1185