30#include "moc_qgsgraduatedhistogramwidget.cpp"
33#include <qwt_global.h>
34#include <qwt_plot_canvas.h>
36#include <qwt_plot_curve.h>
37#include <qwt_plot_grid.h>
38#include <qwt_plot_marker.h>
39#include <qwt_plot_picker.h>
40#include <qwt_picker_machine.h>
41#include <qwt_plot_layout.h>
42#include <qwt_plot_renderer.h>
43#include <qwt_plot_histogram.h>
44#include <qwt_scale_map.h>
53 mFilter =
new QgsGraduatedHistogramEventFilter(
mPlot );
55 connect( mFilter, &QgsGraduatedHistogramEventFilter::mousePress,
this, &QgsGraduatedHistogramWidget::mousePress );
56 connect( mFilter, &QgsGraduatedHistogramEventFilter::mouseRelease,
this, &QgsGraduatedHistogramWidget::mouseRelease );
58 mHistoPicker =
new QwtPlotPicker(
mPlot->canvas() );
59 mHistoPicker->setTrackerMode( QwtPicker::ActiveOnly );
60 mHistoPicker->setRubberBand( QwtPicker::VLineRubberBand );
61 mHistoPicker->setStateMachine(
new QwtPickerDragPointMachine );
74 bool pickerEnabled =
false;
75 if ( mRenderer->rangesOverlap() )
77 setToolTip( tr(
"Ranges are overlapping and can't be edited by the histogram" ) );
80 else if ( mRenderer->rangesHaveGaps() )
82 setToolTip( tr(
"Ranges have gaps and can't be edited by the histogram" ) );
85 else if ( mRenderer->ranges().isEmpty() )
87 setToolTip( QString() );
92 setToolTip( QString() );
99 mHistoPicker->setEnabled( pickerEnabled );
100 mFilter->blockSignals( !pickerEnabled );
103void QgsGraduatedHistogramWidget::mousePress(
double value )
105 mPressedValue = value;
107 int closestRangeIndex = 0;
108 int minPixelDistance = 9999;
109 findClosestRange( mPressedValue, closestRangeIndex, minPixelDistance );
111 if ( minPixelDistance <= 6 )
119void QgsGraduatedHistogramWidget::mouseRelease(
double value )
121 int closestRangeIndex = 0;
122 int minPixelDistance = 9999;
123 findClosestRange( mPressedValue, closestRangeIndex, minPixelDistance );
125 if ( minPixelDistance <= 6 )
133 if ( value <= mRenderer->ranges().at( closestRangeIndex ).lowerValue() || value >= mRenderer->ranges().at( closestRangeIndex + 1 ).upperValue() )
139 mRenderer->updateRangeUpperValue( closestRangeIndex, value );
140 mRenderer->updateRangeLowerValue( closestRangeIndex + 1, value );
146 mRenderer->addBreak( value );
155void QgsGraduatedHistogramWidget::findClosestRange(
double value,
int &closestRangeIndex,
int &pixelDistance )
const
159 double minDistance = std::numeric_limits<double>::max();
160 const int pressedPixel =
mPlot->canvasMap( QwtPlot::xBottom ).transform( value );
161 for (
int i = 0; i < ranges.count() - 1; ++i )
163 if ( std::fabs( mPressedValue - ranges.at( i ).upperValue() ) < minDistance )
165 closestRangeIndex = i;
166 minDistance = std::fabs( mPressedValue - ranges.at( i ).upperValue() );
167 pixelDistance = std::fabs( pressedPixel -
mPlot->canvasMap( QwtPlot::xBottom ).transform( ranges.at( i ).upperValue() ) );
174QgsGraduatedHistogramEventFilter::QgsGraduatedHistogramEventFilter( QwtPlot *plot )
178 mPlot->canvas()->installEventFilter(
this );
181bool QgsGraduatedHistogramEventFilter::eventFilter( QObject *
object, QEvent *event )
183 if ( !mPlot->isEnabled() )
184 return QObject::eventFilter(
object, event );
186 switch ( event->type() )
188 case QEvent::MouseButtonPress:
190 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
191 if ( mouseEvent->button() == Qt::LeftButton )
193 emit mousePress( posToValue( mouseEvent->pos() ) );
197 case QEvent::MouseButtonRelease:
199 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
200 if ( mouseEvent->button() == Qt::LeftButton )
202 emit mouseRelease( posToValue( mouseEvent->pos() ) );
210 return QObject::eventFilter(
object, event );
213double QgsGraduatedHistogramEventFilter::posToValue( QPointF point )
const
218 return mPlot->canvasMap( QwtPlot::xBottom ).invTransform( point.x() );
A vector feature renderer which uses numeric attributes to classify features into different ranges.
QList< QgsRendererRange > QgsRangeList