30 : QMainWindow( parent )
33 setWindowTitle( tr(
"Table Designer" ) );
35 setAttribute( Qt::WA_DeleteOnClose );
36 setDockOptions( dockOptions() | QMainWindow::GroupedDragging );
40 QGridLayout *viewLayout =
new QGridLayout();
41 viewLayout->setSpacing( 0 );
42 viewLayout->setContentsMargins( 0, 0, 0, 0 );
43 centralWidget()->layout()->setSpacing( 0 );
44 centralWidget()->layout()->setContentsMargins( 0, 0, 0, 0 );
47 mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed );
48 static_cast< QGridLayout *
>( centralWidget()->layout() )->addWidget( mMessageBar, 0, 0, 1, 1, Qt::AlignTop );
51 mTableWidget->setContentsMargins( 0, 0, 0, 0 );
52 viewLayout->addWidget( mTableWidget, 0, 0 );
53 mViewFrame->setLayout( viewLayout );
54 mViewFrame->setContentsMargins( 0, 0, 0, 0 );
56 mTableWidget->setFocus();
65 const int minDockWidth( fontMetrics().boundingRect( QStringLiteral(
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) ).width() );
67 mPropertiesDock =
new QgsDockWidget( tr(
"Cell Contents" ),
this );
68 mPropertiesDock->setObjectName( QStringLiteral(
"FormattingDock" ) );
70 mPropertiesDock->setWidget( mPropertiesStack );
71 mPropertiesDock->setMinimumWidth( minDockWidth );
77 mPropertiesDock->setFeatures( QDockWidget::NoDockWidgetFeatures );
108 updateActionsFromSelection();
112 updateActionsFromSelection();
114 addDockWidget( Qt::RightDockWidgetArea, mPropertiesDock );
116 mActionImportFromClipboard->setEnabled( !QApplication::clipboard()->text().isEmpty() );
117 connect( QApplication::clipboard(), &QClipboard::dataChanged,
this, [ = ]() { mActionImportFromClipboard->setEnabled( !QApplication::clipboard()->text().isEmpty() ); } );
120 connect( mActionClose, &QAction::triggered,
this, &QMainWindow::close );
131 connect( mActionSelectAll, &QAction::triggered, mTableWidget, &QgsTableEditorWidget::selectAll );
133 connect( mActionIncludeHeader, &QAction::toggled,
this, [ = ](
bool checked )
142 const QByteArray state = settings.
value( QStringLiteral(
"LayoutDesigner/tableEditorState" ), QByteArray(),
QgsSettings::App ).toByteArray();
143 if ( !state.isEmpty() && !restoreState( state ) )
145 QgsDebugError( QStringLiteral(
"restore of table editor dialog UI state failed" ) );
158 return mLayer.data();
163 if (
layer != mLayer )
173 if ( QApplication::clipboard()->text().isEmpty() )
176 if ( QMessageBox::question(
this, tr(
"Import Content From Clipboard" ),
177 tr(
"Importing content from clipboard will overwrite current table content. Are you sure?" ) ) != QMessageBox::Yes )
181 const QStringList lines = QApplication::clipboard()->text().split(
'\n' );
182 for (
const QString &line : lines )
184 if ( !line.isEmpty() )
187 const QStringList cells = line.split(
'\t' );
188 for (
const QString &text : cells )
197 if ( !contents.isEmpty() )
209 mBlockSignals =
true;
211 mTableWidget->resizeRowsToContents();
212 mTableWidget->resizeColumnsToContents();
213 mBlockSignals =
false;
243 return mActionIncludeHeader->isChecked();
248 mActionIncludeHeader->setChecked( included );
266void QgsTableEditorDialog::updateActionsFromSelection()
271 mActionInsertRowsAbove->setEnabled( rowCount > 0 );
272 mActionInsertRowsBelow->setEnabled( rowCount > 0 );
273 mActionDeleteRows->setEnabled( rowCount > 0 );
274 mActionSelectRow->setEnabled( rowCount > 0 );
277 mActionInsertRowsAbove->setText( tr(
"Rows Above" ) );
278 mActionInsertRowsBelow->setText( tr(
"Rows Below" ) );
279 mActionDeleteRows->setText( tr(
"Delete Rows" ) );
280 mActionSelectRow->setText( tr(
"Select Rows" ) );
282 else if ( rowCount == 1 )
284 mActionInsertRowsAbove->setText( tr(
"Row Above" ) );
285 mActionInsertRowsBelow->setText( tr(
"Row Below" ) );
286 mActionDeleteRows->setText( tr(
"Delete Row" ) );
287 mActionSelectRow->setText( tr(
"Select Row" ) );
291 mActionInsertRowsAbove->setText( tr(
"%n Row(s) Above",
nullptr, rowCount ) );
292 mActionInsertRowsBelow->setText( tr(
"%n Row(s) Below",
nullptr, rowCount ) );
293 mActionDeleteRows->setText( tr(
"Delete %n Row(s)",
nullptr, rowCount ) );
294 mActionSelectRow->setText( tr(
"Select %n Row(s)",
nullptr, rowCount ) );
297 mActionInsertColumnsBefore->setEnabled( columnCount > 0 );
298 mActionInsertColumnsAfter->setEnabled( columnCount > 0 );
299 mActionDeleteColumns->setEnabled( columnCount > 0 );
300 mActionSelectColumn->setEnabled( columnCount > 0 );
301 if ( columnCount == 0 )
303 mActionInsertColumnsBefore->setText( tr(
"Columns Before" ) );
304 mActionInsertColumnsAfter->setText( tr(
"Columns After" ) );
305 mActionDeleteColumns->setText( tr(
"Delete Columns" ) );
306 mActionSelectColumn->setText( tr(
"Select Columns" ) );
308 else if ( columnCount == 1 )
310 mActionInsertColumnsBefore->setText( tr(
"Column Before" ) );
311 mActionInsertColumnsAfter->setText( tr(
"Column After" ) );
312 mActionDeleteColumns->setText( tr(
"Delete Column" ) );
313 mActionSelectColumn->setText( tr(
"Select Column" ) );
317 mActionInsertColumnsBefore->setText( tr(
"%n Column(s) Before",
nullptr, columnCount ) );
318 mActionInsertColumnsAfter->setText( tr(
"%n Column(s) After",
nullptr, columnCount ) );
319 mActionDeleteColumns->setText( tr(
"Delete %n Column(s)",
nullptr, columnCount ) );
320 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.