35 connect( mSetContentsButton, &QPushButton::clicked,
this, &QgsLayoutManualTableWidget::setTableContents );
36 connect( mMarginSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsLayoutManualTableWidget::mMarginSpinBox_valueChanged );
37 connect( mGridStrokeWidthSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsLayoutManualTableWidget::mGridStrokeWidthSpinBox_valueChanged );
39 connect( mBackgroundColorButton, &
QgsColorButton::colorChanged,
this, &QgsLayoutManualTableWidget::mBackgroundColorButton_colorChanged );
40 connect( mDrawHorizontalGrid, &QCheckBox::toggled,
this, &QgsLayoutManualTableWidget::mDrawHorizontalGrid_toggled );
41 connect( mDrawVerticalGrid, &QCheckBox::toggled,
this, &QgsLayoutManualTableWidget::mDrawVerticalGrid_toggled );
42 connect( mShowGridGroupCheckBox, &QgsCollapsibleGroupBoxBasic::toggled,
this, &QgsLayoutManualTableWidget::mShowGridGroupCheckBox_toggled );
43 connect( mHeaderHAlignmentComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLayoutManualTableWidget::mHeaderHAlignmentComboBox_currentIndexChanged );
44 connect( mHeaderModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLayoutManualTableWidget::mHeaderModeComboBox_currentIndexChanged );
45 connect( mAddFramePushButton, &QPushButton::clicked,
this, &QgsLayoutManualTableWidget::mAddFramePushButton_clicked );
46 connect( mResizeModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLayoutManualTableWidget::mResizeModeComboBox_currentIndexChanged );
47 connect( mDrawEmptyCheckBox, &QCheckBox::toggled,
this, &QgsLayoutManualTableWidget::mDrawEmptyCheckBox_toggled );
48 connect( mEmptyFrameCheckBox, &QCheckBox::toggled,
this, &QgsLayoutManualTableWidget::mEmptyFrameCheckBox_toggled );
49 connect( mHideEmptyBgCheckBox, &QCheckBox::toggled,
this, &QgsLayoutManualTableWidget::mHideEmptyBgCheckBox_toggled );
50 connect( mWrapBehaviorComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLayoutManualTableWidget::mWrapBehaviorComboBox_currentIndexChanged );
51 connect( mAdvancedCustomizationButton, &QPushButton::clicked,
this, &QgsLayoutManualTableWidget::mAdvancedCustomizationButton_clicked );
57 mContentFontToolButton->registerExpressionContextGenerator(
this );
58 mHeaderFontToolButton->registerExpressionContextGenerator(
this );
60 blockAllSignals(
true );
78 mGridColorButton->setColorDialogTitle( tr(
"Select Grid Color" ) );
79 mGridColorButton->setAllowOpacity(
true );
80 mGridColorButton->setContext( QStringLiteral(
"composer" ) );
81 mGridColorButton->setDefaultColor( Qt::black );
82 mBackgroundColorButton->setColorDialogTitle( tr(
"Select Background Color" ) );
83 mBackgroundColorButton->setAllowOpacity(
true );
84 mBackgroundColorButton->setContext( QStringLiteral(
"composer" ) );
85 mBackgroundColorButton->setShowNoColor(
true );
86 mBackgroundColorButton->setNoColorString( tr(
"No Background" ) );
100 mainLayout->addWidget( mItemPropertiesWidget );
103 connect( mHeaderFontToolButton, &
QgsFontButton::changed,
this, &QgsLayoutManualTableWidget::headerFontChanged );
104 connect( mContentFontToolButton, &
QgsFontButton::changed,
this, &QgsLayoutManualTableWidget::contentFontChanged );
109 if ( mItemPropertiesWidget )
119 context = mFrame->createExpressionContext();
121 context = mTable->createExpressionContext();
123 std::unique_ptr< QgsExpressionContextScope > cellScope = std::make_unique< QgsExpressionContextScope >();
124 cellScope->setVariable( QStringLiteral(
"row_number" ), 1,
true );
125 cellScope->setVariable( QStringLiteral(
"column_number" ), 1,
true );
129 QStringLiteral(
"column_number" )} );
153 mEditorDialog->close();
156 mTable = qobject_cast< QgsLayoutItemManualTable * >( multiFrame );
158 mItemPropertiesWidget->
setItem( frame );
170 void QgsLayoutManualTableWidget::setTableContents()
180 mEditorDialog->show();
181 mEditorDialog->raise();
182 mEditorDialog->setWindowState( windowState() & ~Qt::WindowMinimized );
183 mEditorDialog->activateWindow();
187 mEditorDialog =
new QgsTableEditorDialog(
this );
188 mEditorDialog->registerExpressionContextGenerator( mTable );
189 connect(
this, &QWidget::destroyed, mEditorDialog, &QMainWindow::close );
191 mEditorDialog->setIncludeTableHeader( mTable->includeTableHeader() );
192 mEditorDialog->setTableContents( mTable->tableContents() );
195 const QList< double > rowHeights = mTable->rowHeights();
196 for (
double height : rowHeights )
198 mEditorDialog->setTableRowHeight( row, height );
202 const QList< double > columnWidths = mTable->columnWidths();
203 QVariantList headers;
204 headers.reserve( columnWidths.size() );
205 for (
double width : columnWidths )
207 mEditorDialog->setTableColumnWidth( col, width );
208 headers << ( col < mTable->headers().count() ? mTable->headers().value( col ).heading() : QVariant() );
211 mEditorDialog->setTableHeaders( headers );
213 connect( mEditorDialog, &QgsTableEditorDialog::tableChanged,
this, [ = ]
217 mTable->beginCommand( tr(
"Change Table Contents" ) );
218 mTable->setTableContents( mEditorDialog->tableContents() );
220 const QVariantList headerText = mEditorDialog->tableHeaders();
221 if ( mEditorDialog->includeTableHeader() )
223 QgsLayoutTableColumns headers;
224 for ( const QVariant &h : headerText )
226 headers << QgsLayoutTableColumn( h.toString() );
228 mTable->setHeaders( headers );
231 const int rowCount = mTable->tableContents().size();
232 QList< double > rowHeights;
233 rowHeights.reserve( rowCount );
234 for (
int row = 0; row < rowCount; ++row )
236 rowHeights << mEditorDialog->tableRowHeight( row );
238 mTable->setRowHeights( rowHeights );
240 if ( !mTable->tableContents().empty() )
242 const int columnCount = mTable->tableContents().at( 0 ).size();
243 QList< double > columnWidths;
244 columnWidths.reserve( columnCount );
245 for ( int col = 0; col < columnCount; ++col )
247 columnWidths << mEditorDialog->tableColumnWidth( col );
249 mTable->setColumnWidths( columnWidths );
252 mTable->endCommand();
256 connect( mEditorDialog, &QgsTableEditorDialog::includeHeaderChanged,
this, [ = ](
bool included )
260 mTable->beginCommand( tr(
"Change Table Header" ) );
261 mTable->setIncludeTableHeader( included );
262 mTable->endCommand();
265 mEditorDialog->show();
269 void QgsLayoutManualTableWidget::mMarginSpinBox_valueChanged(
double d )
277 mTable->setCellMargin( d );
278 mTable->endCommand();
281 void QgsLayoutManualTableWidget::contentFontChanged()
288 mTable->beginCommand( tr(
"Change Table Font" ) );
289 mTable->setContentTextFormat( mContentFontToolButton->textFormat() );
290 mTable->endCommand();
293 void QgsLayoutManualTableWidget::mGridStrokeWidthSpinBox_valueChanged(
double d )
301 mTable->setGridStrokeWidth( d );
302 mTable->endCommand();
305 void QgsLayoutManualTableWidget::mGridColorButton_colorChanged(
const QColor &newColor )
313 mTable->setGridColor( newColor );
314 mTable->endCommand();
317 void QgsLayoutManualTableWidget::mDrawHorizontalGrid_toggled(
bool state )
324 mTable->beginCommand( tr(
"Toggle Table Grid" ) );
325 mTable->setHorizontalGrid( state );
326 mTable->endCommand();
329 void QgsLayoutManualTableWidget::mDrawVerticalGrid_toggled(
bool state )
336 mTable->beginCommand( tr(
"Toggled Table Grid" ) );
337 mTable->setVerticalGrid( state );
338 mTable->endCommand();
341 void QgsLayoutManualTableWidget::mShowGridGroupCheckBox_toggled(
bool state )
348 mTable->beginCommand( tr(
"Toggle Table Grid" ) );
349 mTable->setShowGrid( state );
350 mTable->endCommand();
353 void QgsLayoutManualTableWidget::mHeaderHAlignmentComboBox_currentIndexChanged(
int )
360 mTable->beginCommand( tr(
"Change Table Alignment" ) );
362 mTable->endCommand();
365 void QgsLayoutManualTableWidget::mHeaderModeComboBox_currentIndexChanged(
int )
372 mTable->beginCommand( tr(
"Change Table Header Mode" ) );
374 mTable->endCommand();
377 void QgsLayoutManualTableWidget::mBackgroundColorButton_colorChanged(
const QColor &newColor )
385 mTable->setBackgroundColor( newColor );
386 mTable->endCommand();
389 void QgsLayoutManualTableWidget::headerFontChanged()
394 mTable->beginCommand( tr(
"Change Table Font" ) );
395 mTable->setHeaderTextFormat( mHeaderFontToolButton->textFormat() );
396 mTable->endCommand();
399 void QgsLayoutManualTableWidget::updateGuiElements()
401 if ( !mTable || !mFrame )
406 blockAllSignals(
true );
408 mMarginSpinBox->setValue( mTable->cellMargin() );
409 mGridStrokeWidthSpinBox->setValue( mTable->gridStrokeWidth() );
410 mGridColorButton->setColor( mTable->gridColor() );
411 mDrawHorizontalGrid->setChecked( mTable->horizontalGrid() );
412 mDrawVerticalGrid->setChecked( mTable->verticalGrid() );
413 if ( mTable->showGrid() )
415 mShowGridGroupCheckBox->setChecked(
true );
419 mShowGridGroupCheckBox->setChecked(
false );
421 mBackgroundColorButton->setColor( mTable->backgroundColor() );
423 mHeaderFontToolButton->setTextFormat( mTable->headerTextFormat() );
424 mContentFontToolButton->setTextFormat( mTable->contentTextFormat() );
426 mDrawEmptyCheckBox->setChecked( mTable->showEmptyRows() );
427 mWrapBehaviorComboBox->setCurrentIndex( mWrapBehaviorComboBox->findData( mTable->wrapBehavior() ) );
429 mResizeModeComboBox->setCurrentIndex( mResizeModeComboBox->findData( mTable->resizeMode() ) );
432 mHeaderHAlignmentComboBox->setCurrentIndex( mHeaderHAlignmentComboBox->findData( mTable->headerHAlignment() ) );
433 mHeaderModeComboBox->setCurrentIndex( mHeaderModeComboBox->findData( mTable->headerMode() ) );
435 mEmptyFrameCheckBox->setChecked( mFrame->hidePageIfEmpty() );
436 mHideEmptyBgCheckBox->setChecked( mFrame->hideBackgroundIfEmpty() );
438 blockAllSignals(
false );
441 void QgsLayoutManualTableWidget::blockAllSignals(
bool b )
443 mMarginSpinBox->blockSignals( b );
444 mGridColorButton->blockSignals( b );
445 mGridStrokeWidthSpinBox->blockSignals( b );
446 mBackgroundColorButton->blockSignals( b );
447 mDrawHorizontalGrid->blockSignals( b );
448 mDrawVerticalGrid->blockSignals( b );
449 mShowGridGroupCheckBox->blockSignals( b );
450 mResizeModeComboBox->blockSignals( b );
451 mEmptyFrameCheckBox->blockSignals( b );
452 mHideEmptyBgCheckBox->blockSignals( b );
453 mDrawEmptyCheckBox->blockSignals( b );
454 mWrapBehaviorComboBox->blockSignals( b );
455 mContentFontToolButton->blockSignals( b );
456 mHeaderHAlignmentComboBox->blockSignals( b );
457 mHeaderModeComboBox->blockSignals( b );
458 mHeaderFontToolButton->blockSignals( b );
461 void QgsLayoutManualTableWidget::mEmptyFrameCheckBox_toggled(
bool checked )
468 mFrame->beginCommand( tr(
"Toggle Empty Frame Mode" ) );
469 mFrame->setHidePageIfEmpty( checked );
470 mFrame->endCommand();
473 void QgsLayoutManualTableWidget::mHideEmptyBgCheckBox_toggled(
bool checked )
480 mFrame->beginCommand( tr(
"Toggle Background Display" ) );
481 mFrame->setHideBackgroundIfEmpty( checked );
482 mFrame->endCommand();
485 void QgsLayoutManualTableWidget::mAddFramePushButton_clicked()
487 if ( !mTable || !mFrame )
493 QPointF pos = mFrame->pos();
495 pos.ry() += mFrame->rect().height() + 10;
497 QgsLayoutFrame *newFrame = mTable->createNewFrame( mFrame, pos, mFrame->rect().size() );
498 mTable->recalculateFrameSizes();
501 if (
QgsLayout *layout = mTable->layout() )
503 layout->setSelectedItem( newFrame );
507 void QgsLayoutManualTableWidget::mResizeModeComboBox_currentIndexChanged(
int index )
514 mTable->beginCommand( tr(
"Change Resize Mode" ) );
516 mTable->endCommand();
521 void QgsLayoutManualTableWidget::mWrapBehaviorComboBox_currentIndexChanged(
int index )
528 mTable->beginCommand( tr(
"Change Table Wrap Mode" ) );
530 mTable->endCommand();
533 void QgsLayoutManualTableWidget::mAdvancedCustomizationButton_clicked()
545 void QgsLayoutManualTableWidget::mDrawEmptyCheckBox_toggled(
bool checked )
552 mTable->beginCommand( tr(
"Change Show Empty Rows" ) );
553 mTable->setShowEmptyRows( checked );
554 mTable->endCommand();
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
Base class for frame items, which form a layout multiframe item.
QgsLayoutMultiFrame * multiFrame() const
Returns the parent multiframe for the frame.
A layout table subclass that displays manually entered (and formatted) content.
@ LayoutManualTable
Manual (fixed) table.
Base class for graphical items within a QgsLayout.
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
virtual int type() const =0
Returns unique multiframe type id.
ResizeMode
Specifies the behavior for creating new frames to fit the multiframe's content.
@ UseExistingFrames
Don't automatically create new frames, just use existing frames.
@ ExtendToNextPage
Creates new full page frames on the following page(s) until the entire multiframe content is visible.
@ UndoTableBackgroundColor
Table background color.
@ UndoTableGridStrokeWidth
Table grid stroke width.
@ UndoTableGridColor
Table grid color.
@ UndoTableMargin
Table margins.
void changed()
Emitted when the object's properties change.
A dialog for customization of the cell background colors for a QgsLayoutTable.
HeaderMode
Controls where headers are shown in the table.
@ FirstFrame
Header shown on first frame only.
@ AllFrames
Headers shown on all frames.
@ NoHeaders
No headers shown for table.
WrapBehavior
Controls how long strings in the table are handled.
@ WrapText
Text which doesn't fit inside the cell is wrapped. Note that this only applies to text in columns wit...
@ TruncateText
Text which doesn't fit inside the cell is truncated.
HeaderHAlignment
Controls how headers are horizontally aligned in a table.
@ HeaderRight
Align headers right.
@ HeaderLeft
Align headers left.
@ HeaderCenter
Align headers to center.
@ FollowColumn
Header uses the same alignment as the column.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Interface for master layout type objects, such as print layouts and reports.