| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 | /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997   Josef Wilgen * Copyright (C) 2002   Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/#include "qwt_text_label.h"#include "qwt_text.h"#include "qwt_painter.h"#include <qpainter.h>#include <qevent.h>#include <qmath.h>class QwtTextLabel::PrivateData{public:    PrivateData():        indent( 4 ),        margin( 0 )    {    }    int indent;    int margin;    QwtText text;};/*!  Constructs an empty label.  \param parent Parent widget*/QwtTextLabel::QwtTextLabel( QWidget *parent ):    QFrame( parent ){    init();}/*!  Constructs a label that displays the text, text  \param parent Parent widget  \param text Text*/QwtTextLabel::QwtTextLabel( const QwtText &text, QWidget *parent ):    QFrame( parent ){    init();    d_data->text = text;}//! DestructorQwtTextLabel::~QwtTextLabel(){    delete d_data;}void QwtTextLabel::init(){    d_data = new PrivateData();    setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );}/*!   Change the label's text, keeping all other QwtText attributes   \param text New text   \param textFormat Format of text  \sa QwtText*/void QwtTextLabel::setText( const QString &text, QwtText::TextFormat textFormat ){    d_data->text.setText( text, textFormat );    update();    updateGeometry();}/*!   Change the label's text   \param text New text*/void QwtTextLabel::setText( const QwtText &text ){    d_data->text = text;    update();    updateGeometry();}//! Return the textconst QwtText &QwtTextLabel::text() const{    return d_data->text;}//! Clear the text and all QwtText attributesvoid QwtTextLabel::clear(){    d_data->text = QwtText();    update();    updateGeometry();}//! Return label's text indent in pixelsint QwtTextLabel::indent() const{    return d_data->indent;}/*!  Set label's text indent in pixels  \param indent Indentation in pixels*/void QwtTextLabel::setIndent( int indent ){    if ( indent < 0 )        indent = 0;    d_data->indent = indent;    update();    updateGeometry();}//! Return label's text indent in pixelsint QwtTextLabel::margin() const{    return d_data->margin;}/*!  Set label's margin in pixels  \param margin Margin in pixels*/void QwtTextLabel::setMargin( int margin ){    d_data->margin = margin;    update();    updateGeometry();}//! Return label's margin in pixelsQSize QwtTextLabel::sizeHint() const{    return minimumSizeHint();}//! Return a minimum size hintQSize QwtTextLabel::minimumSizeHint() const{    QSizeF sz = d_data->text.textSize( font() );    int mw = 2 * ( frameWidth() + d_data->margin );    int mh = mw;    int indent = d_data->indent;    if ( indent <= 0 )        indent = defaultIndent();    if ( indent > 0 )    {        const int align = d_data->text.renderFlags();        if ( align & Qt::AlignLeft || align & Qt::AlignRight )            mw += d_data->indent;        else if ( align & Qt::AlignTop || align & Qt::AlignBottom )            mh += d_data->indent;    }    sz += QSizeF( mw, mh );    return QSize( qCeil( sz.width() ), qCeil( sz.height() ) );}/*!   Returns the preferred height for this widget, given the width.   \param width Width*/int QwtTextLabel::heightForWidth( int width ) const{    const int renderFlags = d_data->text.renderFlags();    int indent = d_data->indent;    if ( indent <= 0 )        indent = defaultIndent();    width -= 2 * frameWidth();    if ( renderFlags & Qt::AlignLeft || renderFlags & Qt::AlignRight )        width -= indent;    int height = d_data->text.heightForWidth( width, font() );    if ( renderFlags & Qt::AlignTop || renderFlags & Qt::AlignBottom )        height += indent;    height += 2 * frameWidth();    return height;}/*!   Qt paint event   \param event Paint event*/void QwtTextLabel::paintEvent( QPaintEvent *event ){    QPainter painter( this );    if ( !contentsRect().contains( event->rect() ) )    {        painter.save();        painter.setClipRegion( event->region() & frameRect() );        drawFrame( &painter );        painter.restore();    }    painter.setClipRegion( event->region() & contentsRect() );    drawContents( &painter );}//! Redraw the text and focus indicatorvoid QwtTextLabel::drawContents( QPainter *painter ){    const QRect r = textRect();    if ( r.isEmpty() )        return;    painter->setFont( font() );    painter->setPen( palette().color( QPalette::Active, QPalette::Text ) );    drawText( painter, r );    if ( hasFocus() )    {        const int margin = 2;        QRect focusRect = contentsRect();        focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin,            focusRect.width() - 2 * margin - 2,            focusRect.height() - 2 * margin - 2 );        QwtPainter::drawFocusRect( painter, this, focusRect );    }}//! Redraw the textvoid QwtTextLabel::drawText( QPainter *painter, const QRect &textRect ){    d_data->text.draw( painter, textRect );}/*!  Calculate the rect for the text in widget coordinates  \return Text rect*/QRect QwtTextLabel::textRect() const{    QRect r = contentsRect();    if ( !r.isEmpty() && d_data->margin > 0 )    {        r.setRect( r.x() + d_data->margin, r.y() + d_data->margin,            r.width() - 2 * d_data->margin, r.height() - 2 * d_data->margin );    }    if ( !r.isEmpty() )    {        int indent = d_data->indent;        if ( indent <= 0 )            indent = defaultIndent();        if ( indent > 0 )        {            const int renderFlags = d_data->text.renderFlags();            if ( renderFlags & Qt::AlignLeft )                r.setX( r.x() + indent );            else if ( renderFlags & Qt::AlignRight )                r.setWidth( r.width() - indent );            else if ( renderFlags & Qt::AlignTop )                r.setY( r.y() + indent );            else if ( renderFlags & Qt::AlignBottom )                r.setHeight( r.height() - indent );        }    }    return r;}int QwtTextLabel::defaultIndent() const{    if ( frameWidth() <= 0 )        return 0;    QFont fnt;    if ( d_data->text.testPaintAttribute( QwtText::PaintUsingTextFont ) )        fnt = d_data->text.font();    else        fnt = font();    return QFontMetrics( fnt ).width( 'x' ) / 2;}
 |