| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | /* -*- 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_plot_dict.h"class QwtPlotDict::PrivateData{public:    class ItemList: public QList<QwtPlotItem *>    {    public:        void insertItem( QwtPlotItem *item )        {            if ( item == NULL )                return;            QList<QwtPlotItem *>::iterator it =                qUpperBound( begin(), end(), item, LessZThan() );            insert( it, item );        }        void removeItem( QwtPlotItem *item )        {            if ( item == NULL )                return;            QList<QwtPlotItem *>::iterator it =                qLowerBound( begin(), end(), item, LessZThan() );            for ( ; it != end(); ++it )            {                if ( item == *it )                {                    erase( it );                    break;                }            }        }    private:        class LessZThan        {        public:            inline bool operator()( const QwtPlotItem *item1,                const QwtPlotItem *item2 ) const            {                return item1->z() < item2->z();            }        };    };    ItemList itemList;    bool autoDelete;};/*!   Constructor   Auto deletion is enabled.   \sa setAutoDelete(), attachItem()*/QwtPlotDict::QwtPlotDict(){    d_data = new QwtPlotDict::PrivateData;    d_data->autoDelete = true;}/*!   Destructor   If autoDelete is on, all attached items will be deleted   \sa setAutoDelete(), autoDelete(), attachItem()*/QwtPlotDict::~QwtPlotDict(){    detachItems( QwtPlotItem::Rtti_PlotItem, d_data->autoDelete );    delete d_data;}/*!   En/Disable Auto deletion   If Auto deletion is on all attached plot items will be deleted   in the destructor of QwtPlotDict. The default value is on.   \sa autoDelete(), attachItem()*/void QwtPlotDict::setAutoDelete( bool autoDelete ){    d_data->autoDelete = autoDelete;}/*!   \return true if auto deletion is enabled   \sa setAutoDelete(), attachItem()*/bool QwtPlotDict::autoDelete() const{    return d_data->autoDelete;}/*!   Attach/Detach a plot item   Attached items will be deleted in the destructor,   if auto deletion is enabled (default). Manually detached   items are not deleted.   \param item Plot item to attach/detach   \ on If true attach, else detach the item   \sa setAutoDelete(), ~QwtPlotDict()*/void QwtPlotDict::attachItem( QwtPlotItem *item, bool on ){    if ( on )        d_data->itemList.insertItem( item );    else        d_data->itemList.removeItem( item );}/*!   Detach items from the dictionary   \param rtti In case of QwtPlotItem::Rtti_PlotItem detach all items               otherwise only those items of the type rtti.   \param autoDelete If true, delete all detached items*/void QwtPlotDict::detachItems( int rtti, bool autoDelete ){    PrivateData::ItemList list = d_data->itemList;    QwtPlotItemIterator it = list.begin();    while ( it != list.end() )    {        QwtPlotItem *item = *it;        ++it; // increment before removing item from the list        if ( rtti == QwtPlotItem::Rtti_PlotItem || item->rtti() == rtti )        {            item->attach( NULL );            if ( autoDelete )                delete item;        }    }}/*!  \brief A QwtPlotItemList of all attached plot items.  Use caution when iterating these lists, as removing/detaching an item will  invalidate the iterator. Instead you can place pointers to objects to be  removed in a removal list, and traverse that list later.  \return List of all attached plot items.*/const QwtPlotItemList &QwtPlotDict::itemList() const{    return d_data->itemList;}/*!  \return List of all attached plot items of a specific type.  \sa QwtPlotItem::rtti()*/QwtPlotItemList QwtPlotDict::itemList( int rtti ) const{    if ( rtti == QwtPlotItem::Rtti_PlotItem )        return d_data->itemList;    QwtPlotItemList items;    PrivateData::ItemList list = d_data->itemList;    for ( QwtPlotItemIterator it = list.begin(); it != list.end(); ++it )    {        QwtPlotItem *item = *it;        if ( item->rtti() == rtti )            items += item;    }    return items;}
 |