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() );