| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 | 
							- /* -*- 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_legend_item.h"
 
- #include "qwt_math.h"
 
- #include "qwt_painter.h"
 
- #include "qwt_symbol.h"
 
- #include <qpainter.h>
 
- #include <qdrawutil.h>
 
- #include <qstyle.h>
 
- #include <qpen.h>
 
- #include <qevent.h>
 
- #include <qstyleoption.h>
 
- static const int ButtonFrame = 2;
 
- static const int Margin = 2;
 
- static QSize buttonShift( const QwtLegendItem *w )
 
- {
 
-     QStyleOption option;
 
-     option.init( w );
 
-     const int ph = w->style()->pixelMetric(
 
-         QStyle::PM_ButtonShiftHorizontal, &option, w );
 
-     const int pv = w->style()->pixelMetric(
 
-         QStyle::PM_ButtonShiftVertical, &option, w );
 
-     return QSize( ph, pv );
 
- }
 
- class QwtLegendItem::PrivateData
 
- {
 
- public:
 
-     PrivateData():
 
-         itemMode( QwtLegend::ReadOnlyItem ),
 
-         isDown( false ),
 
-         identifierSize( 8, 8 ),
 
-         spacing( Margin )
 
-     {
 
-     }
 
-     QwtLegend::LegendItemMode itemMode;
 
-     bool isDown;
 
-     QSize identifierSize;
 
-     QPixmap identifier;
 
-     int spacing;
 
- };
 
- /*!
 
-   \param parent Parent widget
 
- */
 
- QwtLegendItem::QwtLegendItem( QWidget *parent ):
 
-     QwtTextLabel( parent )
 
- {
 
-     d_data = new PrivateData;
 
-     setMargin( Margin );
 
-     setIndent( Margin + d_data->identifierSize.width() + 2 * d_data->spacing );
 
- }
 
- //! Destructor
 
- QwtLegendItem::~QwtLegendItem()
 
- {
 
-     delete d_data;
 
-     d_data = NULL;
 
- }
 
- /*!
 
-    Set the text to the legend item
 
-    \param text Text label
 
-     \sa QwtTextLabel::text()
 
- */
 
- void QwtLegendItem::setText( const QwtText &text )
 
- {
 
-     const int flags = Qt::AlignLeft | Qt::AlignVCenter
 
-         | Qt::TextExpandTabs | Qt::TextWordWrap;
 
-     QwtText txt = text;
 
-     txt.setRenderFlags( flags );
 
-     QwtTextLabel::setText( txt );
 
- }
 
- /*!
 
-    Set the item mode
 
-    The default is QwtLegend::ReadOnlyItem
 
-    \param mode Item mode
 
-    \sa itemMode()
 
- */
 
- void QwtLegendItem::setItemMode( QwtLegend::LegendItemMode mode )
 
- {
 
-     if ( mode != d_data->itemMode )
 
-     {
 
-         d_data->itemMode = mode;
 
-         d_data->isDown = false;
 
-         setFocusPolicy( mode != QwtLegend::ReadOnlyItem ? Qt::TabFocus : Qt::NoFocus );
 
-         setMargin( ButtonFrame + Margin );
 
-         updateGeometry();
 
-     }
 
- }
 
- /*!
 
-    Return the item mode
 
-    \sa setItemMode()
 
- */
 
- QwtLegend::LegendItemMode QwtLegendItem::itemMode() const
 
- {
 
-     return d_data->itemMode;
 
- }
 
- /*!
 
-   Assign the identifier
 
-   The identifier needs to be created according to the identifierWidth()
 
-   \param identifier Pixmap representing a plot item
 
-   \sa identifier(), identifierWidth()
 
- */
 
- void QwtLegendItem::setIdentifier( const QPixmap &identifier )
 
- {
 
-     d_data->identifier = identifier;
 
-     update();
 
- }
 
- /*!
 
-   \return pixmap representing a plot item
 
-   \sa setIdentifier()
 
- */
 
