QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
qgstableeditorformattingwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstableeditorformattingwidget.cpp
3  ------------------------
4  begin : January 2020
5  copyright : (C) 2020 by Nyall Dawson
6  email : nyall dot dawson 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 
18 #include "qgsnumericformat.h"
19 #include "qgis.h"
20 #include "qgsproperty.h"
21 #include <QPointer>
22 
24  : QgsPanelWidget( parent )
25 {
26  setupUi( this );
27  setPanelTitle( tr( "Cell Contents" ) );
28 
29  mFormatNumbersCheckBox->setTristate( false );
30 
31  mFontButton->setShowNullFormat( true );
32  mFontButton->setNoFormatString( tr( "Clear Formatting" ) );
33 
34  mBackgroundColorButton->setAllowOpacity( true );
35  mBackgroundColorButton->setColorDialogTitle( tr( "Background Color" ) );
36  mBackgroundColorButton->setDefaultColor( QColor( 255, 255, 255 ) );
37  mBackgroundColorButton->setShowNull( true );
38 
39  mHorizontalAlignComboBox->setAvailableAlignments( Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight | Qt::AlignJustify );
40  mVerticalAlignComboBox->setAvailableAlignments( Qt::AlignTop | Qt::AlignVCenter | Qt::AlignBottom );
41 
42  mRowHeightSpinBox->setClearValue( 0, tr( "Automatic" ) );
43  mColumnWidthSpinBox->setClearValue( 0, tr( "Automatic" ) );
44 
45  connect( mBackgroundColorButton, &QgsColorButton::colorChanged, this, [ = ]
46  {
47  if ( !mBlockSignals )
48  emit backgroundColorChanged( mBackgroundColorButton->color() );
49  } );
50  connect( mBackgroundColorButton, &QgsColorButton::cleared, this, [ = ]
51  {
52  if ( !mBlockSignals )
53  emit backgroundColorChanged( QColor() );
54  } );
55 
56  connect( mFormatNumbersCheckBox, &QCheckBox::stateChanged, this, [ = ]( int state )
57  {
58  mCustomizeFormatButton->setEnabled( state == Qt::Checked );
59  if ( state != Qt::PartiallyChecked )
60  mFormatNumbersCheckBox->setTristate( false );
61  if ( !mBlockSignals )
62  emit numberFormatChanged();
63  } );
64 
65  connect( mFontButton, &QgsFontButton::changed, this, [ = ]
66  {
67  if ( !mBlockSignals )
68  emit textFormatChanged();
69  } );
70 
71  mCustomizeFormatButton->setEnabled( false );
72  connect( mCustomizeFormatButton, &QPushButton::clicked, this, [ = ]
73  {
75  widget->setFormat( mNumericFormat.get() );
76  widget->setPanelTitle( tr( "Number Format" ) );
77  connect( widget, &QgsNumericFormatSelectorWidget::changed, this, [ = ]
78  {
79  mNumericFormat.reset( widget->format() );
80  emit numberFormatChanged();
81  } );
82  openPanel( widget );
83  } );
84 
85  connect( mRowHeightSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, [ = ]( double height )
86  {
87  if ( !mBlockSignals )
88  {
89  emit rowHeightChanged( height );
90 
91  mBlockSignals++;
92  mRowHeightSpinBox->setClearValue( 0, tr( "Automatic" ) );
93  mBlockSignals--;
94  }
95  } );
96  connect( mColumnWidthSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, [ = ]( double width )
97  {
98  if ( !mBlockSignals )
99  {
100  emit columnWidthChanged( width );
101 
102  mBlockSignals++;
103  mColumnWidthSpinBox->setClearValue( 0, tr( "Automatic" ) );
104  mBlockSignals--;
105  }
106  } );
107 
108  connect( mHorizontalAlignComboBox, &QgsAlignmentComboBox::changed, this, [ = ]
109  {
110  if ( !mBlockSignals )
111  {
112  emit horizontalAlignmentChanged( mHorizontalAlignComboBox->currentAlignment() );
113  }
114  } );
115 
116  connect( mVerticalAlignComboBox, &QgsAlignmentComboBox::changed, this, [ = ]
117  {
118  if ( !mBlockSignals )
119  {
120  emit verticalAlignmentChanged( mVerticalAlignComboBox->currentAlignment() );
121  }
122  } );
123 
124  connect( mExpressionEdit, qOverload<const QString &>( &QgsFieldExpressionWidget::fieldChanged ), this, [ = ]( const QString & expression )
125  {
126  if ( !mBlockSignals )
127  {
128  emit cellPropertyChanged( expression.isEmpty() ? QgsProperty() : QgsProperty::fromExpression( expression ) );
129  }
130  } );
131 
132  mExpressionEdit->setAllowEmptyFieldName( true );
133 
134  mExpressionEdit->registerExpressionContextGenerator( this );
135  mFontButton->registerExpressionContextGenerator( this );
136 }
137 
139 {
140  if ( !mNumericFormat || mFormatNumbersCheckBox->checkState() != Qt::Checked )
141  return nullptr;
142 
143  return mNumericFormat->clone();
144 }
145 
147 {
148  return mFontButton->textFormat();
149 }
150 
152 {
153  mBlockSignals++;
154  mBackgroundColorButton->setColor( color );
155  mBlockSignals--;
156 }
157 
159 {
160  mNumericFormat.reset( format ? format->clone() : nullptr );
161  mBlockSignals++;
162  mFormatNumbersCheckBox->setTristate( isMixedFormat );
163  mFormatNumbersCheckBox->setCheckState( isMixedFormat ? Qt::PartiallyChecked : ( mNumericFormat.get() ? Qt::Checked : Qt::Unchecked ) );
164  mBlockSignals--;
165 }
166 
168 {
169  mBlockSignals++;
170  mFontButton->setTextFormat( format );
171  mBlockSignals--;
172 }
173 
175 {
176  mBlockSignals++;
177  if ( height < 0 )
178  mRowHeightSpinBox->setClearValue( 0, tr( "Mixed" ) );
179  else
180  mRowHeightSpinBox->setClearValue( 0, tr( "Automatic" ) );
181  mRowHeightSpinBox->setValue( height < 0 ? 0 : height );
182  mBlockSignals--;
183 }
184 
186 {
187  mBlockSignals++;
188  if ( width < 0 )
189  mColumnWidthSpinBox->setClearValue( 0, tr( "Mixed" ) );
190  else
191  mColumnWidthSpinBox->setClearValue( 0, tr( "Automatic" ) );
192  mColumnWidthSpinBox->setValue( width < 0 ? 0 : width );
193  mBlockSignals--;
194 }
195 
197 {
198  mBlockSignals++;
199  if ( alignment & Qt::AlignHorizontal_Mask && alignment & Qt::AlignVertical_Mask )
200  mHorizontalAlignComboBox->setCurrentIndex( -1 );
201  else
202  mHorizontalAlignComboBox->setCurrentAlignment( alignment );
203  mBlockSignals--;
204 }
205 
207 {
208  mBlockSignals++;
209  if ( alignment & Qt::AlignHorizontal_Mask && alignment & Qt::AlignVertical_Mask )
210  mVerticalAlignComboBox->setCurrentIndex( -1 );
211  else
212  mVerticalAlignComboBox->setCurrentAlignment( alignment );
213  mBlockSignals--;
214 }
215 
217 {
218  mBlockSignals++;
219  if ( !property.isActive() )
220  mExpressionEdit->setExpression( QString() );
221  else
222  mExpressionEdit->setExpression( property.asExpression() );
223  mBlockSignals--;
224 }
225 
227 {
228  mContextGenerator = generator;
229 }
230 
232 {
233  QgsExpressionContext context;
234  if ( mContextGenerator )
235  context = mContextGenerator->createExpressionContext();
236 
238  // TODO -- could set real row/column numbers here, in certain circumstances...
239  cellScope->setVariable( QStringLiteral( "row_number" ), 0 );
240  cellScope->setVariable( QStringLiteral( "column_number" ), 0 );
241  context.appendScope( cellScope );
242 
243  context.setHighlightedVariables( QStringList() << QStringLiteral( "row_number" ) << QStringLiteral( "column_number" ) );
244  return context;
245 }
246 
QgsExpressionContext
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Definition: qgsexpressioncontext.h:406
QgsProperty::isActive
bool isActive() const
Returns whether the property is currently active.
Definition: qgsproperty.cpp:291
QgsTableEditorFormattingWidget::setHorizontalAlignment
void setHorizontalAlignment(Qt::Alignment alignment)
Sets the horizontal alignment to show in the widget.
Definition: qgstableeditorformattingwidget.cpp:196
QgsTableEditorFormattingWidget::cellPropertyChanged
void cellPropertyChanged(const QgsProperty &property)
Emitted when the cell contents property shown in the widget is changed.
QgsProperty
A store for object properties.
Definition: qgsproperty.h:230
QgsExpressionContextScope::setVariable
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
Definition: qgsexpressioncontext.cpp:83
QgsTableEditorFormattingWidget::setVerticalAlignment
void setVerticalAlignment(Qt::Alignment alignment)
Sets the vertical alignment to show in the widget.
Definition: qgstableeditorformattingwidget.cpp:206
QgsTableEditorFormattingWidget::QgsTableEditorFormattingWidget
QgsTableEditorFormattingWidget(QWidget *parent=nullptr)
Constructor for QgsTableEditorFormattingWidget with the specified parent widget.
Definition: qgstableeditorformattingwidget.cpp:23
QgsNumericFormatSelectorWidget::format
QgsNumericFormat * format() const
Returns a new format object representing the settings currently configured in the widget.
Definition: qgsnumericformatselectorwidget.cpp:73
QgsPanelWidget::openPanel
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
Definition: qgspanelwidget.cpp:84
QgsProperty::asExpression
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
Definition: qgsproperty.cpp:398
qgis.h
QgsTableEditorFormattingWidget::horizontalAlignmentChanged
void horizontalAlignmentChanged(Qt::Alignment alignment)
Emitted when the horizontal alignment shown in the widget is changed.
QgsNumericFormat
A numeric formatter allows for formatting a numeric value for display, using a variety of different f...
Definition: qgsnumericformat.h:259
QgsProperty::fromExpression
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
Definition: qgsproperty.cpp:237
QgsTableEditorFormattingWidget::registerExpressionContextGenerator
void registerExpressionContextGenerator(QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
Definition: qgstableeditorformattingwidget.cpp:226
QgsTableEditorFormattingWidget::verticalAlignmentChanged
void verticalAlignmentChanged(Qt::Alignment alignment)
Emitted when the vertical alignment shown in the widget is changed.
QgsNumericFormatSelectorWidget
A widget which allows choice of numeric formats and the properties of them.
Definition: qgsnumericformatselectorwidget.h:34
QgsTableEditorFormattingWidget::numericFormat
QgsNumericFormat * numericFormat()
Returns the current numeric format shown in the widget, or a nullptr if no numeric format is set.
Definition: qgstableeditorformattingwidget.cpp:138
QgsColorButton::colorChanged
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
QgsNumericFormatSelectorWidget::setFormat
void setFormat(const QgsNumericFormat *format)
Sets the format to show in the widget.
Definition: qgsnumericformatselectorwidget.cpp:51
QgsTextFormat
Container for all settings relating to text rendering.
Definition: qgstextformat.h:40
QgsTableEditorFormattingWidget::numberFormatChanged
void numberFormatChanged()
Emitted whenever the numeric format shown in the widget is changed.
QgsPanelWidget
Base class for any widget that can be shown as a inline panel.
Definition: qgspanelwidget.h:29
QgsTableEditorFormattingWidget::setColumnWidth
void setColumnWidth(double width)
Sets the column width to show in the widget, or 0 for automatic width.
Definition: qgstableeditorformattingwidget.cpp:185
QgsTableEditorFormattingWidget::~QgsTableEditorFormattingWidget
~QgsTableEditorFormattingWidget() override
QgsFieldExpressionWidget::fieldChanged
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
QgsTableEditorFormattingWidget::textFormatChanged
void textFormatChanged()
Emitted whenever the text format shown in the widget is changed.
qgsnumericformatselectorwidget.h
QgsTableEditorFormattingWidget::textFormat
QgsTextFormat textFormat() const
Returns the current text format shown in the widget.
Definition: qgstableeditorformattingwidget.cpp:146
QgsTableEditorFormattingWidget::columnWidthChanged
void columnWidthChanged(double width)
Emitted whenever the column width shown in the widget is changed.
QgsExpressionContextGenerator::createExpressionContext
virtual QgsExpressionContext createExpressionContext() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsTableEditorFormattingWidget::setRowHeight
void setRowHeight(double height)
Sets the row height to show in the widget, or 0 for automatic height.
Definition: qgstableeditorformattingwidget.cpp:174
QgsPanelWidget::setPanelTitle
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
Definition: qgspanelwidget.h:44
QgsTableEditorFormattingWidget::setNumericFormat
void setNumericFormat(QgsNumericFormat *format, bool isMixedFormat)
Sets the numeric format to show in the widget, or nullptr if no numeric format is set.
Definition: qgstableeditorformattingwidget.cpp:158
QgsExpressionContextScope
Single scope for storing variables and functions for use within a QgsExpressionContext....
Definition: qgsexpressioncontext.h:113
qgsnumericformat.h
QgsExpressionContext::appendScope
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
Definition: qgsexpressioncontext.cpp:494
QgsTableEditorFormattingWidget::createExpressionContext
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Definition: qgstableeditorformattingwidget.cpp:231
QgsTableEditorFormattingWidget::setCellProperty
void setCellProperty(const QgsProperty &property)
Sets the cell content's property to show in the widget.
Definition: qgstableeditorformattingwidget.cpp:216
qgsproperty.h
QgsTableEditorFormattingWidget::backgroundColorChanged
void backgroundColorChanged(const QColor &color)
Emitted whenever the cell background color is changed in the widget.
QgsExpressionContext::setHighlightedVariables
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
Definition: qgsexpressioncontext.cpp:328
QgsColorButton::cleared
void cleared()
Emitted when the color is cleared (set to null).
QgsNumericFormat::clone
virtual QgsNumericFormat * clone() const =0
Clones the format, returning a new object.
QgsTableEditorFormattingWidget::setBackgroundColor
void setBackgroundColor(const QColor &color)
Sets the cell background color to show in the widget.
Definition: qgstableeditorformattingwidget.cpp:151
QgsExpressionContextGenerator
Abstract interface for generating an expression context.
Definition: qgsexpressioncontextgenerator.h:36
QgsTableEditorFormattingWidget::setTextFormat
void setTextFormat(const QgsTextFormat &format)
Sets the text format to show in the widget.
Definition: qgstableeditorformattingwidget.cpp:167
QgsTableEditorFormattingWidget::rowHeightChanged
void rowHeightChanged(double height)
Emitted whenever the row height shown in the widget is changed.
QgsNumericFormatSelectorWidget::changed
void changed()
Emitted whenever the format configured55 in the widget is changed.
qgstableeditorformattingwidget.h
QgsAlignmentComboBox::changed
void changed()
Emitted when the alignment is changed.
QgsFontButton::changed
void changed()
Emitted when the widget's text format settings are changed.