00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qmap.h>
00013 #include "qwt_plot.h"
00014 #include "qwt_plot_grid.h"
00015 #include "qwt_plot_curve.h"
00016 #include "qwt_plot_marker.h"
00017 #include "qwt_symbol.h"
00018 #include "qwt_legend.h"
00019 #include "qwt_legend_item.h"
00020 #include "qwt_scale_widget.h"
00021 #include "qwt_text_label.h"
00022 #include "qwt_plot_printfilter.h"
00023
00024 #if QT_VERSION < 0x040000
00025 typedef QColorGroup Palette;
00026 #else
00027 typedef QPalette Palette;
00028 #endif
00029
00030 class QwtPlotPrintFilter::PrivateData
00031 {
00032 public:
00033 PrivateData():
00034 options(QwtPlotPrintFilter::PrintAll),
00035 cache(NULL)
00036 {
00037 }
00038
00039 ~PrivateData()
00040 {
00041 delete cache;
00042 }
00043
00044 class Cache
00045 {
00046 public:
00047 QColor titleColor;
00048 QFont titleFont;
00049
00050 QwtText scaleTitle[QwtPlot::axisCnt];
00051 QColor scaleColor[QwtPlot::axisCnt];
00052 QFont scaleFont[QwtPlot::axisCnt];
00053 QColor scaleTitleColor[QwtPlot::axisCnt];
00054 QFont scaleTitleFont[QwtPlot::axisCnt];
00055
00056 QMap<QWidget *, QFont> legendFonts;
00057
00058 QColor widgetBackground;
00059 QColor canvasBackground;
00060 QColor gridColors[2];
00061
00062 QMap<const QwtPlotItem *, QColor> curveColors;
00063 QMap<const QwtPlotItem *, QColor> curveSymbolBrushColors;
00064 QMap<const QwtPlotItem *, QColor> curveSymbolPenColors;
00065
00066 QMap<const QwtPlotItem *, QFont> markerFonts;
00067 QMap<const QwtPlotItem *, QColor> markerLabelColors;
00068 QMap<const QwtPlotItem *, QColor> markerLineColors;
00069 QMap<const QwtPlotItem *, QColor> markerSymbolBrushColors;
00070 QMap<const QwtPlotItem *, QColor> markerSymbolPenColors;
00071 };
00072
00073 int options;
00074 mutable Cache *cache;
00075 };
00076
00077
00082 QwtPlotPrintFilter::QwtPlotPrintFilter()
00083 {
00084 d_data = new PrivateData;
00085 }
00086
00088 QwtPlotPrintFilter::~QwtPlotPrintFilter()
00089 {
00090 delete d_data;
00091 }
00092
00099 void QwtPlotPrintFilter::setOptions(int options)
00100 {
00101 d_data->options = options;
00102 }
00103
00108 int QwtPlotPrintFilter::options() const
00109 {
00110 return d_data->options;
00111 }
00112
00124 QColor QwtPlotPrintFilter::color(const QColor &c, Item item) const
00125 {
00126 if ( !(options() & PrintBackground))
00127 {
00128 switch(item)
00129 {
00130 case MajorGrid:
00131 return Qt::darkGray;
00132 case MinorGrid:
00133 return Qt::gray;
00134 default:;
00135 }
00136 }
00137 return c;
00138 }
00139
00148 QFont QwtPlotPrintFilter::font(const QFont &f, Item) const
00149 {
00150 return f;
00151 }
00152
00157 void QwtPlotPrintFilter::apply(QwtPlot *plot) const
00158 {
00159 const bool doAutoReplot = plot->autoReplot();
00160 plot->setAutoReplot(false);
00161
00162 delete d_data->cache;
00163 d_data->cache = new PrivateData::Cache;
00164
00165 PrivateData::Cache &cache = *d_data->cache;
00166
00167 if ( plot->titleLabel() )
00168 {
00169 QPalette palette = plot->titleLabel()->palette();
00170 cache.titleColor = palette.color(
00171 QPalette::Active, Palette::Text);
00172 palette.setColor(QPalette::Active, Palette::Text,
00173 color(cache.titleColor, Title));
00174 plot->titleLabel()->setPalette(palette);
00175
00176 cache.titleFont = plot->titleLabel()->font();
00177 plot->titleLabel()->setFont(font(cache.titleFont, Title));
00178 }
00179 if ( plot->legend() )
00180 {
00181 #if QT_VERSION < 0x040000
00182 QValueList<QWidget *> list = plot->legend()->legendItems();
00183 for ( QValueListIterator<QWidget *> it = list.begin();
00184 it != list.end(); ++it )
00185 #else
00186 QList<QWidget *> list = plot->legend()->legendItems();
00187 for ( QList<QWidget*>::iterator it = list.begin();
00188 it != list.end(); ++it )
00189 #endif
00190 {
00191 QWidget *w = *it;
00192
00193 cache.legendFonts.insert(w, w->font());
00194 w->setFont(font(w->font(), Legend));
00195
00196 if ( w->inherits("QwtLegendItem") )
00197 {
00198 QwtLegendItem *label = (QwtLegendItem *)w;
00199
00200 QwtSymbol symbol = label->symbol();
00201 QPen pen = symbol.pen();
00202 QBrush brush = symbol.brush();
00203
00204 pen.setColor(color(pen.color(), CurveSymbol));
00205 brush.setColor(color(brush.color(), CurveSymbol));
00206
00207 symbol.setPen(pen);
00208 symbol.setBrush(brush);
00209 label->setSymbol(symbol);
00210
00211 pen = label->curvePen();
00212 pen.setColor(color(pen.color(), Curve));
00213 label->setCurvePen(pen);
00214 }
00215 }
00216 }
00217 for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
00218 {
00219 QwtScaleWidget *scaleWidget = plot->axisWidget(axis);
00220 if ( scaleWidget )
00221 {
00222 cache.scaleColor[axis] = scaleWidget->palette().color(
00223 QPalette::Active, Palette::Foreground);
00224 QPalette palette = scaleWidget->palette();
00225 palette.setColor(QPalette::Active, Palette::Foreground,
00226 color(cache.scaleColor[axis], AxisScale));
00227 scaleWidget->setPalette(palette);
00228
00229 cache.scaleFont[axis] = scaleWidget->font();
00230 scaleWidget->setFont(font(cache.scaleFont[axis], AxisScale));
00231
00232 cache.scaleTitle[axis] = scaleWidget->title();
00233
00234 QwtText scaleTitle = scaleWidget->title();
00235 if ( scaleTitle.testPaintAttribute(QwtText::PaintUsingTextColor) )
00236 {
00237 cache.scaleTitleColor[axis] = scaleTitle.color();
00238 scaleTitle.setColor(
00239 color(cache.scaleTitleColor[axis], AxisTitle));
00240 }
00241
00242 if ( scaleTitle.testPaintAttribute(QwtText::PaintUsingTextFont) )
00243 {
00244 cache.scaleTitleFont[axis] = scaleTitle.font();
00245 scaleTitle.setFont(
00246 font(cache.scaleTitleFont[axis], AxisTitle));
00247 }
00248
00249 scaleWidget->setTitle(scaleTitle);
00250
00251 int startDist, endDist;
00252 scaleWidget->getBorderDistHint(startDist, endDist);
00253 scaleWidget->setBorderDist(startDist, endDist);
00254 }
00255 }
00256
00257
00258 QPalette p = plot->palette();
00259 cache.widgetBackground = plot->palette().color(
00260 QPalette::Active, Palette::Background);
00261 p.setColor(QPalette::Active, Palette::Background,
00262 color(cache.widgetBackground, WidgetBackground));
00263 plot->setPalette(p);
00264
00265 cache.canvasBackground = plot->canvasBackground();
00266 plot->setCanvasBackground(color(cache.canvasBackground, CanvasBackground));
00267
00268 const QwtPlotItemList& itmList = plot->itemList();
00269 for ( QwtPlotItemIterator it = itmList.begin();
00270 it != itmList.end(); ++it )
00271 {
00272 apply(*it);
00273 }
00274
00275 plot->setAutoReplot(doAutoReplot);
00276 }
00277
00278 void QwtPlotPrintFilter::apply(QwtPlotItem *item) const
00279 {
00280 PrivateData::Cache &cache = *d_data->cache;
00281
00282 switch(item->rtti())
00283 {
00284 case QwtPlotItem::Rtti_PlotGrid:
00285 {
00286 QwtPlotGrid *grid = (QwtPlotGrid *)item;
00287
00288 QPen pen = grid->majPen();
00289 cache.gridColors[0] = pen.color();
00290 pen.setColor(color(pen.color(), MajorGrid));
00291 grid->setMajPen(pen);
00292
00293 pen = grid->minPen();
00294 cache.gridColors[1] = pen.color();
00295 pen.setColor(color(pen.color(), MinorGrid));
00296 grid->setMinPen(pen);
00297
00298 break;
00299 }
00300 case QwtPlotItem::Rtti_PlotCurve:
00301 {
00302 QwtPlotCurve *c = (QwtPlotCurve *)item;
00303
00304 QwtSymbol symbol = c->symbol();
00305
00306 QPen pen = symbol.pen();
00307 cache.curveSymbolPenColors.insert(c, pen.color());
00308 pen.setColor(color(pen.color(), CurveSymbol));
00309 symbol.setPen(pen);
00310
00311 QBrush brush = symbol.brush();
00312 cache.curveSymbolBrushColors.insert(c, brush.color());
00313 brush.setColor(color(brush.color(), CurveSymbol));
00314 symbol.setBrush(brush);
00315
00316 c->setSymbol(symbol);
00317
00318 pen = c->pen();
00319 cache.curveColors.insert(c, pen.color());
00320 pen.setColor(color(pen.color(), Curve));
00321 c->setPen(pen);
00322
00323 break;
00324 }
00325 case QwtPlotItem::Rtti_PlotMarker:
00326 {
00327 QwtPlotMarker *m = (QwtPlotMarker *)item;
00328
00329 QwtText label = m->label();
00330 cache.markerFonts.insert(m, label.font());
00331 label.setFont(font(label.font(), Marker));
00332 cache.markerLabelColors.insert(m, label.color());
00333 label.setColor(color(label.color(), Marker));
00334 m->setLabel(label);
00335
00336 QPen pen = m->linePen();
00337 cache.markerLineColors.insert(m, pen.color());
00338 pen.setColor(color(pen.color(), Marker));
00339 m->setLinePen(pen);
00340
00341 QwtSymbol symbol = m->symbol();
00342
00343 pen = symbol.pen();
00344 cache.markerSymbolPenColors.insert(m, pen.color());
00345 pen.setColor(color(pen.color(), MarkerSymbol));
00346 symbol.setPen(pen);
00347
00348 QBrush brush = symbol.brush();
00349 cache.markerSymbolBrushColors.insert(m, brush.color());
00350 brush.setColor(color(brush.color(), MarkerSymbol));
00351 symbol.setBrush(brush);
00352
00353 m->setSymbol(symbol);
00354
00355 break;
00356 }
00357 default:
00358 break;
00359 }
00360 }
00361
00366 void QwtPlotPrintFilter::reset(QwtPlot *plot) const
00367 {
00368 if ( d_data->cache == 0 )
00369 return;
00370
00371 const bool doAutoReplot = plot->autoReplot();
00372 plot->setAutoReplot(false);
00373
00374 const PrivateData::Cache &cache = *d_data->cache;
00375
00376 if ( plot->titleLabel() )
00377 {
00378 QwtTextLabel* title = plot->titleLabel();
00379 if ( title->text().testPaintAttribute(QwtText::PaintUsingTextFont) )
00380 {
00381 QwtText text = title->text();
00382 text.setColor(cache.titleColor);
00383 title->setText(text);
00384 }
00385 else
00386 {
00387 QPalette palette = title->palette();
00388 palette.setColor(
00389 QPalette::Active, Palette::Text, cache.titleColor);
00390 title->setPalette(palette);
00391 }
00392
00393 if ( title->text().testPaintAttribute(QwtText::PaintUsingTextFont) )
00394 {
00395 QwtText text = title->text();
00396 text.setFont(cache.titleFont);
00397 title->setText(text);
00398 }
00399 else
00400 {
00401 title->setFont(cache.titleFont);
00402 }
00403 }
00404
00405 if ( plot->legend() )
00406 {
00407 #if QT_VERSION < 0x040000
00408 QValueList<QWidget *> list = plot->legend()->legendItems();
00409 for ( QValueListIterator<QWidget *> it = list.begin();
00410 it != list.end(); ++it )
00411 #else
00412 QList<QWidget *> list = plot->legend()->legendItems();
00413 for ( QList<QWidget*>::iterator it = list.begin();
00414 it != list.end(); ++it )
00415 #endif
00416 {
00417 QWidget *w = *it;
00418
00419 if ( cache.legendFonts.contains(w) )
00420 w->setFont(cache.legendFonts[w]);
00421
00422 if ( w->inherits("QwtLegendItem") )
00423 {
00424 QwtLegendItem *label = (QwtLegendItem *)w;
00425 const QwtPlotItem *plotItem =
00426 (const QwtPlotItem*)plot->legend()->find(label);
00427
00428 QwtSymbol symbol = label->symbol();
00429 if ( cache.curveSymbolPenColors.contains(plotItem) )
00430 {
00431 QPen pen = symbol.pen();
00432 pen.setColor(cache.curveSymbolPenColors[plotItem]);
00433 symbol.setPen(pen);
00434 }
00435
00436 if ( cache.curveSymbolBrushColors.contains(plotItem) )
00437 {
00438 QBrush brush = symbol.brush();
00439 brush.setColor(cache.curveSymbolBrushColors[plotItem]);
00440 symbol.setBrush(brush);
00441 }
00442 label->setSymbol(symbol);
00443
00444 if ( cache.curveColors.contains(plotItem) )
00445 {
00446 QPen pen = label->curvePen();
00447 pen.setColor(cache.curveColors[plotItem]);
00448 label->setCurvePen(pen);
00449 }
00450 }
00451 }
00452 }
00453 for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
00454 {
00455 QwtScaleWidget *scaleWidget = plot->axisWidget(axis);
00456 if ( scaleWidget )
00457 {
00458 QPalette palette = scaleWidget->palette();
00459 palette.setColor(QPalette::Active, Palette::Foreground,
00460 cache.scaleColor[axis]);
00461 scaleWidget->setPalette(palette);
00462
00463 scaleWidget->setFont(cache.scaleFont[axis]);
00464 scaleWidget->setTitle(cache.scaleTitle[axis]);
00465
00466 int startDist, endDist;
00467 scaleWidget->getBorderDistHint(startDist, endDist);
00468 scaleWidget->setBorderDist(startDist, endDist);
00469 }
00470 }
00471
00472 QPalette p = plot->palette();
00473 p.setColor(QPalette::Active, Palette::Background, cache.widgetBackground);
00474 plot->setPalette(p);
00475
00476 plot->setCanvasBackground(cache.canvasBackground);
00477
00478 const QwtPlotItemList& itmList = plot->itemList();
00479 for ( QwtPlotItemIterator it = itmList.begin();
00480 it != itmList.end(); ++it )
00481 {
00482 reset(*it);
00483 }
00484
00485 delete d_data->cache;
00486 d_data->cache = 0;
00487
00488 plot->setAutoReplot(doAutoReplot);
00489 }
00490
00491 void QwtPlotPrintFilter::reset(QwtPlotItem *item) const
00492 {
00493 if ( d_data->cache == 0 )
00494 return;
00495
00496 const PrivateData::Cache &cache = *d_data->cache;
00497
00498 switch(item->rtti())
00499 {
00500 case QwtPlotItem::Rtti_PlotGrid:
00501 {
00502 QwtPlotGrid *grid = (QwtPlotGrid *)item;
00503
00504 QPen pen = grid->majPen();
00505 pen.setColor(cache.gridColors[0]);
00506 grid->setMajPen(pen);
00507
00508 pen = grid->minPen();
00509 pen.setColor(cache.gridColors[1]);
00510 grid->setMinPen(pen);
00511
00512 break;
00513 }
00514 case QwtPlotItem::Rtti_PlotCurve:
00515 {
00516 QwtPlotCurve *c = (QwtPlotCurve *)item;
00517
00518 QwtSymbol symbol = c->symbol();
00519
00520 if ( cache.curveSymbolPenColors.contains(c) )
00521 {
00522 symbol.setPen(cache.curveSymbolPenColors[c]);
00523 }
00524
00525 if ( cache.curveSymbolBrushColors.contains(c) )
00526 {
00527 QBrush brush = symbol.brush();
00528 brush.setColor(cache.curveSymbolBrushColors[c]);
00529 symbol.setBrush(brush);
00530 }
00531 c->setSymbol(symbol);
00532
00533 if ( cache.curveColors.contains(c) )
00534 {
00535 QPen pen = c->pen();
00536 pen.setColor(cache.curveColors[c]);
00537 c->setPen(pen);
00538 }
00539
00540 break;
00541 }
00542 case QwtPlotItem::Rtti_PlotMarker:
00543 {
00544 QwtPlotMarker *m = (QwtPlotMarker *)item;
00545
00546 if ( cache.markerFonts.contains(m) )
00547 {
00548 QwtText label = m->label();
00549 label.setFont(cache.markerFonts[m]);
00550 m->setLabel(label);
00551 }
00552
00553 if ( cache.markerLabelColors.contains(m) )
00554 {
00555 QwtText label = m->label();
00556 label.setColor(cache.markerLabelColors[m]);
00557 m->setLabel(label);
00558 }
00559
00560 if ( cache.markerLineColors.contains(m) )
00561 {
00562 QPen pen = m->linePen();
00563 pen.setColor(cache.markerLineColors[m]);
00564 m->setLinePen(pen);
00565 }
00566
00567 QwtSymbol symbol = m->symbol();
00568
00569 if ( cache.markerSymbolPenColors.contains(m) )
00570 {
00571 QPen pen = symbol.pen();
00572 pen.setColor(cache.markerSymbolPenColors[m]);
00573 symbol.setPen(pen);
00574 }
00575
00576 if ( cache.markerSymbolBrushColors.contains(m) )
00577 {
00578 QBrush brush = symbol.brush();
00579 brush.setColor(cache.markerSymbolBrushColors[m]);
00580 symbol.setBrush(brush);
00581 }
00582
00583 m->setSymbol(symbol);
00584
00585 break;
00586 }
00587 default:
00588 break;
00589 }
00590 }