- QPixmap QwtLegendItem::identifier() const
 
- {
 
-     return d_data->identifier;
 
- }
 
- /*!
 
-   Set the size for the identifier
 
-   Default is 8x8 pixels
 
-   \param size New size
 
-   \sa identifierSize()
 
- */
 
- void QwtLegendItem::setIdentifierSize( const QSize &size )
 
- {
 
-     QSize sz = size.expandedTo( QSize( 0, 0 ) );
 
-     if ( sz != d_data->identifierSize )
 
-     {
 
-         d_data->identifierSize = sz;
 
-         setIndent( margin() + d_data->identifierSize.width()
 
-             + 2 * d_data->spacing );
 
-         updateGeometry();
 
-     }
 
- }
 
- /*!
 
-    Return the width of the identifier
 
-    \sa setIdentifierSize()
 
- */
 
- QSize QwtLegendItem::identifierSize() const
 
- {
 
-     return d_data->identifierSize;
 
- }
 
- /*!
 
-    Change the spacing
 
-    \param spacing Spacing
 
-    \sa spacing(), identifierWidth(), QwtTextLabel::margin()
 
- */
 
- void QwtLegendItem::setSpacing( int spacing )
 
- {
 
-     spacing = qMax( spacing, 0 );
 
-     if ( spacing != d_data->spacing )
 
-     {
 
-         d_data->spacing = spacing;
 
-         setIndent( margin() + d_data->identifierSize.width()
 
-             + 2 * d_data->spacing );
 
-     }
 
- }
 
- /*!
 
-    Return the spacing
 
-    \sa setSpacing(), identifierWidth(), QwtTextLabel::margin()
 
- */
 
- int QwtLegendItem::spacing() const
 
- {
 
-     return d_data->spacing;
 
- }
 
- /*!
 
-     Check/Uncheck a the item
 
-     \param on check/uncheck
 
-     \sa setItemMode()
 
- */
 
- void QwtLegendItem::setChecked( bool on )
 
- {
 
-     if ( d_data->itemMode == QwtLegend::CheckableItem )
 
-     {
 
-         const bool isBlocked = signalsBlocked();
 
-         blockSignals( true );
 
-         setDown( on );
 
-         blockSignals( isBlocked );
 
-     }
 
- }
 
- //! Return true, if the item is checked
 
- bool QwtLegendItem::isChecked() const
 
- {
 
-     return d_data->itemMode == QwtLegend::CheckableItem && isDown();
 
- }
 
- //! Set the item being down
 
- void QwtLegendItem::setDown( bool down )
 
- {
 
-     if ( down == d_data->isDown )
 
-         return;
 
-     d_data->isDown = down;
 
-     update();
 
-     if ( d_data->itemMode == QwtLegend::ClickableItem )
 
-     {
 
-         if ( d_data->isDown )
 
-             Q_EMIT pressed();
 
-         else
 
-         {
 
-             Q_EMIT released();
 
-             Q_EMIT clicked();
 
-         }
 
-     }
 
-     if ( d_data->itemMode == QwtLegend::CheckableItem )
 
-         Q_EMIT checked( d_data->isDown );
 
- }
 
- //! Return true, if the item is down
 
- bool QwtLegendItem::isDown() const
 
- {
 
-     return d_data->isDown;
 
- }
 
- //! Return a size hint
 
- QSize QwtLegendItem::sizeHint() const
 
- {
 
-     QSize sz = QwtTextLabel::sizeHint();
 
-     sz.setHeight( qMax( sz.height(), d_data->identifier.height() + 4 ) );
 
-     if ( d_data->itemMode != QwtLegend::ReadOnlyItem )
 
-         sz += buttonShift( this );
 
-     return sz;
 
- }
 
- //! Paint event
 
- void QwtLegendItem::paintEvent( QPaintEvent *e )
 
