diff --git a/src/common/QskTextOptions.cpp b/src/common/QskTextOptions.cpp index 49e92900..9a24db07 100644 --- a/src/common/QskTextOptions.cpp +++ b/src/common/QskTextOptions.cpp @@ -82,7 +82,7 @@ int QskTextOptions::textFlags() const { case QskTextOptions::NoWrap: { - flags |= Qt::TextSingleLine; + // flags |= Qt::TextSingleLine; break; } case QskTextOptions::WordWrap: diff --git a/src/controls/QskTextLabel.cpp b/src/controls/QskTextLabel.cpp index e44389c9..c469489c 100644 --- a/src/controls/QskTextLabel.cpp +++ b/src/controls/QskTextLabel.cpp @@ -210,14 +210,15 @@ QFont QskTextLabel::font() const QSizeF QskTextLabel::contentsSizeHint() const { + const auto font = effectiveFont( Text ); + if ( !m_data->text.isEmpty() ) { - const auto font = effectiveFont( Text ); return QskTextRenderer::textSize( m_data->text, font, m_data->effectiveOptions() ); } - return QSizeF( 0, 0 ); + return QSizeF( 0, QFontMetricsF( font ).height() ); } qreal QskTextLabel::heightForWidth( qreal width ) const @@ -225,30 +226,49 @@ qreal QskTextLabel::heightForWidth( qreal width ) const const auto font = effectiveFont( Text ); const qreal lineHeight = QFontMetricsF( font ).height(); - if ( m_data->text.isEmpty() || - ( m_data->textOptions.wrapMode() == QskTextOptions::NoWrap ) ) + qreal h = 0; + + const auto m = margins(); + + if ( m_data->text.isEmpty() ) { - return lineHeight; + h = lineHeight; + } + else if ( m_data->textOptions.effectiveElideMode() != Qt::ElideNone ) + { + h = lineHeight; + } + else + { + /* + In case of QskTextOptions::NoWrap we could count + the line numbers and calculate the height from + lineHeight. TODO ... + */ + qreal maxHeight = std::numeric_limits< qreal >::max(); + if ( maxHeight / lineHeight > m_data->textOptions.maximumLineCount() ) + { + // be careful with overflows + maxHeight = m_data->textOptions.maximumLineCount() * lineHeight; + } + + qreal w = width - m.left() + m.right(); + + QSizeF size( w, maxHeight ); + size = QskTextRenderer::textSize( + m_data->text, font, m_data->effectiveOptions(), size ); + + h = size.height(); } - qreal maxHeight = std::numeric_limits< qreal >::max(); - if ( maxHeight / lineHeight > m_data->textOptions.maximumLineCount() ) - { - // be careful with overflows - maxHeight = m_data->textOptions.maximumLineCount() * lineHeight; - } + h += m.top() + m.bottom(); - QSizeF size( width, maxHeight ); - size = QskTextRenderer::textSize( - m_data->text, font, m_data->effectiveOptions(), size ); - - return qCeil( size.height() ); + return qCeil( h ); } qreal QskTextLabel::widthForHeight( qreal height ) const { - if ( m_data->text.isEmpty() || - ( m_data->textOptions.wrapMode() == QskTextOptions::NoWrap ) ) + if ( m_data->text.isEmpty() ) { return Inherited::widthForHeight( height ); } @@ -256,11 +276,13 @@ qreal QskTextLabel::widthForHeight( qreal height ) const const auto font = effectiveFont( Text ); const qreal maxWidth = std::numeric_limits< qreal >::max(); - QSizeF size( maxWidth, height ); + const auto m = margins(); + + QSizeF size( maxWidth, height - m.top() + m.bottom() ); size = QskTextRenderer::textSize( m_data->text, font, m_data->effectiveOptions(), size ); - return qCeil( size.width() ); + return qCeil( size.width() + m.left() + m.right() ); } void QskTextLabel::changeEvent( QEvent* event ) diff --git a/src/nodes/QskPlainTextRenderer.cpp b/src/nodes/QskPlainTextRenderer.cpp index 4f18b0af..09bf94e5 100644 --- a/src/nodes/QskPlainTextRenderer.cpp +++ b/src/nodes/QskPlainTextRenderer.cpp @@ -29,7 +29,7 @@ QSK_QT_PRIVATE_END QSizeF QskPlainTextRenderer::textSize( const QString& text, const QFont& font, const QskTextOptions& options ) { - // result differs from QskTextRenderer::implicitSizeHint ??? + // result differs from QQuickText::implicitSizeHint ??? return textRect( text, font, options, QSizeF( 10e6, 10e6 ) ).size(); } @@ -46,8 +46,14 @@ QRectF QskPlainTextRenderer::textRect( static qreal qskLayoutText( QTextLayout* layout, qreal lineWidth, const QskTextOptions& options ) { - const auto maxLineCount = ( options.wrapMode() == QskTextOptions::NoWrap ) - ? 1 : options.maximumLineCount(); + auto maxLineCount = options.maximumLineCount(); + + const auto elideMode = options.effectiveElideMode(); + if ( elideMode != Qt::ElideNone ) + { + // What about strings with newlines and elide mode + maxLineCount = 1; + } int lineNumber = 0; int characterPosition = 0; @@ -60,7 +66,6 @@ static qreal qskLayoutText( QTextLayout* layout, if ( lineNumber == maxLineCount ) { - const auto elideMode = options.elideMode(); const auto engine = layout->engine(); const auto textLength = engine->text.length(); @@ -172,10 +177,29 @@ void QskPlainTextRenderer::updateNode( const QString& text, QTextOption textOption( alignment ); textOption.setWrapMode( static_cast< QTextOption::WrapMode >( options.wrapMode() ) ); + QString tmp = text; + +#if 0 + const int pos = tmp.indexOf( QLatin1Char( '\x9c' ) ); + if ( pos != -1 ) + { + // ST: string termination + + tmp = tmp.mid( 0, pos ); + tmp.replace( QLatin1Char( '\n' ), QChar::LineSeparator ); + } + else +#endif + if ( tmp.contains( QLatin1Char( '\n' ) ) ) + { + tmp.replace( QLatin1Char('\n'), QChar::LineSeparator ); + } + + QTextLayout layout; layout.setFont( font ); layout.setTextOption( textOption ); - layout.setText( text ); + layout.setText( tmp ); layout.beginLayout(); const qreal textHeight = qskLayoutText( &layout, rect.width(), options );