mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-09 23:16:00 -06:00
(#674) Clicking on items in 3D view selects corresponding item in tree view/property panel
Clicking on 3D Info box and legends for cell result, separate fault result and cell edge selects corresponding items in tree view
This commit is contained in:
parent
e65facd590
commit
a2bfc12c57
@ -870,3 +870,11 @@ bool RimView::showActiveCellsOnly()
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimView::selectOverlayInfoConfig()
|
||||
{
|
||||
RiuMainWindow::instance()->setCurrentObjectInTreeView(m_overlayInfoConfig);
|
||||
}
|
||||
|
||||
|
@ -147,6 +147,8 @@ public:
|
||||
virtual bool showActiveCellsOnly();
|
||||
virtual void axisLabels(cvf::String* xLabel, cvf::String* yLabel, cvf::String* zLabel) = 0;
|
||||
|
||||
void selectOverlayInfoConfig();
|
||||
|
||||
public:
|
||||
virtual void loadDataAndUpdate() = 0;
|
||||
virtual RimCase* ownerCase() = 0;
|
||||
@ -210,7 +212,6 @@ protected:
|
||||
|
||||
private:
|
||||
RimViewLinker* viewLinkerIfMasterView() const;
|
||||
|
||||
private:
|
||||
bool m_previousGridModeMeshLinesWasFaults;
|
||||
caf::PdmField<bool> m_disableLighting;
|
||||
|
@ -115,10 +115,10 @@ RiuViewer::RiuViewer(const QGLFormat& format, QWidget* parent)
|
||||
p.setColor(QPalette::Dark, progressAndHistogramColor);
|
||||
|
||||
// Info Text
|
||||
m_InfoLabel = new QLabel();
|
||||
m_InfoLabel->setPalette(p);
|
||||
m_InfoLabel->setFrameShape(QFrame::Box);
|
||||
m_InfoLabel->setMinimumWidth(275);
|
||||
m_infoLabel = new QLabel();
|
||||
m_infoLabel->setPalette(p);
|
||||
m_infoLabel->setFrameShape(QFrame::Box);
|
||||
m_infoLabel->setMinimumWidth(275);
|
||||
m_showInfoText = true;
|
||||
|
||||
// Version info label
|
||||
@ -152,10 +152,10 @@ RiuViewer::RiuViewer(const QGLFormat& format, QWidget* parent)
|
||||
|
||||
if (RiaApplication::instance()->isRunningRegressionTests())
|
||||
{
|
||||
QFont regTestFont = m_InfoLabel->font();
|
||||
QFont regTestFont = m_infoLabel->font();
|
||||
regTestFont.setPixelSize(11);
|
||||
|
||||
m_InfoLabel->setFont(regTestFont);
|
||||
m_infoLabel->setFont(regTestFont);
|
||||
m_versionInfoLabel->setFont(regTestFont);
|
||||
m_animationProgress->setFont(regTestFont);
|
||||
m_histogramWidget->setFont(regTestFont);
|
||||
@ -183,7 +183,7 @@ RiuViewer::~RiuViewer()
|
||||
|
||||
m_rimView->cameraPosition = m_mainCamera->viewMatrix();
|
||||
}
|
||||
delete m_InfoLabel;
|
||||
delete m_infoLabel;
|
||||
delete m_animationProgress;
|
||||
delete m_histogramWidget;
|
||||
delete m_progressBarStyle;
|
||||
@ -228,6 +228,16 @@ void RiuViewer::mouseReleaseEvent(QMouseEvent* event)
|
||||
|
||||
if (event->button() == Qt::LeftButton)
|
||||
{
|
||||
if (!m_infoLabelOverlayArea.isNull())
|
||||
{
|
||||
if (m_infoLabelOverlayArea.contains(event->x(), event->y()))
|
||||
{
|
||||
m_rimView->selectOverlayInfoConfig();
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m_viewerCommands->handlePickAction(event->x(), event->y(), event->modifiers());
|
||||
return;
|
||||
}
|
||||
@ -336,7 +346,7 @@ void RiuViewer::paintOverlayItems(QPainter* painter)
|
||||
if (isAnimationActive() && frameCount() > 1) showAnimBar = true;
|
||||
|
||||
//if (showAnimBar) columnWidth = CVF_MAX(columnWidth, m_animationProgress->width());
|
||||
if (m_showInfoText) columnWidth = CVF_MAX(columnWidth, m_InfoLabel->sizeHint().width());
|
||||
if (m_showInfoText) columnWidth = CVF_MAX(columnWidth, m_infoLabel->sizeHint().width());
|
||||
|
||||
int columnPos = this->width() - columnWidth - margin;
|
||||
|
||||
@ -356,9 +366,19 @@ void RiuViewer::paintOverlayItems(QPainter* painter)
|
||||
|
||||
if (m_showInfoText)
|
||||
{
|
||||
m_InfoLabel->resize(columnWidth, m_InfoLabel->sizeHint().height());
|
||||
m_InfoLabel->render(painter, QPoint(columnPos, yPos));
|
||||
yPos += m_InfoLabel->height() + margin;
|
||||
QPoint topLeft = QPoint(columnPos, yPos);
|
||||
m_infoLabel->resize(columnWidth, m_infoLabel->sizeHint().height());
|
||||
m_infoLabel->render(painter, topLeft);
|
||||
|
||||
m_infoLabelOverlayArea.setTopLeft(topLeft);
|
||||
m_infoLabelOverlayArea.setBottom(yPos + m_infoLabel->height());
|
||||
m_infoLabelOverlayArea.setRight(columnPos + columnWidth);
|
||||
|
||||
yPos += m_infoLabel->height() + margin;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_infoLabelOverlayArea = QRect();
|
||||
}
|
||||
|
||||
if (m_showHistogram)
|
||||
@ -383,7 +403,7 @@ void RiuViewer::paintOverlayItems(QPainter* painter)
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuViewer::setInfoText(QString text)
|
||||
{
|
||||
m_InfoLabel->setText(text);
|
||||
m_infoLabel->setText(text);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -110,7 +110,9 @@ private:
|
||||
void mousePressEvent(QMouseEvent* event);
|
||||
|
||||
private:
|
||||
QLabel* m_InfoLabel;
|
||||
QLabel* m_infoLabel;
|
||||
QRect m_infoLabelOverlayArea;
|
||||
|
||||
QLabel* m_versionInfoLabel;
|
||||
bool m_showInfoText;
|
||||
|
||||
|
@ -30,17 +30,20 @@
|
||||
#include "RigFemPartGrid.h"
|
||||
#include "RigGeoMechCaseData.h"
|
||||
|
||||
#include "RimCellEdgeColors.h"
|
||||
#include "RimContextCommandBuilder.h"
|
||||
#include "RimCrossSection.h"
|
||||
#include "RimDefines.h"
|
||||
#include "RimEclipseCase.h"
|
||||
#include "RimEclipseCellColors.h"
|
||||
#include "RimEclipseFaultColors.h"
|
||||
#include "RimEclipseView.h"
|
||||
#include "RimEclipseWell.h"
|
||||
#include "RimFaultCollection.h"
|
||||
#include "RimGeoMechCase.h"
|
||||
#include "RimGeoMechCellColors.h"
|
||||
#include "RimGeoMechView.h"
|
||||
#include "RimTernaryLegendConfig.h"
|
||||
#include "RimViewController.h"
|
||||
#include "RimWellPath.h"
|
||||
|
||||
@ -53,6 +56,7 @@
|
||||
#include "RivFemPartGeometryGenerator.h"
|
||||
#include "RivFemPickSourceInfo.h"
|
||||
#include "RivSourceInfo.h"
|
||||
#include "RivTernarySaturationOverlayItem.h"
|
||||
#include "RivWellPathSourceInfo.h"
|
||||
#include "RivWellPipeSourceInfo.h"
|
||||
|
||||
@ -63,6 +67,8 @@
|
||||
|
||||
#include "cvfDrawableGeo.h"
|
||||
#include "cvfHitItemCollection.h"
|
||||
#include "cvfOverlayAxisCross.h"
|
||||
#include "cvfOverlayScalarMapperLegend.h"
|
||||
#include "cvfPart.h"
|
||||
|
||||
#include "WellPathCommands/RicWellPathViewerEventHandler.h"
|
||||
@ -419,6 +425,11 @@ void RiuViewerCommands::slotHideIntersection()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardModifiers keyboardModifiers)
|
||||
{
|
||||
if (handleOverlayItemPicking(winPosX, winPosY))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
size_t gridIndex = cvf::UNDEFINED_SIZE_T;
|
||||
size_t cellIndex = cvf::UNDEFINED_SIZE_T;
|
||||
size_t nncIndex = cvf::UNDEFINED_SIZE_T;
|
||||
@ -434,7 +445,6 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
|
||||
uint nncPartTriangleIndex = cvf::UNDEFINED_UINT;
|
||||
|
||||
cvf::HitItemCollection hitItems;
|
||||
|
||||
if (m_viewer->rayPick(winPosX, winPosY, &hitItems))
|
||||
{
|
||||
extractIntersectionData(hitItems, &localIntersectionPoint, &firstHitPart, &firstPartTriangleIndex, &firstNncHitPart, &nncPartTriangleIndex);
|
||||
@ -715,3 +725,52 @@ void RiuViewerCommands::updateSelectionFromPickedPart(cvf::Part* part)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RiuViewerCommands::handleOverlayItemPicking(int winPosX, int winPosY)
|
||||
{
|
||||
cvf::OverlayItem* pickedOverlayItem = m_viewer->overlayItem(winPosX, winPosY);
|
||||
if (pickedOverlayItem)
|
||||
{
|
||||
caf::PdmObject* objToSelect = NULL;
|
||||
|
||||
RimEclipseView* eclipseView = dynamic_cast<RimEclipseView*>(m_reservoirView.p());
|
||||
if (eclipseView)
|
||||
{
|
||||
if (eclipseView->cellResult()->legendConfig()->legend() == pickedOverlayItem
|
||||
|| eclipseView->cellResult()->ternaryLegendConfig->legend() == pickedOverlayItem)
|
||||
{
|
||||
objToSelect = eclipseView->cellResult();
|
||||
}
|
||||
else if (eclipseView->faultResultSettings()->customFaultResult()->legendConfig()->legend() == pickedOverlayItem
|
||||
|| eclipseView->faultResultSettings()->customFaultResult()->ternaryLegendConfig()->legend() == pickedOverlayItem)
|
||||
{
|
||||
objToSelect = eclipseView->faultResultSettings();
|
||||
}
|
||||
else if (eclipseView->cellEdgeResult()->legendConfig()->legend() == pickedOverlayItem)
|
||||
{
|
||||
objToSelect = eclipseView->cellEdgeResult();
|
||||
}
|
||||
}
|
||||
|
||||
RimGeoMechView* geomView = dynamic_cast<RimGeoMechView*>(m_reservoirView.p());
|
||||
if (geomView)
|
||||
{
|
||||
if (geomView->cellResult()->legendConfig()->legend() == pickedOverlayItem)
|
||||
{
|
||||
objToSelect = geomView->cellResult();
|
||||
}
|
||||
}
|
||||
|
||||
if (objToSelect)
|
||||
{
|
||||
RiuMainWindow::instance()->setCurrentObjectInTreeView(objToSelect);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -70,6 +70,8 @@ private:
|
||||
void extractIntersectionData(const cvf::HitItemCollection& hitItems, cvf::Vec3d* localIntersectionPoint, cvf::Part** firstPart, uint* firstPartFaceHit, cvf::Part** nncPart, uint* nncPartFaceHit);
|
||||
void updateSelectionFromPickedPart(cvf::Part* part);
|
||||
|
||||
bool handleOverlayItemPicking(int winPosX, int winPosY);
|
||||
|
||||
size_t m_currentGridIdx;
|
||||
size_t m_currentCellIndex;
|
||||
cvf::StructGridInterface::FaceType m_currentFaceIndex;
|
||||
|
@ -908,3 +908,16 @@ void caf::Viewer::appendAllStaticModelsToFrame(cvf::Scene* scene)
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
cvf::OverlayItem* caf::Viewer::overlayItem(int winPosX, int winPosY)
|
||||
{
|
||||
if (m_mainRendering.isNull()) return NULL;
|
||||
|
||||
int translatedMousePosX = winPosX;
|
||||
int translatedMousePosY = height() - winPosY;
|
||||
|
||||
return m_mainRendering->overlayItemFromWindowCoordinates(translatedMousePosX, translatedMousePosY);
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,7 @@ namespace cvf {
|
||||
class Rendering;
|
||||
class Scene;
|
||||
class TextureImage;
|
||||
class OverlayItem;
|
||||
}
|
||||
|
||||
namespace caf {
|
||||
@ -123,6 +124,7 @@ public:
|
||||
bool canRender() const;
|
||||
|
||||
bool rayPick(int winPosX, int winPosY, cvf::HitItemCollection* pickedPoints) ;
|
||||
cvf::OverlayItem* overlayItem(int winPosX, int winPosY);
|
||||
|
||||
// QPainter based drawing on top of the OpenGL graphics
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user