- {
 
-     const QRect cr = contentsRect();
 
-     QPainter painter( this );
 
-     painter.setClipRegion( e->region() );
 
-     if ( d_data->isDown )
 
-     {
 
-         qDrawWinButton( &painter, 0, 0, width(), height(),
 
-             palette(), true );
 
-     }
 
-     painter.save();
 
-     if ( d_data->isDown )
 
-     {
 
-         const QSize shiftSize = buttonShift( this );
 
-         painter.translate( shiftSize.width(), shiftSize.height() );
 
-     }
 
-     painter.setClipRect( cr );
 
-     drawContents( &painter );
 
-     if ( !d_data->identifier.isNull() )
 
-     {
 
-         QRect identRect = cr;
 
-         identRect.setX( identRect.x() + margin() );
 
-         if ( d_data->itemMode != QwtLegend::ReadOnlyItem )
 
-             identRect.setX( identRect.x() + ButtonFrame );
 
-         identRect.setSize( d_data->identifier.size() );
 
-         identRect.moveCenter( QPoint( identRect.center().x(), cr.center().y() ) );
 
-         painter.drawPixmap( identRect, d_data->identifier );
 
-     }
 
-     painter.restore();
 
- }
 
- //! Handle mouse press events
 
- void QwtLegendItem::mousePressEvent( QMouseEvent *e )
 
- {
 
-     if ( e->button() == Qt::LeftButton )
 
-     {
 
-         switch ( d_data->itemMode )
 
-         {
 
-             case QwtLegend::ClickableItem:
 
-             {
 
-                 setDown( true );
 
-                 return;
 
-             }
 
-             case QwtLegend::CheckableItem:
 
-             {
 
-                 setDown( !isDown() );
 
-                 return;
 
-             }
 
-             default:;
 
-         }
 
-     }
 
-     QwtTextLabel::mousePressEvent( e );
 
- }
 
- //! Handle mouse release events
 
- void QwtLegendItem::mouseReleaseEvent( QMouseEvent *e )
 
- {
 
-     if ( e->button() == Qt::LeftButton )
 
-     {
 
-         switch ( d_data->itemMode )
 
-         {
 
-             case QwtLegend::ClickableItem:
 
-             {
 
-                 setDown( false );
 
-                 return;
 
-             }
 
-             case QwtLegend::CheckableItem:
 
-             {
 
-                 return; // do nothing, but accept
 
-             }
 
-             default:;
 
-         }
 
-     }
 
-     QwtTextLabel::mouseReleaseEvent( e );
 
- }
 
- //! Handle key press events
 
- void QwtLegendItem::keyPressEvent( QKeyEvent *e )
 
- {
 
-     if ( e->key() == Qt::Key_Space )
 
-     {
 
-         switch ( d_data->itemMode )
 
-         {
 
-             case QwtLegend::ClickableItem:
 
-             {
 
-                 if ( !e->isAutoRepeat() )
 
-                     setDown( true );
 
-                 return;
 
-             }
 
-             case QwtLegend::CheckableItem:
 
-             {
 
-                 if ( !e->isAutoRepeat() )
 
-                     setDown( !isDown() );
 
-                 return;
 
-             }
 
-             default:;
 
-         }
 
-     }
 
-     QwtTextLabel::keyPressEvent( e );
 
- }
 
- //! Handle key release events
 
- void QwtLegendItem::keyReleaseEvent( QKeyEvent *e )
 
- {
 
-     if ( e->key() == Qt::Key_Space )
 
-     {
 
-         switch ( d_data->itemMode )
 
-         {
 
-             case QwtLegend::ClickableItem:
 
-             {
 
-                 if ( !e->isAutoRepeat() )
 
-                     setDown( false );
 
-                 return;
 
-             }
 
-             case QwtLegend::CheckableItem:
 
-             {
 
-                 return; // do nothing, but accept
 
-             }
 
-             default:;
 
-         }
 
-     }
 
-     QwtTextLabel::keyReleaseEvent( e );
 
- }
 
 
  |