00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** 00002 * Qwt Widget Library 00003 * Copyright (C) 1997 Josef Wilgen 00004 * Copyright (C) 2002 Uwe Rathmann 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the Qwt License, Version 1.0 00008 *****************************************************************************/ 00009 00010 // vim: expandtab 00011 00012 #include "qwt_scale_div.h" 00013 #include "qwt_plot.h" 00014 #include "qwt_plot_canvas.h" 00015 #include "qwt_plot_panner.h" 00016 00017 class QwtPlotPanner::PrivateData 00018 { 00019 public: 00020 PrivateData() 00021 { 00022 for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) 00023 isAxisEnabled[axis] = true; 00024 } 00025 00026 bool isAxisEnabled[QwtPlot::axisCnt]; 00027 }; 00028 00038 QwtPlotPanner::QwtPlotPanner(QwtPlotCanvas *canvas): 00039 QwtPanner(canvas) 00040 { 00041 d_data = new PrivateData(); 00042 00043 connect(this, SIGNAL(panned(int, int)), 00044 SLOT(moveCanvas(int, int))); 00045 } 00046 00048 QwtPlotPanner::~QwtPlotPanner() 00049 { 00050 delete d_data; 00051 } 00052 00064 void QwtPlotPanner::setAxisEnabled(int axis, bool on) 00065 { 00066 if ( axis >= 0 && axis <= QwtPlot::axisCnt ) 00067 d_data->isAxisEnabled[axis] = on; 00068 } 00069 00078 bool QwtPlotPanner::isAxisEnabled(int axis) const 00079 { 00080 if ( axis >= 0 && axis <= QwtPlot::axisCnt ) 00081 return d_data->isAxisEnabled[axis]; 00082 00083 return true; 00084 } 00085 00087 QwtPlotCanvas *QwtPlotPanner::canvas() 00088 { 00089 QWidget *w = parentWidget(); 00090 if ( w && w->inherits("QwtPlotCanvas") ) 00091 return (QwtPlotCanvas *)w; 00092 00093 return NULL; 00094 } 00095 00097 const QwtPlotCanvas *QwtPlotPanner::canvas() const 00098 { 00099 return ((QwtPlotPanner *)this)->canvas(); 00100 } 00101 00103 QwtPlot *QwtPlotPanner::plot() 00104 { 00105 QObject *w = canvas(); 00106 if ( w ) 00107 { 00108 w = w->parent(); 00109 if ( w && w->inherits("QwtPlot") ) 00110 return (QwtPlot *)w; 00111 } 00112 00113 return NULL; 00114 } 00115 00117 const QwtPlot *QwtPlotPanner::plot() const 00118 { 00119 return ((QwtPlotPanner *)this)->plot(); 00120 } 00121 00130 void QwtPlotPanner::moveCanvas(int dx, int dy) 00131 { 00132 if ( dx == 0 && dy == 0 ) 00133 return; 00134 00135 QwtPlot *plot = QwtPlotPanner::plot(); 00136 if ( plot == NULL ) 00137 return; 00138 00139 const bool doAutoReplot = plot->autoReplot(); 00140 plot->setAutoReplot(false); 00141 00142 for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) 00143 { 00144 if ( !d_data->isAxisEnabled[axis] ) 00145 continue; 00146 00147 const QwtScaleMap map = plot->canvasMap(axis); 00148 00149 const int i1 = map.transform(plot->axisScaleDiv(axis)->lBound()); 00150 const int i2 = map.transform(plot->axisScaleDiv(axis)->hBound()); 00151 00152 double d1, d2; 00153 if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) 00154 { 00155 d1 = map.invTransform(i1 - dx); 00156 d2 = map.invTransform(i2 - dx); 00157 } 00158 else 00159 { 00160 d1 = map.invTransform(i1 - dy); 00161 d2 = map.invTransform(i2 - dy); 00162 } 00163 00164 plot->setAxisScale(axis, d1, d2); 00165 } 00166 00167 plot->setAutoReplot(doAutoReplot); 00168 plot->replot(); 00169 }