1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
/* -*- 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(), QwtPlotItem::attach()
*/
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(), QwtPlotItem::attach()
*/
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(), insertItem()
*/
void QwtPlotDict::setAutoDelete( bool autoDelete )
{
d_data->autoDelete = autoDelete;
}
/*!
\return true if auto deletion is enabled
\sa setAutoDelete(), insertItem()
*/
bool QwtPlotDict::autoDelete() const
{
return d_data->autoDelete;
}
/*!
Insert a plot item
\param item PlotItem
\sa removeItem()
*/
void QwtPlotDict::insertItem( QwtPlotItem *item )
{
d_data->itemList.insertItem( item );
}
/*!
Remove a plot item
\param item PlotItem
\sa insertItem()
*/
void QwtPlotDict::removeItem( QwtPlotItem *item )
{
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.
\param rtti See QwtPlotItem::RttiValues
\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;
}
|