17#include "moc_qgstableeditordialog.cpp"
31 : QMainWindow( parent )
34 setWindowTitle( tr(
"Table Designer" ) );
36 setAttribute( Qt::WA_DeleteOnClose );
37 setDockOptions( dockOptions() | QMainWindow::GroupedDragging );
41 QGridLayout *viewLayout =
new QGridLayout();
42 viewLayout->setSpacing( 0 );
43 viewLayout->setContentsMargins( 0, 0, 0, 0 );
44 centralWidget()->layout()->setSpacing( 0 );
45 centralWidget()->layout()->setContentsMargins( 0, 0, 0, 0 );
48 mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed );
49 static_cast< QGridLayout *
>( centralWidget()->layout() )->addWidget( mMessageBar, 0, 0, 1, 1, Qt::AlignTop );
52 mTableWidget->setContentsMargins( 0, 0, 0, 0 );
53 viewLayout->addWidget( mTableWidget, 0, 0 );
54 mViewFrame->setLayout( viewLayout );
55 mViewFrame->setContentsMargins( 0, 0, 0, 0 );
57 mTableWidget->setFocus();
66 const int minDockWidth( fontMetrics().boundingRect( QStringLiteral(
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) ).width() );
68 mPropertiesDock =
new QgsDockWidget( tr(
"Cell Contents" ),
this );
69 mPropertiesDock->setObjectName( QStringLiteral(
"FormattingDock" ) );
71 mPropertiesDock->setWidget( mPropertiesStack );
72 mPropertiesDock->setMinimumWidth( minDockWidth );
78 mPropertiesDock->setFeatures( QDockWidget::NoDockWidgetFeatures );
109 updateActionsFromSelection();
113 updateActionsFromSelection();
115 addDockWidget( Qt::RightDockWidgetArea, mPropertiesDock );
117 mActionImportFromClipboard->setEnabled( !QApplication::clipboard()->text().isEmpty() );
118 connect( QApplication::clipboard(), &QClipboard::dataChanged,
this, [ = ]() { mActionImportFromClipboard->setEnabled( !QApplication::clipboard()->text().isEmpty() ); } );
121 connect( mActionClose, &QAction::triggered,
this, &QMainWindow::close );
132 connect( mActionSelectAll, &QAction::triggered, mTableWidget, &QgsTableEditorWidget::selectAll );
134 connect( mActionIncludeHeader, &QAction::toggled,
this, [ = ](
bool checked )
143 const QByteArray state = settings.
value( QStringLiteral(
"LayoutDesigner/tableEditorState" ), QByteArray(),
QgsSettings::App ).toByteArray();
144 if ( !state.isEmpty() && !restoreState( state ) )
146 QgsDebugError( QStringLiteral(
"restore of table editor dialog UI state failed" ) );
159 return mLayer.data();
164 if (
layer != mLayer )
174 if ( QApplication::clipboard()->text().isEmpty() )
177 if ( QMessageBox::question(
this, tr(
"Import Content From Clipboard" ),
178 tr(
"Importing content from clipboard will overwrite current table content. Are you sure?" ) ) != QMessageBox::Yes )
182 const QStringList lines = QApplication::clipboard()->text().split(
'\n' );
183 for (
const QString &line : lines )
185 if ( !line.isEmpty() )
188 const QStringList cells = line.split(
'\t' );
189 for (
const QString &text : cells )
198 if ( !contents.isEmpty() )
210 mBlockSignals =
true;
212 mTableWidget->resizeRowsToContents();
213 mTableWidget->resizeColumnsToContents();
214 mBlockSignals =
false;
244 return mActionIncludeHeader->isChecked();
249 mActionIncludeHeader->setChecked( included );
267void QgsTableEditorDialog::updateActionsFromSelection()
272 mActionInsertRowsAbove->setEnabled( rowCount > 0 );
273 mActionInsertRowsBelow->setEnabled( rowCount > 0 );
274 mActionDeleteRows->setEnabled( rowCount > 0 );
275 mActionSelectRow->setEnabled( rowCount > 0 );
278 mActionInsertRowsAbove->setText( tr(
"Rows Above" ) );
279 mActionInsertRowsBelow->setText( tr(
"Rows Below" ) );
280 mActionDeleteRows->setText( tr(
"Delete Rows" ) );
281 mActionSelectRow->setText( tr(
"Select Rows" ) );
283 else if ( rowCount == 1 )
285 mActionInsertRowsAbove->setText( tr(
"Row Above" ) );
286 mActionInsertRowsBelow->setText( tr(
"Row Below" ) );
287 mActionDeleteRows->setText( tr(
"Delete Row" ) );
288 mActionSelectRow->setText( tr(
"Select Row" ) );
292 mActionInsertRowsAbove->setText( tr(
"%n Row(s) Above",
nullptr, rowCount ) );
293 mActionInsertRowsBelow->setText( tr(
"%n Row(s) Below",
nullptr, rowCount ) );
294 mActionDeleteRows->setText( tr(
"Delete %n Row(s)",
nullptr, rowCount ) );
295 mActionSelectRow->setText( tr(
"Select %n Row(s)",
nullptr, rowCount ) );
298 mActionInsertColumnsBefore->setEnabled( columnCount > 0 );
299 mActionInsertColumnsAfter->setEnabled( columnCount > 0 );
300 mActionDeleteColumns->setEnabled( columnCount > 0 );
301 mActionSelectColumn->setEnabled( columnCount > 0 );
302 if ( columnCount == 0 )
304 mActionInsertColumnsBefore->setText( tr(
"Columns Before" ) );
305 mActionInsertColumnsAfter->setText( tr(
"Columns After" ) );
306 mActionDeleteColumns->setText( tr(
"Delete Columns" ) );
307 mActionSelectColumn->setText( tr(
"Select Columns" ) );
309 else if ( columnCount == 1 )
311 mActionInsertColumnsBefore->setText( tr(
"Column Before" ) );
312 mActionInsertColumnsAfter->setText( tr(
"Column After" ) );
313 mActionDeleteColumns->setText( tr(
"Delete Column" ) );
314 mActionSelectColumn->setText( tr(
"Select Column" ) );
318 mActionInsertColumnsBefore->setText( tr(
"%n Column(s) Before",
nullptr, columnCount ) );
319 mActionInsertColumnsAfter->setText( tr(
"%n Column(s) After",
nullptr, columnCount ) );
320 mActionDeleteColumns->setText( tr(
"Delete %n Column(s)",
nullptr, columnCount ) );
321 mActionSelectColumn->setText( tr(
"Select %n Column(s)",
nullptr, columnCount ) );
Abstract interface for generating an expression context.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
Base class for all map layer types.
A bar for displaying non-blocking messages to the user.
This class is a composition of two QSettings instances:
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.
Encapsulates the contents and formatting of a single table cell.
void setIncludeTableHeader(bool included)
Sets whether the table includes a header row.
QgsTableContents tableContents() const
Returns the current contents of the editor widget table.
void setTableHeaders(const QVariantList &headers)
Sets the table headers.
bool includeTableHeader() const
Returns true if the table includes a header row.
QgsTableEditorDialog(QWidget *parent=nullptr)
Constructor for QgsTableEditorDialog with the specified parent widget.
void includeHeaderChanged(bool included)
Emitted whenever the "include table header" setting is changed.
void setTableColumnWidth(int column, double width)
Sets the configured column width for the specified column.
void tableChanged()
Emitted whenever the table contents are changed.
void setTableRowHeight(int row, double height)
Sets the configured row height for the specified row.
void registerExpressionContextGenerator(QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
bool setTableContentsFromClipboard()
Parses the clipboard text into contents to show in the editor widget.
QVariantList tableHeaders() const
Returns the table header values.
void closeEvent(QCloseEvent *) override
QgsMapLayer * layer() const
Returns the (possibly nullptr) layer associated with the expression editor context.
double tableRowHeight(int row)
Returns the configured row height for the specified row, or 0 if an automatic height should be used f...
double tableColumnWidth(int column)
Returns the configured column width for the specified column, or 0 if an automatic width should be us...
void setLayer(QgsMapLayer *layer)
Sets the layer to be used associated with the expression editor context.
void setTableContents(const QgsTableContents &contents)
Sets the contents to show in the editor widget.
#define QgsDebugError(str)
QVector< QgsTableRow > QgsTableContents
A set of table rows.
QVector< QgsTableCell > QgsTableRow
A row of table cells.