25 #include <QFileDialog>
30 , mHtml( frame ? qobject_cast<
QgsLayoutItemHtml* >( frame->multiFrame() ) : nullptr )
34 connect( mUrlLineEdit, &QLineEdit::editingFinished,
this, &QgsLayoutHtmlWidget::mUrlLineEdit_editingFinished );
35 connect( mFileToolButton, &QToolButton::clicked,
this, &QgsLayoutHtmlWidget::mFileToolButton_clicked );
36 connect( mResizeModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLayoutHtmlWidget::mResizeModeComboBox_currentIndexChanged );
37 connect( mEvaluateExpressionsCheckbox, &QCheckBox::toggled,
this, &QgsLayoutHtmlWidget::mEvaluateExpressionsCheckbox_toggled );
38 connect( mUseSmartBreaksCheckBox, &QgsCollapsibleGroupBoxBasic::toggled,
this, &QgsLayoutHtmlWidget::mUseSmartBreaksCheckBox_toggled );
39 connect( mMaxDistanceSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsLayoutHtmlWidget::mMaxDistanceSpinBox_valueChanged );
40 connect( mUserStylesheetCheckBox, &QgsCollapsibleGroupBoxBasic::toggled,
this, &QgsLayoutHtmlWidget::mUserStylesheetCheckBox_toggled );
41 connect( mRadioManualSource, &QRadioButton::clicked,
this, &QgsLayoutHtmlWidget::mRadioManualSource_clicked );
42 connect( mRadioUrlSource, &QRadioButton::clicked,
this, &QgsLayoutHtmlWidget::mRadioUrlSource_clicked );
43 connect( mInsertExpressionButton, &QPushButton::clicked,
this, &QgsLayoutHtmlWidget::mInsertExpressionButton_clicked );
44 connect( mReloadPushButton, &QPushButton::clicked,
this, &QgsLayoutHtmlWidget::mReloadPushButton_clicked );
45 connect( mReloadPushButton2, &QPushButton::clicked,
this, &QgsLayoutHtmlWidget::mReloadPushButton_clicked );
46 connect( mAddFramePushButton, &QPushButton::clicked,
this, &QgsLayoutHtmlWidget::mAddFramePushButton_clicked );
47 connect( mEmptyFrameCheckBox, &QCheckBox::toggled,
this, &QgsLayoutHtmlWidget::mEmptyFrameCheckBox_toggled );
48 connect( mHideEmptyBgCheckBox, &QCheckBox::toggled,
this, &QgsLayoutHtmlWidget::mHideEmptyBgCheckBox_toggled );
53 connect( mHtmlEditor, &QsciScintilla::textChanged,
this, &QgsLayoutHtmlWidget::htmlEditorChanged );
54 htmlEditorLayout->addWidget( mHtmlEditor );
58 connect( mStylesheetEditor, &QsciScintilla::textChanged,
this, &QgsLayoutHtmlWidget::stylesheetEditorChanged );
59 stylesheetEditorLayout->addWidget( mStylesheetEditor );
66 blockSignals(
false );
67 setGuiElementValues();
79 mainLayout->addWidget( mItemPropertiesWidget );
89 if ( mItemPropertiesWidget )
111 mHtml = qobject_cast< QgsLayoutItemHtml * >( multiFrame );
113 mItemPropertiesWidget->
setItem( frame );
120 setGuiElementValues();
125 void QgsLayoutHtmlWidget::blockSignals(
bool block )
127 mUrlLineEdit->blockSignals( block );
128 mFileToolButton->blockSignals( block );
129 mResizeModeComboBox->blockSignals( block );
130 mUseSmartBreaksCheckBox->blockSignals( block );
131 mMaxDistanceSpinBox->blockSignals( block );
132 mHtmlEditor->blockSignals( block );
133 mStylesheetEditor->blockSignals( block );
134 mUserStylesheetCheckBox->blockSignals( block );
135 mRadioManualSource->blockSignals( block );
136 mRadioUrlSource->blockSignals( block );
137 mEvaluateExpressionsCheckbox->blockSignals( block );
138 mEmptyFrameCheckBox->blockSignals( block );
139 mHideEmptyBgCheckBox->blockSignals( block );
142 void QgsLayoutHtmlWidget::mUrlLineEdit_editingFinished()
146 const QUrl newUrl( mUrlLineEdit->text() );
147 if ( newUrl == mHtml->url() )
152 mHtml->beginCommand( tr(
"Change HTML Url" ) );
153 mHtml->setUrl( newUrl );
159 void QgsLayoutHtmlWidget::mFileToolButton_clicked()
162 const QString lastDir = s.
value( QStringLiteral(
"/UI/lastHtmlDir" ), QDir::homePath() ).toString();
163 const QString file = QFileDialog::getOpenFileName(
this, tr(
"Select HTML document" ), lastDir, QStringLiteral(
"HTML (*.html *.htm);;All files (*.*)" ) );
164 if ( !file.isEmpty() )
166 const QUrl url = QUrl::fromLocalFile( file );
167 mUrlLineEdit->setText( url.toString() );
168 mUrlLineEdit_editingFinished();
170 s.
setValue( QStringLiteral(
"/UI/lastHtmlDir" ), QFileInfo( file ).absolutePath() );
174 void QgsLayoutHtmlWidget::mResizeModeComboBox_currentIndexChanged(
int index )
181 mHtml->beginCommand( tr(
"Change Resize Mode" ) );
188 void QgsLayoutHtmlWidget::mEvaluateExpressionsCheckbox_toggled(
bool checked )
195 blockSignals(
true );
196 mHtml->beginCommand( tr(
"Change Evaluate Expressions" ) );
197 mHtml->setEvaluateExpressions( checked );
199 blockSignals(
false );
202 void QgsLayoutHtmlWidget::mUseSmartBreaksCheckBox_toggled(
bool checked )
209 blockSignals(
true );
210 mHtml->beginCommand( tr(
"Change Smart Breaks" ) );
211 mHtml->setUseSmartBreaks( checked );
213 blockSignals(
false );
216 void QgsLayoutHtmlWidget::mMaxDistanceSpinBox_valueChanged(
double val )
223 blockSignals(
true );
225 mHtml->setMaxBreakDistance( val );
227 blockSignals(
false );
230 void QgsLayoutHtmlWidget::htmlEditorChanged()
237 blockSignals(
true );
239 mHtml->setHtml( mHtmlEditor->text() );
241 blockSignals(
false );
244 void QgsLayoutHtmlWidget::stylesheetEditorChanged()
251 blockSignals(
true );
253 mHtml->setUserStylesheet( mStylesheetEditor->text() );
255 blockSignals(
false );
258 void QgsLayoutHtmlWidget::mUserStylesheetCheckBox_toggled(
bool checked )
265 blockSignals(
true );
266 mHtml->beginCommand( tr(
"Toggle User Stylesheet" ) );
267 mHtml->setUserStylesheetEnabled( checked );
269 blockSignals(
false );
272 void QgsLayoutHtmlWidget::mEmptyFrameCheckBox_toggled(
bool checked )
279 mFrame->beginCommand( tr(
"Toggle Empty Frame Mode" ) );
280 mFrame->setHidePageIfEmpty( checked );
281 mFrame->endCommand();
284 void QgsLayoutHtmlWidget::mHideEmptyBgCheckBox_toggled(
bool checked )
291 mFrame->beginCommand( tr(
"Toggle Hide Background" ) );
292 mFrame->setHideBackgroundIfEmpty( checked );
293 mFrame->endCommand();
296 void QgsLayoutHtmlWidget::mRadioManualSource_clicked(
bool checked )
303 blockSignals(
true );
304 mHtml->beginCommand( tr(
"Change HTML Source" ) );
306 blockSignals(
false );
308 mHtmlEditor->setEnabled( checked );
309 mInsertExpressionButton->setEnabled( checked );
310 mUrlLineEdit->setEnabled( !checked );
311 mFileToolButton->setEnabled( !checked );
317 void QgsLayoutHtmlWidget::mRadioUrlSource_clicked(
bool checked )
324 blockSignals(
true );
325 mHtml->beginCommand( tr(
"Change HTML Source" ) );
327 blockSignals(
false );
329 mHtmlEditor->setEnabled( !checked );
330 mInsertExpressionButton->setEnabled( !checked );
331 mUrlLineEdit->setEnabled( checked );
332 mFileToolButton->setEnabled( checked );
338 void QgsLayoutHtmlWidget::mInsertExpressionButton_clicked()
348 if ( mHtmlEditor->hasSelectedText() )
350 selText = mHtmlEditor->selectedText();
353 if ( selText.startsWith( QLatin1String(
"[%" ) ) && selText.endsWith( QLatin1String(
"%]" ) ) )
354 selText = selText.mid( 2, selText.size() - 4 );
358 mHtmlEditor->getCursorPosition( &line, &index );
366 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
367 if ( exprDlg.exec() == QDialog::Accepted )
369 const QString expression = exprDlg.expressionText();
370 if ( !expression.isEmpty() )
372 blockSignals(
true );
373 mHtml->beginCommand( tr(
"Change HTML Source" ) );
374 if ( mHtmlEditor->hasSelectedText() )
376 mHtmlEditor->replaceSelectedText(
"[%" + expression +
"%]" );
380 mHtmlEditor->insertAt(
"[%" + expression +
"%]", line, index );
382 mHtml->setHtml( mHtmlEditor->text() );
384 blockSignals(
false );
390 void QgsLayoutHtmlWidget::mReloadPushButton_clicked()
397 if ( mHtml->layout() )
398 mHtml->layout()->undoStack()->blockCommands(
true );
400 if ( mHtml->layout() )
401 mHtml->layout()->undoStack()->blockCommands(
false );
404 void QgsLayoutHtmlWidget::mAddFramePushButton_clicked()
406 if ( !mHtml || !mFrame )
412 QPointF pos = mFrame->pos();
414 pos.ry() += mFrame->rect().height() + 10;
416 QgsLayoutFrame *newFrame = mHtml->createNewFrame( mFrame, pos, mFrame->rect().size() );
417 mHtml->recalculateFrameSizes();
420 if (
QgsLayout *layout = mHtml->layout() )
422 layout->setSelectedItem( newFrame );
426 void QgsLayoutHtmlWidget::setGuiElementValues()
428 if ( !mHtml || !mFrame )
433 blockSignals(
true );
434 mUrlLineEdit->setText( mHtml->url().toString() );
435 mResizeModeComboBox->setCurrentIndex( mResizeModeComboBox->findData( mHtml->resizeMode() ) );
436 mEvaluateExpressionsCheckbox->setChecked( mHtml->evaluateExpressions() );
437 mUseSmartBreaksCheckBox->setChecked( mHtml->useSmartBreaks() );
438 mMaxDistanceSpinBox->setValue( mHtml->maxBreakDistance() );
441 mHtmlEditor->setText( mHtml->html() );
450 mUserStylesheetCheckBox->setChecked( mHtml->userStylesheetEnabled() );
451 mStylesheetEditor->setText( mHtml->userStylesheet() );
453 mEmptyFrameCheckBox->setChecked( mFrame->hidePageIfEmpty() );
454 mHideEmptyBgCheckBox->setChecked( mFrame->hideBackgroundIfEmpty() );
458 blockSignals(
false );
466 mUrlLineEdit->setEnabled( !mUrlDDBtn->isActive() );