00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <qpainter.h>
00013
#include <qstyle.h>
00014
#include <qevent.h>
00015
#include "qwt_painter.h"
00016
#include "qwt_math.h"
00017
#include "qwt_plot.h"
00018
#include "qwt_paint_buffer.h"
00019
#include "qwt_plot_canvas.h"
00020
00021
static const int dim = 5000;
00022
00024
00025 QwtPlotCanvas::QwtPlotCanvas(
QwtPlot *plot):
00026 QFrame(plot,
"canvas", Qt::WRepaintNoErase|Qt::WResizeNoErase),
00027 d_focusIndicator(CanvasFocusIndicator),
00028 d_cacheMode(TRUE),
00029 d_cache(NULL)
00030 #ifndef QWT_NO_COMPAT
00031 ,d_outlineEnabled(FALSE),
00032 d_outlineActive(FALSE),
00033 d_mousePressed(FALSE),
00034 d_outline(Qwt::Rect),
00035 d_pen(Qt::red)
00036 #endif
00037 {
00038 setCursor(Qt::crossCursor);
00039 }
00040
00042 QwtPlotCanvas::~QwtPlotCanvas()
00043 {
00044
delete d_cache;
00045 }
00046
00066 void QwtPlotCanvas::setCacheMode(
bool on)
00067 {
00068
if ( d_cacheMode != on )
00069 {
00070 d_cacheMode = on;
00071
if (!d_cacheMode )
00072 {
00073
delete d_cache;
00074 d_cache = NULL;
00075 }
00076 }
00077 }
00078
00083 bool QwtPlotCanvas::cacheMode()
const
00084
{
00085
return d_cacheMode;
00086 }
00087
00089 QPixmap *
QwtPlotCanvas::cache()
00090 {
00091
return d_cache;
00092 }
00093
00095 const QPixmap *
QwtPlotCanvas::cache()
const
00096
{
00097
return d_cache;
00098 }
00099
00101 void QwtPlotCanvas::invalidateCache()
00102 {
00103
if ( d_cache )
00104 d_cache->resize(0, 0);
00105 }
00106
00112 void QwtPlotCanvas::setFocusIndicator(FocusIndicator focusIndicator)
00113 {
00114 d_focusIndicator = focusIndicator;
00115 }
00116
00122 QwtPlotCanvas::FocusIndicator QwtPlotCanvas::focusIndicator()
const
00123
{
00124
return d_focusIndicator;
00125 }
00126
00128 void QwtPlotCanvas::frameChanged()
00129 {
00130 QFrame::frameChanged();
00131
00132
00133
00134
00135 ((
QwtPlot *)parent())->updateLayout();
00136 }
00137
00139 void QwtPlotCanvas::drawContents(QPainter *painter)
00140 {
00141
if (
cacheMode() && d_cache
00142 && d_cache->size() == contentsRect().size() )
00143 {
00144 painter->drawPixmap(contentsRect().topLeft(), *d_cache);
00145 }
00146
else
00147
drawCanvas(painter);
00148
00149
#ifndef QWT_NO_COMPAT
00150
if ( d_outlineActive )
00151 drawOutline(*painter);
00152
#endif
00153
00154
if ( hasFocus() &&
focusIndicator() == CanvasFocusIndicator )
00155 {
00156
const int margin = 1;
00157 QRect focusRect = contentsRect();
00158 focusRect.setRect(focusRect.x() + margin, focusRect.y() + margin,
00159 focusRect.width() - 2 * margin, focusRect.height() - 2 * margin);
00160
00161
drawFocusIndicator(painter, focusRect);
00162 }
00163 }
00164
00174 void QwtPlotCanvas::drawCanvas(QPainter *painter)
00175 {
00176
if ( !contentsRect().isValid() )
00177
return;
00178
00179 QRect clipRect = contentsRect();
00180
if ( !
cacheMode() || !
QwtPaintBuffer::isEnabled() )
00181 {
00182
00183
00184
00185
if ( painter && !painter->clipRegion().isNull() )
00186 clipRect = painter->clipRegion().boundingRect();
00187 }
00188
00189
QwtPaintBuffer paintBuffer(
this, clipRect, painter);
00190 ((
QwtPlot *)parent())->drawCanvas(paintBuffer.
painter());
00191
00192
if (
cacheMode() )
00193 {
00194
if ( d_cache == NULL )
00195 {
00196 d_cache =
new QPixmap(contentsRect().size());
00197
#if QT_VERSION >= 300
00198
#ifdef Q_WS_X11
00199
if ( d_cache->x11Screen() != x11Screen() )
00200 d_cache->x11SetScreen(x11Screen());
00201
#endif
00202
#endif
00203
}
00204
else
00205 d_cache->resize(contentsRect().size());
00206
00207
if (
QwtPaintBuffer::isEnabled() )
00208 *d_cache = paintBuffer.
buffer();
00209
else
00210 {
00211 d_cache->fill(
this, 0, 0);
00212 QPainter cachePainter(d_cache);
00213 cachePainter.translate(-contentsRect().x(),
00214 -contentsRect().y());
00215 ((
QwtPlot *)parent())->drawCanvas(&cachePainter);
00216 }
00217 }
00218 }
00219
00221 void QwtPlotCanvas::drawFocusIndicator(QPainter *painter,
const QRect &rect)
00222 {
00223
#if QT_VERSION < 300
00224
style().drawFocusRect(painter, rect, colorGroup());
00225
#else
00226
style().drawPrimitive(QStyle::PE_FocusRect, painter,
00227 rect, colorGroup());
00228
#endif
00229
}
00230
00231
#ifndef QWT_NO_COMPAT
00232
00234 void QwtPlotCanvas::mousePressEvent(QMouseEvent *e)
00235 {
00236
if (d_outlineActive)
00237 {
00238 QPainter p(
this);
00239 drawOutline(p);
00240 }
00241
00242 d_outlineActive = FALSE;
00243
00244
00245
00246
00247 d_lastPoint = e->pos();
00248 d_entryPoint = e->pos();
00249
00250
if (d_outlineEnabled)
00251 {
00252 QPainter p(
this);
00253 drawOutline(p);
00254 d_outlineActive = TRUE;
00255 }
00256
00257 d_mousePressed = TRUE;
00258
00259 QMouseEvent m(QEvent::MouseButtonPress,
00260 e->pos() - rect().topLeft(), e->button(), e->state());
00261
00262 emit
mousePressed(m);
00263 }
00264
00266 void QwtPlotCanvas::mouseReleaseEvent(QMouseEvent *e)
00267 {
00268
if (d_outlineActive)
00269 {
00270 QPainter p(
this);
00271 drawOutline(p);
00272 }
00273
00274 d_outlineActive = FALSE;
00275 d_mousePressed = FALSE;
00276
00277 QMouseEvent m(QEvent::MouseButtonRelease,
00278 e->pos() - rect().topLeft(), e->button(), e->state());
00279
00280 emit
mouseReleased(m);
00281 }
00282
00284 void QwtPlotCanvas::mouseMoveEvent(QMouseEvent *e)
00285 {
00286
if (d_outlineActive)
00287 {
00288 QPainter p(
this);
00289 drawOutline(p);
00290 d_lastPoint = e->pos();
00291 drawOutline(p);
00292 }
00293
00294 QMouseEvent m(QEvent::MouseMove,
00295 e->pos() - rect().topLeft(), e->button(), e->state());
00296
00297 emit
mouseMoved(m);
00298 }
00299
00315 void QwtPlotCanvas::enableOutline(
bool tf)
00316 {
00317
00318
00319
00320
00321
00322
if ((tf != d_outlineEnabled) && d_mousePressed)
00323 {
00324 QPainter p(
this);
00325 drawOutline(p);
00326 d_outlineActive = tf;
00327 }
00328 d_outlineEnabled = tf;
00329 }
00330
00340 bool QwtPlotCanvas::outlineEnabled()
const
00341
{
00342
return d_outlineEnabled;
00343 }
00344
00379 void QwtPlotCanvas::setOutlineStyle(Qwt::Shape os)
00380 {
00381
if (d_outlineActive)
00382 {
00383 QPainter p(
this);
00384 drawOutline(p);
00385 }
00386
00387 d_outline = os;
00388
00389
if (d_outlineActive)
00390 {
00391 QPainter p(
this);
00392 drawOutline(p);
00393 }
00394 }
00395
00404 Qwt::Shape
QwtPlotCanvas::outlineStyle()
const
00405
{
00406
return d_outline;
00407 }
00408
00419 void QwtPlotCanvas::setOutlinePen(
const QPen &pen)
00420 {
00421 d_pen = pen;
00422 }
00423
00433 const QPen&
QwtPlotCanvas::outlinePen()
const
00434
{
00435
return d_pen;
00436 }
00437
00444
void QwtPlotCanvas::drawOutline(QPainter &p)
00445 {
00446
const QRect &r = contentsRect();
00447
00448 QColor bg = ((
QwtPlot *)parent())->canvasBackground();
00449
00450 QPen pn = d_pen;
00451 pn.setColor(QColor(bg.rgb() ^ d_pen.color().rgb()));
00452
00453 p.setPen(pn);
00454 p.setRasterOp(XorROP);
00455 p.setClipRect(r);
00456 p.setClipping(TRUE);
00457
00458
switch(d_outline)
00459 {
00460
case Qwt::VLine:
00461
QwtPainter::drawLine(&p, d_lastPoint.x(),
00462 r.top(), d_lastPoint.x(), r.bottom());
00463
break;
00464
00465
case Qwt::HLine:
00466
QwtPainter::drawLine(&p, r.left(),
00467 d_lastPoint.y(), r.right(), d_lastPoint.y());
00468
break;
00469
00470
case Qwt::Cross:
00471
QwtPainter::drawLine(&p, r.left(),
00472 d_lastPoint.y(), r.right(), d_lastPoint.y());
00473
QwtPainter::drawLine(&p, d_lastPoint.x(),
00474 r.top(), d_lastPoint.x(), r.bottom());
00475
break;
00476
00477
case Qwt::Rect:
00478
QwtPainter::drawRect(&p, d_entryPoint.x(), d_entryPoint.y(),
00479 d_lastPoint.x() - d_entryPoint.x() + 1,
00480 d_lastPoint.y() - d_entryPoint.y() + 1);
00481
break;
00482
00483
case Qwt::Ellipse:
00484 p.drawEllipse(d_entryPoint.x(), d_entryPoint.y(),
00485 d_lastPoint.x() - d_entryPoint.x() + 1,
00486 d_lastPoint.y() - d_entryPoint.y() + 1);
00487
break;
00488
00489
default:
00490
break;
00491 }
00492 }
00493
00494
#endif // !QWT_NO_COMPAT
00495
00496
00497
00498
00499
00500
00501