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;
- }
- //! Destructor
- QwtTextLabel::~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 text
- const QwtText &QwtTextLabel::text() const
- {
- return d_data->text;
- }
- //! Clear the text and all QwtText attributes
- void QwtTextLabel::clear()
- {
- d_data->text = QwtText();
- update();
- updateGeometry();
- }
- //! Return label's text indent in pixels
- int 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 pixels
- int 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 pixels
- QSize QwtTextLabel::sizeHint() const
- {
- return minimumSizeHint();
- }
- //! Return a minimum size hint
- QSize 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 indicator
- void 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 text
- void 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;
- }
|