#3291 Fix by differensiating between dynamic and default pickEventHandlers

This commit is contained in:
Jacob Støren 2018-08-30 13:22:28 +02:00
parent 67aa41eeae
commit bddaf9d602
9 changed files with 77 additions and 24 deletions

View File

@ -51,11 +51,21 @@ public:
//================================================================================================== //==================================================================================================
/// /// A static always-on pick handler used in the RiuViewerCommand
//================================================================================================== //==================================================================================================
class RicPickEventHandler class RicDefaultPickEventHandler
{ {
public: public:
virtual bool handlePickEvent(const Ric3DPickEvent& eventObject) = 0; virtual bool handlePickEvent(const Ric3DPickEvent& eventObject) = 0;
}; };
//==================================================================================================
/// A temporary, dynamic pick handler that overrides the default ones
//==================================================================================================
class RicPickEventHandler
{
public:
virtual bool handlePickEvent(const Ric3DPickEvent& eventObject) = 0;
virtual void notifyUnregistered() = 0;
};

View File

@ -24,7 +24,7 @@
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
class Ric3dWellLogCurvePickEventHandler : public RicPickEventHandler class Ric3dWellLogCurvePickEventHandler : public RicDefaultPickEventHandler
{ {
public: public:
static Ric3dWellLogCurvePickEventHandler* instance(); static Ric3dWellLogCurvePickEventHandler* instance();

View File

@ -45,6 +45,14 @@ RicCreateWellTargetsPickEventHandler::~RicCreateWellTargetsPickEventHandler()
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicCreateWellTargetsPickEventHandler::notifyUnregistered()
{
m_geometryToAddTargetsTo->enableTargetPointPicking(false);
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -37,5 +37,6 @@ protected:
caf::PdmPointer<RimWellPathGeometryDef> m_geometryToAddTargetsTo; caf::PdmPointer<RimWellPathGeometryDef> m_geometryToAddTargetsTo;
virtual bool handlePickEvent(const Ric3DPickEvent& eventObject) override; virtual bool handlePickEvent(const Ric3DPickEvent& eventObject) override;
virtual void notifyUnregistered() override;
}; };

View File

@ -23,7 +23,7 @@
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
class RicIntersectionPickEventHandler : public RicPickEventHandler class RicIntersectionPickEventHandler : public RicDefaultPickEventHandler
{ {
public: public:
static RicIntersectionPickEventHandler* instance(); static RicIntersectionPickEventHandler* instance();

View File

@ -25,7 +25,7 @@
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
class RicWellPathPickEventHandler : public RicPickEventHandler class RicWellPathPickEventHandler : public RicDefaultPickEventHandler
{ {
public: public:
static RicWellPathPickEventHandler* instance(); static RicWellPathPickEventHandler* instance();

View File

@ -79,7 +79,7 @@ RimWellPathGeometryDef::RimWellPathGeometryDef()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimWellPathGeometryDef::~RimWellPathGeometryDef() RimWellPathGeometryDef::~RimWellPathGeometryDef()
{ {
RiuViewerCommands::removePickEventHandler(m_pickTargetsEventHandler); RiuViewerCommands::removePickEventHandlerIfActive(m_pickTargetsEventHandler);
delete m_pickTargetsEventHandler; delete m_pickTargetsEventHandler;
@ -197,12 +197,12 @@ void RimWellPathGeometryDef::enableTargetPointPicking(bool isEnabling)
if (isEnabling) if (isEnabling)
{ {
m_pickPointsEnabled = true; m_pickPointsEnabled = true;
RiuViewerCommands::addPickEventHandler(m_pickTargetsEventHandler); RiuViewerCommands::setPickEventHandler(m_pickTargetsEventHandler);
updateConnectedEditors(); updateConnectedEditors();
} }
else else
{ {
RiuViewerCommands::removePickEventHandler(m_pickTargetsEventHandler); RiuViewerCommands::removePickEventHandlerIfActive(m_pickTargetsEventHandler);
m_pickPointsEnabled = false; m_pickPointsEnabled = false;
updateConnectedEditors(); updateConnectedEditors();
} }

View File

@ -107,8 +107,9 @@
// RiaViewerCommands // RiaViewerCommands
// //
//================================================================================================== //==================================================================================================
RicPickEventHandler* RiuViewerCommands::sm_overridingPickHandler = nullptr;
std::vector<RicPickEventHandler*> RiuViewerCommands::sm_pickEventHandlers; std::vector<RicDefaultPickEventHandler*> RiuViewerCommands::sm_defaultPickEventHandlers;
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
@ -121,11 +122,11 @@ RiuViewerCommands::RiuViewerCommands(RiuViewer* ownerViewer)
, m_currentPickPositionInDomainCoords(cvf::Vec3d::UNDEFINED) , m_currentPickPositionInDomainCoords(cvf::Vec3d::UNDEFINED)
, m_viewer(ownerViewer) , m_viewer(ownerViewer)
{ {
if ( sm_pickEventHandlers.empty() ) if ( sm_defaultPickEventHandlers.empty() )
{ {
addPickEventHandler(RicIntersectionPickEventHandler::instance()); addDefaultPickEventHandler(RicIntersectionPickEventHandler::instance());
addPickEventHandler(Ric3dWellLogCurvePickEventHandler::instance()); addDefaultPickEventHandler(Ric3dWellLogCurvePickEventHandler::instance());
addPickEventHandler(RicWellPathPickEventHandler::instance()); addDefaultPickEventHandler(RicWellPathPickEventHandler::instance());
} }
} }
@ -530,9 +531,14 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
Ric3DPickEvent viewerEventObject(pickItemInfos, Ric3DPickEvent viewerEventObject(pickItemInfos,
m_reservoirView); m_reservoirView);
for ( size_t i = 0; i < sm_pickEventHandlers.size(); i++ ) if (sm_overridingPickHandler && sm_overridingPickHandler->handlePickEvent(viewerEventObject))
{ {
if ( sm_pickEventHandlers[i]->handlePickEvent(viewerEventObject) ) return;
}
for ( size_t i = 0; i < sm_defaultPickEventHandlers.size(); i++ )
{
if ( sm_defaultPickEventHandlers[i]->handlePickEvent(viewerEventObject) )
{ {
return; return;
} }
@ -877,6 +883,28 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuViewerCommands::setPickEventHandler(RicPickEventHandler* pickEventHandler)
{
if (sm_overridingPickHandler) sm_overridingPickHandler->notifyUnregistered();
sm_overridingPickHandler = pickEventHandler;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuViewerCommands::removePickEventHandlerIfActive(RicPickEventHandler* pickEventHandler)
{
if (sm_overridingPickHandler == pickEventHandler)
{
sm_overridingPickHandler = nullptr;
if (pickEventHandler) pickEventHandler->notifyUnregistered();
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -888,25 +916,25 @@ cvf::Vec3d RiuViewerCommands::lastPickPositionInDomainCoords() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiuViewerCommands::addPickEventHandler(RicPickEventHandler* pickEventHandler) void RiuViewerCommands::addDefaultPickEventHandler(RicDefaultPickEventHandler* pickEventHandler)
{ {
removePickEventHandler(pickEventHandler); removeDefaultPickEventHandler(pickEventHandler);
if (pickEventHandler) if (pickEventHandler)
{ {
sm_pickEventHandlers.push_back(pickEventHandler); sm_defaultPickEventHandlers.push_back(pickEventHandler);
} }
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiuViewerCommands::removePickEventHandler(RicPickEventHandler* pickEventHandler) void RiuViewerCommands::removeDefaultPickEventHandler(RicDefaultPickEventHandler* pickEventHandler)
{ {
for ( auto it = sm_pickEventHandlers.begin(); it != sm_pickEventHandlers.end(); ++it ) for ( auto it = sm_defaultPickEventHandlers.begin(); it != sm_defaultPickEventHandlers.end(); ++it )
{ {
if ( *it == pickEventHandler ) if ( *it == pickEventHandler )
{ {
sm_pickEventHandlers.erase(it); sm_defaultPickEventHandlers.erase(it);
break; break;
} }
} }

View File

@ -25,6 +25,7 @@
#include <QObject> #include <QObject>
#include <QPointer> #include <QPointer>
class RicDefaultPickEventHandler;
class RicPickEventHandler; class RicPickEventHandler;
class RimEclipseView; class RimEclipseView;
class RimGeoMechView; class RimGeoMechView;
@ -59,8 +60,8 @@ public:
void displayContextMenu(QMouseEvent* event); void displayContextMenu(QMouseEvent* event);
void handlePickAction(int winPosX, int winPosY, Qt::KeyboardModifiers keyboardModifiers); void handlePickAction(int winPosX, int winPosY, Qt::KeyboardModifiers keyboardModifiers);
static void addPickEventHandler(RicPickEventHandler* pickEventHandler); static void setPickEventHandler(RicPickEventHandler* pickEventHandler);
static void removePickEventHandler(RicPickEventHandler* pickEventHandler); static void removePickEventHandlerIfActive(RicPickEventHandler* pickEventHandler);
cvf::Vec3d lastPickPositionInDomainCoords() const; cvf::Vec3d lastPickPositionInDomainCoords() const;
private: private:
@ -75,6 +76,9 @@ private:
bool handleOverlayItemPicking(int winPosX, int winPosY); bool handleOverlayItemPicking(int winPosX, int winPosY);
static void addDefaultPickEventHandler(RicDefaultPickEventHandler* pickEventHandler);
static void removeDefaultPickEventHandler(RicDefaultPickEventHandler* pickEventHandler);
private: private:
size_t m_currentGridIdx; size_t m_currentGridIdx;
size_t m_currentCellIndex; size_t m_currentCellIndex;
@ -82,5 +86,7 @@ private:
cvf::Vec3d m_currentPickPositionInDomainCoords; cvf::Vec3d m_currentPickPositionInDomainCoords;
caf::PdmPointer<Rim3dView> m_reservoirView; caf::PdmPointer<Rim3dView> m_reservoirView;
QPointer<RiuViewer> m_viewer; QPointer<RiuViewer> m_viewer;
static std::vector<RicPickEventHandler*> sm_pickEventHandlers;
static RicPickEventHandler* sm_overridingPickHandler;
static std::vector<RicDefaultPickEventHandler*> sm_defaultPickEventHandlers;
}; };