mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
(#412) Improved scroll wheel zooming (zoom around mouse Y position)
Moved scroll wheel handling to well log trace plot viewer, using event filter for the plot canvas to get the mouse Y position, which is transformed to the corresponding plot depth value and used as center for zooming.
This commit is contained in:
parent
8d57bbe77b
commit
752c4071b9
@ -151,13 +151,10 @@ RiuWellLogPlot* RimWellLogPlot::viewer()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimWellLogPlot::zoomDepth(double zoomFactor)
|
||||
void RimWellLogPlot::zoomDepth(double zoomFactor, double zoomCenter)
|
||||
{
|
||||
double center = (m_maximumVisibleDepth + m_minimumVisibleDepth)/2;
|
||||
double newHalfDepth = zoomFactor*(m_maximumVisibleDepth - m_minimumVisibleDepth)/2;
|
||||
|
||||
double newMinimum = center - newHalfDepth;
|
||||
double newMaximum = center + newHalfDepth;
|
||||
double newMinimum = zoomCenter - (zoomCenter - m_minimumVisibleDepth)*zoomFactor;
|
||||
double newMaximum = zoomCenter + (m_maximumVisibleDepth - zoomCenter)*zoomFactor;
|
||||
|
||||
setVisibleDepthRange(newMinimum, newMaximum);
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
|
||||
RiuWellLogPlot* viewer();
|
||||
|
||||
void zoomDepth(double zoomFactor);
|
||||
void zoomDepth(double zoomFactor, double zoomCenter);
|
||||
void panDepth(double panFactor);
|
||||
void setVisibleDepthRange(double minimumDepth, double maximumDepth);
|
||||
|
||||
|
@ -171,7 +171,7 @@ void RimWellLogPlotTrace::recreateViewer()
|
||||
{
|
||||
CVF_ASSERT(m_viewer == NULL);
|
||||
|
||||
m_viewer = new RiuWellLogTracePlot;
|
||||
m_viewer = new RiuWellLogTracePlot(this);
|
||||
for (size_t cIdx = 0; cIdx < curves.size(); ++cIdx)
|
||||
{
|
||||
curves[cIdx]->setPlot(this->m_viewer);
|
||||
|
@ -27,14 +27,10 @@
|
||||
#include "cvfAssert.h"
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <QWheelEvent>
|
||||
#include <QScrollBar>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#define RIU_SCROLLWHEEL_ZOOMFACTOR 1.1
|
||||
#define RIU_SCROLLWHEEL_PANFACTOR 0.1
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -68,11 +64,9 @@ RiuWellLogPlot::~RiuWellLogPlot()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuWellLogPlot::insertTracePlot(RiuWellLogTracePlot* tracePlot)
|
||||
{
|
||||
|
||||
// Insert the plot to the left of the scroll bar
|
||||
m_layout->insertWidget(m_layout->count() - 1, tracePlot);
|
||||
m_tracePlots.append(tracePlot);
|
||||
|
||||
m_tracePlots.append(tracePlot);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -88,7 +82,6 @@ void RiuWellLogPlot::setDepthRange(double minDepth, double maxDepth)
|
||||
updateScrollBar(minDepth, maxDepth);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -108,36 +101,6 @@ void RiuWellLogPlot::updateScrollBar(double minDepth, double maxDepth)
|
||||
m_scrollBar->setVisible(true);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuWellLogPlot::wheelEvent(QWheelEvent* event)
|
||||
{
|
||||
if (!m_plotDefinition)
|
||||
{
|
||||
QWidget::wheelEvent(event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event->modifiers() & Qt::ControlModifier)
|
||||
{
|
||||
if (event->delta() > 0)
|
||||
{
|
||||
m_plotDefinition->zoomDepth(RIU_SCROLLWHEEL_ZOOMFACTOR);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_plotDefinition->zoomDepth(1.0/RIU_SCROLLWHEEL_ZOOMFACTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_plotDefinition->panDepth(event->delta() < 0 ? RIU_SCROLLWHEEL_PANFACTOR : -RIU_SCROLLWHEEL_PANFACTOR);
|
||||
}
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -26,7 +26,6 @@ class RimWellLogPlot;
|
||||
class RiuWellLogTracePlot;
|
||||
|
||||
class QHBoxLayout;
|
||||
class QWheelEvent;
|
||||
class QScrollBar;
|
||||
|
||||
//==================================================================================================
|
||||
@ -46,9 +45,6 @@ public:
|
||||
|
||||
void setDepthRange(double minDepth, double maxDepth);
|
||||
|
||||
protected:
|
||||
void wheelEvent(QWheelEvent* event);
|
||||
|
||||
private:
|
||||
void updateScrollBar(double minDepth, double maxDepth);
|
||||
|
||||
|
@ -19,17 +19,28 @@
|
||||
|
||||
#include "RiuWellLogTracePlot.h"
|
||||
|
||||
#include "RimWellLogPlot.h"
|
||||
#include "RimWellLogPlotTrace.h"
|
||||
|
||||
#include "qwt_plot_grid.h"
|
||||
#include "qwt_legend.h"
|
||||
#include "qwt_scale_engine.h"
|
||||
#include "qwt_plot_layout.h"
|
||||
|
||||
#include <QWheelEvent>
|
||||
|
||||
#define RIU_SCROLLWHEEL_ZOOMFACTOR 1.1
|
||||
#define RIU_SCROLLWHEEL_PANFACTOR 0.1
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RiuWellLogTracePlot::RiuWellLogTracePlot(QWidget* parent)
|
||||
RiuWellLogTracePlot::RiuWellLogTracePlot(RimWellLogPlotTrace* plotTraceDefinition, QWidget* parent)
|
||||
: QwtPlot(parent)
|
||||
{
|
||||
Q_ASSERT(plotTraceDefinition);
|
||||
m_plotTraceDefinition = plotTraceDefinition;
|
||||
|
||||
m_grid = new QwtPlotGrid();
|
||||
m_grid->attach(this);
|
||||
|
||||
@ -66,6 +77,9 @@ void RiuWellLogTracePlot::setDefaults()
|
||||
canvasFrame->setFrameShape(QFrame::NoFrame);
|
||||
}
|
||||
|
||||
canvas()->setMouseTracking(true);
|
||||
canvas()->installEventFilter(this);
|
||||
|
||||
QPen gridPen(Qt::SolidLine);
|
||||
gridPen.setColor(Qt::lightGray);
|
||||
m_grid->setPen(gridPen);
|
||||
@ -97,3 +111,52 @@ void RiuWellLogTracePlot::setDepthRange(double minDepth, double maxDepth)
|
||||
setAxisScale(QwtPlot::yLeft, maxDepth, minDepth);
|
||||
replot();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RiuWellLogTracePlot::eventFilter(QObject* watched, QEvent* event)
|
||||
{
|
||||
if (watched == canvas())
|
||||
{
|
||||
QWheelEvent* wheelEvent = dynamic_cast<QWheelEvent*>(event);
|
||||
if (wheelEvent)
|
||||
{
|
||||
if (!m_plotTraceDefinition)
|
||||
{
|
||||
return QwtPlot::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
RimWellLogPlot* plotDefinition;
|
||||
m_plotTraceDefinition->firstAnchestorOrThisOfType(plotDefinition);
|
||||
if (!plotDefinition)
|
||||
{
|
||||
return QwtPlot::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
if (wheelEvent->modifiers() & Qt::ControlModifier)
|
||||
{
|
||||
QwtScaleMap scaleMap = canvasMap(QwtPlot::yLeft);
|
||||
double zoomCenter = scaleMap.invTransform(wheelEvent->pos().y());
|
||||
|
||||
if (wheelEvent->delta() > 0)
|
||||
{
|
||||
plotDefinition->zoomDepth(RIU_SCROLLWHEEL_ZOOMFACTOR, zoomCenter);
|
||||
}
|
||||
else
|
||||
{
|
||||
plotDefinition->zoomDepth(1.0/RIU_SCROLLWHEEL_ZOOMFACTOR, zoomCenter);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
plotDefinition->panDepth(wheelEvent->delta() < 0 ? RIU_SCROLLWHEEL_PANFACTOR : -RIU_SCROLLWHEEL_PANFACTOR);
|
||||
}
|
||||
|
||||
event->accept();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return QwtPlot::eventFilter(watched, event);
|
||||
}
|
||||
|
@ -21,9 +21,12 @@
|
||||
|
||||
#include "qwt_plot.h"
|
||||
|
||||
class RimWellLogPlotTrace;
|
||||
class QwtPlotGrid;
|
||||
class QwtLegend;
|
||||
|
||||
class QEvent;
|
||||
|
||||
//==================================================================================================
|
||||
//
|
||||
// RiuWellLogTracePlot
|
||||
@ -34,16 +37,20 @@ class RiuWellLogTracePlot : public QwtPlot
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
RiuWellLogTracePlot(QWidget* parent = NULL);
|
||||
RiuWellLogTracePlot(RimWellLogPlotTrace* plotTraceDefinition, QWidget* parent = NULL);
|
||||
virtual ~RiuWellLogTracePlot();
|
||||
|
||||
void setDepthRange(double minDepth, double maxDepth);
|
||||
|
||||
protected:
|
||||
virtual bool eventFilter(QObject* watched, QEvent* event);
|
||||
|
||||
private:
|
||||
void setDefaults();
|
||||
|
||||
private:
|
||||
QwtPlotGrid* m_grid;
|
||||
QwtLegend* m_legend;
|
||||
RimWellLogPlotTrace* m_plotTraceDefinition;
|
||||
QwtPlotGrid* m_grid;
|
||||
QwtLegend* m_legend;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user