diff --git a/ApplicationLibCode/Application/RiaPlotDefines.cpp b/ApplicationLibCode/Application/RiaPlotDefines.cpp index 5405da79f5..714a137481 100644 --- a/ApplicationLibCode/Application/RiaPlotDefines.cpp +++ b/ApplicationLibCode/Application/RiaPlotDefines.cpp @@ -76,6 +76,15 @@ void caf::AppEnum::setUp() setDefault( RiaDefines::Orientation::VERTICAL ); } +template <> +void caf::AppEnum::setUp() +{ + addItem( RiaDefines::TextAlignment::LEFT, "LEFT", "Left" ); + addItem( RiaDefines::TextAlignment::CENTER, "CENTER", "Center" ); + addItem( RiaDefines::TextAlignment::RIGHT, "RIGHT", "Right" ); + setDefault( RiaDefines::TextAlignment::RIGHT ); +} + template <> void caf::AppEnum::setUp() { diff --git a/ApplicationLibCode/Application/RiaPlotDefines.h b/ApplicationLibCode/Application/RiaPlotDefines.h index 0ecaeeb8bc..1c2fab4be0 100644 --- a/ApplicationLibCode/Application/RiaPlotDefines.h +++ b/ApplicationLibCode/Application/RiaPlotDefines.h @@ -81,6 +81,13 @@ enum class WindowTileMode UNDEFINED, }; +enum class TextAlignment +{ + LEFT, + RIGHT, + CENTER +}; + // Defines relate to curve and plot template names QString namingVariableCase(); QString namingVariableWell(); diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake index 0d76deebce..c53dc65bb2 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake @@ -13,6 +13,10 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotationInView.h ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationGroupCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -30,6 +34,10 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotationInView.cpp ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationGroupCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp index 79379e0164..6fcadc7d41 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp @@ -66,7 +66,7 @@ RimAnnotationLineAppearance::RimAnnotationLineAppearance() CAF_PDM_InitObject( "AnnotationLineAppearance", ":/WellCollection.png" ); CAF_PDM_InitField( &m_lineFieldsHidden, "LineFieldsHidden", false, "Line Fields Hidden" ); - CAF_PDM_InitField( &m_color, "Color", cvf::Color3f( cvf::Color3f::BLACK ), "Line Color" ); + CAF_PDM_InitField( &m_color, "Color", cvf::Color3f( cvf::Color3f::DARK_GRAY ), "Line Color" ); CAF_PDM_InitField( &m_thickness, "Thickness", 2, "Line Thickness" ); // Stippling not yet supported. Needs new stuff in VizFwk @@ -85,6 +85,20 @@ void RimAnnotationLineAppearance::setLineFieldsHidden( bool hidden ) m_lineFieldsHidden = hidden; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimAnnotationLineAppearance::configureForSummaryAnnotations() +{ + m_style.uiCapability()->setUiHidden( false ); + m_style.xmlCapability()->setIOReadable( true ); + m_style.xmlCapability()->setIOWritable( true ); + + m_thickness.uiCapability()->setUiHidden( true ); + + m_style = STYLE_DASH; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h index 172f3d3e5a..44b297d240 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h @@ -48,6 +48,7 @@ public: RimAnnotationLineAppearance(); void setLineFieldsHidden( bool hidden ); + void configureForSummaryAnnotations(); void setColor( const cvf::Color3f& newColor ); cvf::Color3f color() const; diff --git a/ApplicationLibCode/ProjectDataModel/RimEquilibriumAxisAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimEquilibriumAxisAnnotation.cpp rename to ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimEquilibriumAxisAnnotation.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimEquilibriumAxisAnnotation.h rename to ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.h diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimPlotAxisAnnotation.cpp similarity index 86% rename from ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp rename to ApplicationLibCode/ProjectDataModel/Annotations/RimPlotAxisAnnotation.cpp index 331ffdc547..66d40b985d 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimPlotAxisAnnotation.cpp @@ -26,6 +26,10 @@ #include "RimTools.h" #include "RimViewWindow.h" +#include "RiaColorTools.h" + +#include "cafPdmFieldCvfColor.h" + #include CAF_PDM_SOURCE_INIT( RimPlotAxisAnnotation, "RimPlotAxisAnnotation" ); @@ -49,16 +53,12 @@ RimPlotAxisAnnotation::RimPlotAxisAnnotation() caf::AppEnum defaultStyle = Qt::PenStyle::SolidLine; CAF_PDM_InitField( &m_penStyle, "PenStyle", defaultStyle, "Pen Style" ); -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimPlotAxisAnnotation* RimPlotAxisAnnotation::createLineAnnotation() -{ - auto annotation = new RimPlotAxisAnnotation(); - annotation->setAnnotationType( RimPlotAxisAnnotation::AnnotationType::LINE ); - return annotation; + CAF_PDM_InitFieldNoDefault( &m_textAlignment, "TextAlignment", "Text Alignment" ); + m_textAlignment = RiaDefines::TextAlignment::RIGHT; + + CAF_PDM_InitFieldNoDefault( &m_color, "Color", "Color" ); + m_color = cvf::Color3f( cvf::Color3f::BLACK ); } //-------------------------------------------------------------------------------------------------- @@ -125,6 +125,14 @@ QColor RimPlotAxisAnnotation::color() const return QColor( 0, 0, 100 ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotAxisAnnotation::setAlignment( RiaDefines::TextAlignment alignment ) +{ + m_textAlignment = alignment; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -141,6 +149,22 @@ Qt::PenStyle RimPlotAxisAnnotation::penStyle() const return m_penStyle(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotAxisAnnotation::setColor( const cvf::Color3f& color ) +{ + m_color = color; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::TextAlignment RimPlotAxisAnnotation::textAlignment() const +{ + return m_textAlignment(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimPlotAxisAnnotation.h similarity index 60% rename from ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h rename to ApplicationLibCode/ProjectDataModel/Annotations/RimPlotAxisAnnotation.h index 9a1613687f..51fc1163e0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimPlotAxisAnnotation.h @@ -18,10 +18,14 @@ #pragma once +#include "RiaPlotDefines.h" + #include "cafPdmField.h" #include "cafPdmObject.h" #include "cafPdmPtrField.h" +#include "cvfColor3.h" + #include //================================================================================================== @@ -40,21 +44,27 @@ public: }; RimPlotAxisAnnotation(); - static RimPlotAxisAnnotation* createLineAnnotation(); + void setName( const QString& name ); + QString name() const; - void setName( const QString& name ); - void setValue( double value ); + void setValue( double value ); + virtual double value() const; - AnnotationType annotationType() const; - virtual QString name() const; - virtual double value() const; - virtual double rangeStart() const; - virtual double rangeEnd() const; - virtual QColor color() const; + AnnotationType annotationType() const; + void setAnnotationType( AnnotationType annotationType ); void setPenStyle( Qt::PenStyle penStyle ); Qt::PenStyle penStyle() const; + void setColor( const cvf::Color3f& color ); + virtual QColor color() const; + + void setAlignment( RiaDefines::TextAlignment alignment ); + RiaDefines::TextAlignment textAlignment() const; + + double rangeStart() const; + double rangeEnd() const; + caf::PdmFieldHandle* userDescriptionField() override; caf::PdmFieldHandle* objectToggleField() override; @@ -64,16 +74,14 @@ protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; protected: - caf::PdmField m_isActive; - caf::PdmField m_name; - caf::PdmField m_value; - caf::PdmField m_rangeStart; - caf::PdmField m_rangeEnd; - caf::PdmField> m_penStyle; + caf::PdmField m_isActive; + caf::PdmField m_name; + caf::PdmField m_value; + caf::PdmField m_rangeStart; + caf::PdmField m_rangeEnd; + caf::PdmField> m_penStyle; + caf::PdmField> m_textAlignment; + caf::PdmField m_color; -protected: - void setAnnotationType( AnnotationType annotationType ); - -private: AnnotationType m_annotationType; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotRectAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimPlotRectAnnotation.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimPlotRectAnnotation.cpp rename to ApplicationLibCode/ProjectDataModel/Annotations/RimPlotRectAnnotation.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotRectAnnotation.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimPlotRectAnnotation.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimPlotRectAnnotation.h rename to ApplicationLibCode/ProjectDataModel/Annotations/RimPlotRectAnnotation.h diff --git a/ApplicationLibCode/ProjectDataModel/RimTimeAxisAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp similarity index 79% rename from ApplicationLibCode/ProjectDataModel/RimTimeAxisAnnotation.cpp rename to ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp index 945aa337c2..e0c4382b08 100644 --- a/ApplicationLibCode/ProjectDataModel/RimTimeAxisAnnotation.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp @@ -42,26 +42,29 @@ RimTimeAxisAnnotation::RimTimeAxisAnnotation() CAF_PDM_InitObject( "Time Axis Annotation", ":/LeftAxis16x16.png" ); m_value.uiCapability()->setUiHidden( true ); - - CAF_PDM_InitField( &m_color, "Color", RiaColorTools::fromQColorTo3f( defaultColor( AnnotationType::LINE ) ), "Color" ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimTimeAxisAnnotation::setTime( time_t time ) +void RimTimeAxisAnnotation::setTime( time_t time, const QString& dateTimeFormatString ) { m_value = RiaTimeTTools::toDouble( time ); - QString dateFormatString = RiaQDateTimeTools::dateFormatString( RiaPreferences::current()->dateFormat(), - RiaDefines::DateFormatComponents::DATE_FORMAT_YEAR_MONTH_DAY ); + QString formatString = dateTimeFormatString; - QString timeFormatString = RiaQDateTimeTools::timeFormatString( RiaPreferences::current()->timeFormat(), - RiaDefines::TimeFormatComponents::TIME_FORMAT_HOUR_MINUTE ); + if ( formatString.isEmpty() ) + { + QString dateFormatString = RiaQDateTimeTools::dateFormatString( RiaPreferences::current()->dateFormat(), + RiaDefines::DateFormatComponents::DATE_FORMAT_YEAR_MONTH_DAY ); - QString dateTimeFormatString = QString( "%1 %2" ).arg( dateFormatString ).arg( timeFormatString ); + QString timeFormatString = RiaQDateTimeTools::timeFormatString( RiaPreferences::current()->timeFormat(), + RiaDefines::TimeFormatComponents::TIME_FORMAT_HOUR_MINUTE ); - m_name = RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( time ), dateTimeFormatString ); + QString dateTimeFormatString = QString( "%1 %2" ).arg( dateFormatString ).arg( timeFormatString ); + } + + m_name = RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( time ), formatString ); setAnnotationType( AnnotationType::LINE ); } @@ -110,23 +113,7 @@ QColor RimTimeAxisAnnotation::defaultColor( AnnotationType annotationType ) //-------------------------------------------------------------------------------------------------- void RimTimeAxisAnnotation::setDefaultColor() { - m_color = RiaColorTools::fromQColorTo3f( defaultColor( annotationType() ) ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimTimeAxisAnnotation::setColor( const cvf::Color3f& color ) -{ - m_color = color; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QColor RimTimeAxisAnnotation::color() const -{ - return RiaColorTools::toQColor( m_color ); + setColor( RiaColorTools::fromQColorTo3f( defaultColor( annotationType() ) ) ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimTimeAxisAnnotation.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h similarity index 87% rename from ApplicationLibCode/ProjectDataModel/RimTimeAxisAnnotation.h rename to ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h index 87d67951b4..e8f001e912 100644 --- a/ApplicationLibCode/ProjectDataModel/RimTimeAxisAnnotation.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h @@ -38,18 +38,15 @@ class RimTimeAxisAnnotation : public RimPlotAxisAnnotation public: RimTimeAxisAnnotation(); - void setTime( time_t time ); - void setTimeRange( time_t startTime, time_t endTime ); - QColor color() const override; + void setTime( time_t time, const QString& dateTimeFormatString ); + void setTimeRange( time_t startTime, time_t endTime ); - void setColor( const cvf::Color3f& color ); void setDefaultColor(); + void setDateTimeFormatString( const QString& formatString ); protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void initAfterRead() override; static QColor defaultColor( AnnotationType annotationType ); - - caf::PdmField m_color; }; diff --git a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake index 66734c9b44..f690533fd8 100644 --- a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake @@ -88,7 +88,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimReloadCaseTools.h ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisPropertiesInterface.h ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisProperties.h - ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisLogRangeCalculator.h ${CMAKE_CURRENT_LIST_DIR}/RimObservedDataCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimObservedFmuRftData.h @@ -105,8 +104,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunction.h ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionWeight.h - ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.h - ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesDataInterface.h ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetInterface.h ${CMAKE_CURRENT_LIST_DIR}/cafTreeNode.h @@ -122,7 +119,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimPressureDepthData.h ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultDefinitionTools.h ${CMAKE_CURRENT_LIST_DIR}/RimResultSelectionUi.h - ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimEmCase.h ${CMAKE_CURRENT_LIST_DIR}/RimEclipseViewCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseEnsemble.h @@ -220,7 +216,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimReloadCaseTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisPropertiesInterface.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisProperties.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisLogRangeCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RimObservedDataCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimObservedFmuRftData.cpp @@ -235,8 +230,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunction.cpp ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionWeight.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/cafTreeNode.cpp ${CMAKE_CURRENT_LIST_DIR}/RimMultipleLocations.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionBand.cpp @@ -250,7 +243,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimPressureDepthData.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultDefinitionTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RimResultSelectionUi.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEmCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPolylinePickerInterface.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEclipseViewCollection.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp index 3617bbcd4a..44f6ce69f3 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp @@ -473,7 +473,8 @@ void RimDepthTrackPlot::setDepthMarkerPosition( double depth ) if ( firstAnnotation == nullptr ) { - firstAnnotation = RimPlotAxisAnnotation::createLineAnnotation(); + firstAnnotation = new RimPlotAxisAnnotation(); + firstAnnotation->setAnnotationType( RimPlotAxisAnnotation::AnnotationType::LINE ); firstAnnotation->setPenStyle( Qt::DashLine ); m_depthAnnotations.push_back( firstAnnotation ); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake index 0bf47d6e25..e482069563 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake @@ -54,6 +54,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressSelector.h ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCrossPlotStatisticsCase.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryEnsembleTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotReadOut.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -112,6 +113,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressSelector.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCrossPlotStatisticsCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryEnsembleTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotReadOut.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp index e73f05834d..9063fef895 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp @@ -21,6 +21,7 @@ #include "RiaApplication.h" #include "RiaNumericalTools.h" #include "RiaPlotDefines.h" +#include "RiaTimeTTools.h" #include "Summary/RiaSummaryAddressAnalyzer.h" #include "Summary/RiaSummaryAddressModifier.h" #include "Summary/RiaSummaryStringTools.h" @@ -30,12 +31,11 @@ #include "PlotBuilderCommands/RicAppendSummaryPlotsForSummaryCasesFeature.h" #include "PlotBuilderCommands/RicSummaryPlotBuilder.h" -#include "PlotBuilderCommands/RicSummaryPlotBuilder.h" - #include "RifEclEclipseSummary.h" #include "RifEclipseRftAddress.h" #include "RifEclipseSummaryAddress.h" +#include "RimAnnotationLineAppearance.h" #include "RimEnsembleCurveSet.h" #include "RimMainPlotCollection.h" #include "RimMultiPlotCollection.h" @@ -67,6 +67,9 @@ #include +#include "RiaPreferences.h" +#include "RiaQDateTimeTools.h" +#include "RimSummaryPlotReadOut.h" #include namespace caf @@ -146,6 +149,9 @@ RimSummaryMultiPlot::RimSummaryMultiPlot() CAF_PDM_InitField( &m_allow3DSelectionLink, "Allow3DSelectionLink", true, "Allow Well Selection from 3D View" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_allow3DSelectionLink ); + CAF_PDM_InitFieldNoDefault( &m_readOutSettings, "ReadOutSettings", "Read Out Settings" ); + m_readOutSettings = new RimSummaryPlotReadOut; + CAF_PDM_InitFieldNoDefault( &m_axisRangeAggregation, "AxisRangeAggregation", "Y Axis Range" ); CAF_PDM_InitField( &m_hidePlotsWithValuesBelow, "HidePlotsWithValuesBelow", false, "" ); @@ -389,6 +395,9 @@ void RimSummaryMultiPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrde axesGroup->add( &m_linkTimeAxis ); axesGroup->add( &m_autoAdjustAppearance ); + auto readOutGroup = uiOrdering.addNewGroup( "Mouse Cursor Readout" ); + m_readOutSettings->uiOrdering( uiConfigName, *readOutGroup ); + auto plotVisibilityFilterGroup = uiOrdering.addNewGroup( "Plot Visibility Filter" ); plotVisibilityFilterGroup->add( &m_plotFilterYAxisThreshold ); plotVisibilityFilterGroup->add( &m_hidePlotsWithValuesBelow ); @@ -498,6 +507,17 @@ void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFi RimMultiPlot::fieldChangedByUi( changedField, oldValue, newValue ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryMultiPlot::childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) +{ + if ( changedChildField == &m_readOutSettings ) + { + updateReadOutSettings(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -832,9 +852,9 @@ void RimSummaryMultiPlot::setDefaultRangeAggregationSteppingDimension() m_sourceStepping->setStepDimension( stepDimension ); - // Previously, when the stepping dimension was set to 'well' for range aggregation, it was based on all wells. If one of the wells had - // extreme values and was not visible, it would set the y-range to match the extreme value, making some curves invisible. We have now - // changed the default setting to use visible subplots to determine the y-range aggregation. + // Previously, when the stepping dimension was set to 'well' for range aggregation, it was based on all wells. If one of the wells + // had extreme values and was not visible, it would set the y-range to match the extreme value, making some curves invisible. We + // have now changed the default setting to use visible subplots to determine the y-range aggregation. // https://github.com/OPM/ResInsight/issues/10543 m_axisRangeAggregation = AxisRangeAggregation::SUB_PLOTS; @@ -1455,6 +1475,29 @@ void RimSummaryMultiPlot::updateReadOnlyState() m_axisRangeAggregation.uiCapability()->setUiReadOnly( m_linkSubPlotAxes() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryMultiPlot::updateReadOutSettings() +{ + for ( auto plot : summaryPlots() ) + { + if ( !m_readOutSettings->enableVerticalLine() ) plot->removeAllTimeAnnotations(); + + if ( !m_readOutSettings->enableHorizontalLine() ) + { + if ( auto axis = plot->axisPropertiesForPlotAxis( RiuPlotAxis::defaultLeft() ) ) + { + axis->removeAllAnnotations(); + } + } + + plot->enableCurvePointTracking( m_readOutSettings->enableCurvePointTracking() ); + + plot->updateAxes(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1494,6 +1537,8 @@ QWidget* RimSummaryMultiPlot::createViewWidget( QWidget* mainWindowParent ) } recreatePlotWidgets(); + updateReadOutSettings(); + return m_viewer; } @@ -1672,3 +1717,72 @@ void RimSummaryMultiPlot::selectWell( QString wellName ) if ( m_sourceStepping->stepDimension() != SourceSteppingDimension::WELL ) return; m_sourceStepping->setStep( wellName ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryMultiPlot::updateReadOutLines( double qwtTimeValue, double yValue ) +{ + if ( !m_readOutSettings->enableVerticalLine() && !m_readOutSettings->enableHorizontalLine() ) return; + + const auto timeTValue = RiaTimeTTools::fromDouble( qwtTimeValue ); + const QString dateFormatString = RiaQDateTimeTools::dateFormatString( RiaPreferences::current()->dateFormat(), + RiaDefines::DateFormatComponents::DATE_FORMAT_YEAR_MONTH_DAY ); + + for ( auto plot : summaryPlots() ) + { + if ( m_readOutSettings->enableVerticalLine() && plot->timeAxisProperties() ) + { + plot->timeAxisProperties()->removeAllAnnotations(); + + auto anno = new RimTimeAxisAnnotation; + + anno->setTime( timeTValue, dateFormatString ); + + auto lineAppearance = m_readOutSettings->lineAppearance(); + + Qt::PenStyle style = lineAppearance->isDashed() ? Qt::PenStyle::DashLine : Qt::PenStyle::SolidLine; + anno->setPenStyle( style ); + anno->setColor( lineAppearance->color() ); + anno->setAlignment( m_readOutSettings->verticalLineLabelAlignment() ); + + plot->timeAxisProperties()->appendAnnotation( anno ); + } + + if ( m_readOutSettings->enableHorizontalLine() ) + { + if ( auto leftAxisProperties = dynamic_cast( plot->axisPropertiesForPlotAxis( RiuPlotAxis::defaultLeft() ) ) ) + { + leftAxisProperties->removeAllAnnotations(); + + auto summaryCurves = plot->summaryCurves(); + if ( !summaryCurves.empty() ) + { + auto firstCurve = summaryCurves.front(); + yValue = firstCurve->yValueAtTimeT( timeTValue ); + } + + auto anno = new RimPlotAxisAnnotation(); + anno->setAnnotationType( RimPlotAxisAnnotation::AnnotationType::LINE ); + + anno->setValue( yValue ); + + auto scaledValue = yValue / leftAxisProperties->scaleFactor(); + auto valueText = RiaNumberFormat::valueToText( scaledValue, RiaNumberFormat::NumberFormatType::FIXED, 2 ); + + anno->setName( valueText ); + + auto lineAppearance = m_readOutSettings->lineAppearance(); + + Qt::PenStyle style = lineAppearance->isDashed() ? Qt::PenStyle::DashLine : Qt::PenStyle::SolidLine; + anno->setPenStyle( style ); + anno->setColor( lineAppearance->color() ); + anno->setAlignment( m_readOutSettings->horizontalLineLabelAlignment() ); + + leftAxisProperties->appendAnnotation( anno ); + } + } + + plot->updateAxes(); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h index 5797a0fbec..6eaff4c197 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h @@ -35,6 +35,7 @@ class RimSummaryPlotSourceStepping; class RimSummaryPlotNameHelper; class RimSummaryNameHelper; class RimPlotAxisProperties; +class RimSummaryPlotReadOut; //================================================================================================== /// @@ -113,6 +114,8 @@ public: void selectWell( QString wellName ); + void updateReadOutLines( double qwtTimeValue, double yValue ); + protected: bool handleGlobalKeyEvent( QKeyEvent* keyEvent ) override; bool handleGlobalWheelEvent( QWheelEvent* wheelEvent ) override; @@ -127,6 +130,8 @@ private: void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override; + void populateNameHelper( RimSummaryPlotNameHelper* nameHelper ); void computeAggregatedAxisRange(); @@ -151,6 +156,8 @@ private: void updateReadOnlyState(); + void updateReadOutSettings(); + std::pair adjustedMinMax( const RimPlotAxisProperties* axis, double min, double max ) const; private: @@ -163,6 +170,8 @@ private: caf::PdmField m_autoAdjustAppearance; caf::PdmField m_allow3DSelectionLink; + caf::PdmChildField m_readOutSettings; + caf::PdmField m_hidePlotsWithValuesBelow; caf::PdmField m_plotFilterYAxisThreshold; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index a72481c1a9..ec1ca496d3 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -1117,6 +1117,14 @@ bool RimSummaryPlot::isOnlyWaterCutCurvesVisible( RiuPlotAxis plotAxis ) return ( waterCutCurveCount == curves.size() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlot::enableCurvePointTracking( bool enable ) +{ + m_summaryPlot->enableCurvePointTracking( enable ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1336,8 +1344,9 @@ RimTimeAxisAnnotation* RimSummaryPlot::addTimeAnnotation( time_t time ) RimSummaryTimeAxisProperties* axisProps = timeAxisProperties(); CAF_ASSERT( axisProps ); - auto* annotation = new RimTimeAxisAnnotation; - annotation->setTime( time ); + auto* annotation = new RimTimeAxisAnnotation; + const QString formatString; + annotation->setTime( time, formatString ); annotation->setDefaultColor(); axisProps->appendAnnotation( annotation ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h index 2c8962f73e..d8543f4fb4 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -209,6 +209,8 @@ public: RimSummaryPlotSourceStepping* sourceStepper(); void scheduleReplotIfVisible(); + void enableCurvePointTracking( bool enable ); + public: // RimViewWindow overrides void deleteViewWidget() override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotReadOut.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotReadOut.cpp new file mode 100644 index 0000000000..39090c0d53 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotReadOut.cpp @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimSummaryPlotReadOut.h" + +#include "RimAnnotationLineAppearance.h" + +#include "cafPdmUiCheckBoxEditor.h" + +CAF_PDM_SOURCE_INIT( RimSummaryPlotReadOut, "RimSummaryPlotReadOut" ); + +template <> +void caf::AppEnum::setUp() +{ + addItem( RimSummaryPlotReadOut::ReadOutType::NONE, "NONE", "None" ); + addItem( RimSummaryPlotReadOut::ReadOutType::SNAP_TO_POINT, "SNAP_TO_POINT", "Snap to Closest Curve Point" ); + addItem( RimSummaryPlotReadOut::ReadOutType::TIME_TRACKING, "TIME_TRACKING", "Time Tracking" ); + addItem( RimSummaryPlotReadOut::ReadOutType::TIME_VALUE_TRACKING, "TIME_VALUE_TRACKING", "Time and Value Tracking" ); + + setDefault( RimSummaryPlotReadOut::ReadOutType::SNAP_TO_POINT ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryPlotReadOut::RimSummaryPlotReadOut() +{ + CAF_PDM_InitObject( "Summary Plot Read Out", "" ); + + CAF_PDM_InitFieldNoDefault( &m_readOutType, "ReadOutType", "Readout Mode" ); + m_readOutType = ReadOutType::SNAP_TO_POINT; + + CAF_PDM_InitFieldNoDefault( &m_lineAppearance, "LineAppearance", "" ); + m_lineAppearance = new RimAnnotationLineAppearance; + m_lineAppearance->configureForSummaryAnnotations(); + m_lineAppearance.uiCapability()->setUiTreeChildrenHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_verticalLineLabelAlignment, "VerticalLineLabelAlignment", "Vertical Label Alignment" ); + m_verticalLineLabelAlignment = RiaDefines::TextAlignment::LEFT; + + CAF_PDM_InitFieldNoDefault( &m_horizontalLineLabelAlignment, "HorizontalLineLabelAlignment", "Horizontal Label Alignment" ); + m_horizontalLineLabelAlignment = RiaDefines::TextAlignment::LEFT; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryPlotReadOut::enableCurvePointTracking() const +{ + return m_readOutType() == ReadOutType::SNAP_TO_POINT; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryPlotReadOut::enableHorizontalLine() const +{ + return m_readOutType() == ReadOutType::TIME_VALUE_TRACKING; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimSummaryPlotReadOut::enableVerticalLine() const +{ + return ( ( m_readOutType() == ReadOutType::TIME_TRACKING ) || ( m_readOutType() == ReadOutType::TIME_VALUE_TRACKING ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimAnnotationLineAppearance* RimSummaryPlotReadOut::lineAppearance() const +{ + return m_lineAppearance(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::TextAlignment RimSummaryPlotReadOut::verticalLineLabelAlignment() const +{ + return m_verticalLineLabelAlignment(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::TextAlignment RimSummaryPlotReadOut::horizontalLineLabelAlignment() const +{ + return m_horizontalLineLabelAlignment(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotReadOut::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_readOutType ); + + if ( enableVerticalLine() ) uiOrdering.add( &m_verticalLineLabelAlignment ); + if ( enableHorizontalLine() ) uiOrdering.add( &m_horizontalLineLabelAlignment ); + + if ( enableVerticalLine() || enableHorizontalLine() ) + { + m_lineAppearance->uiOrdering( uiConfigName, uiOrdering ); + } + + uiOrdering.skipRemainingFields(); +} diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotReadOut.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotReadOut.h new file mode 100644 index 0000000000..cbc33907b9 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotReadOut.h @@ -0,0 +1,66 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaPlotDefines.h" + +#include "cafPdmField.h" +#include "cafPdmObject.h" +#include "cafPdmUiItem.h" + +class RimAnnotationLineAppearance; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimSummaryPlotReadOut : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + enum class ReadOutType + { + NONE, + SNAP_TO_POINT, + TIME_TRACKING, + TIME_VALUE_TRACKING + }; + +public: + RimSummaryPlotReadOut(); + + bool enableCurvePointTracking() const; + bool enableHorizontalLine() const; + bool enableVerticalLine() const; + RimAnnotationLineAppearance* lineAppearance() const; + RiaDefines::TextAlignment verticalLineLabelAlignment() const; + RiaDefines::TextAlignment horizontalLineLabelAlignment() const; + +private: + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + +private: + caf::PdmField> m_readOutType; + + caf::PdmChildField m_lineAppearance; + + caf::PdmField> m_verticalLineLabelAlignment; + caf::PdmField> m_horizontalLineLabelAlignment; +}; diff --git a/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp index 6006f91a72..79ca10b773 100644 --- a/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp @@ -141,7 +141,8 @@ void RiuGridCrossQwtPlot::updateAnnotationObjects( RimPlotAxisPropertiesInterfac annotation->name(), annotation->penStyle(), annotation->value(), - RiaDefines::Orientation::HORIZONTAL ); + RiaDefines::Orientation::HORIZONTAL, + Qt::AlignRight ); } } diff --git a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp index d9ef39c704..d586508b6b 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp @@ -190,7 +190,8 @@ void RiuPlotAnnotationTool::attachAnnotationLine( QwtPlot* plot, const QString& annotationText, Qt::PenStyle penStyle, const double position, - RiaDefines::Orientation orientation ) + RiaDefines::Orientation orientation, + Qt::Alignment horizontalAlignment ) { m_plot = plot; @@ -202,22 +203,11 @@ void RiuPlotAnnotationTool::attachAnnotationLine( QwtPlot* plot, textColor = RiuGuiTheme::getColorByVariableName( "textColor" ); } - RiuPlotAnnotationTool::setLineProperties( line, annotationText, orientation, position, penStyle, color, textColor ); + RiuPlotAnnotationTool::setLineProperties( line, annotationText, orientation, position, penStyle, color, textColor, horizontalAlignment ); m_plotItems.push_back( line ); line->attach( m_plot ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuPlotAnnotationTool::attachAnnotation( QwtPlot* plot, RimPlotAxisAnnotation* annotation, RiaDefines::Orientation orientation ) -{ - if ( annotation->annotationType() == RimPlotAxisAnnotation::AnnotationType::LINE ) - { - attachAnnotationLine( plot, annotation->color(), annotation->name(), annotation->penStyle(), annotation->value(), orientation ); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -262,6 +252,23 @@ void RiuPlotAnnotationTool::detachAllAnnotations() m_plotItems.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +Qt::Alignment RiuPlotAnnotationTool::textAlignment( RiaDefines::TextAlignment alignment ) +{ + switch ( alignment ) + { + case RiaDefines::TextAlignment::LEFT: + return Qt::AlignLeft; + case RiaDefines::TextAlignment::CENTER: + return Qt::AlignHCenter; + case RiaDefines::TextAlignment::RIGHT: + return Qt::AlignRight; + } + return Qt::AlignRight; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h index 03403ad32e..f7fa38b333 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h +++ b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h @@ -58,9 +58,8 @@ public: const QString& annotationText, Qt::PenStyle penStyle, const double position, - RiaDefines::Orientation orientation ); - - void attachAnnotation( QwtPlot* plot, RimPlotAxisAnnotation* annotation, RiaDefines::Orientation orientation ); + RiaDefines::Orientation orientation, + Qt::Alignment horizontalAlignment ); void attachAnnotationRange( QwtPlot* plot, const QColor& color, @@ -83,6 +82,8 @@ public: void detachAllAnnotations(); + static Qt::Alignment textAlignment( RiaDefines::TextAlignment alignment ); + private: static Qt::Alignment trackTextAlignment( RiaDefines::TrackSpan trackSpan ); diff --git a/ApplicationLibCode/UserInterface/RiuSummaryPlot.h b/ApplicationLibCode/UserInterface/RiuSummaryPlot.h index ea1e7b0f50..9e85687af7 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryPlot.h +++ b/ApplicationLibCode/UserInterface/RiuSummaryPlot.h @@ -52,6 +52,8 @@ public: virtual RiuPlotWidget* plotWidget() const = 0; + virtual void enableCurvePointTracking( bool enable ){}; + public slots: void showContextMenu( QPoint ); }; diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp index cf6cec3da7..d34a5154ff 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -20,6 +20,7 @@ #include "RiaApplication.h" #include "RiaPreferences.h" +#include "Summary/RiaSummaryTools.h" #include "Commands/CorrelationPlotCommands/RicNewCorrelationPlotFeature.h" @@ -29,7 +30,9 @@ #include "RimPlotAxisPropertiesInterface.h" #include "RimSummaryCase.h" #include "RimSummaryCurve.h" +#include "RimSummaryMultiPlot.h" #include "RimSummaryPlot.h" +#include "RimSummaryTimeAxisProperties.h" #include "RiuPlotAnnotationTool.h" #include "RiuPlotCurve.h" @@ -40,7 +43,6 @@ #include "RiuPlotMainWindowTools.h" #include "RiuQwtPlotTools.h" -#include "RiuQwtPlotWheelZoomer.h" #include "RiuQwtPlotZoomer.h" #include "RiuQwtScalePicker.h" @@ -54,6 +56,7 @@ #include "qwt_interval.h" #include "qwt_legend.h" #include "qwt_legend_label.h" +#include "qwt_picker_machine.h" #include "qwt_plot_curve.h" #include "qwt_plot_panner.h" #include "qwt_plot_zoomer.h" @@ -71,6 +74,44 @@ static RimEnsembleCurveInfoTextProvider ensembleCurveInfoTextProvider; +//-------------------------------------------------------------------------------------------------- +/// Class used to track the cursor position and send the plot coordinates to the summary plot +//-------------------------------------------------------------------------------------------------- +class CoordinatePicker : public QwtPlotPicker +{ +public: + CoordinatePicker( RimSummaryMultiPlot* summaryMultiPlot, QwtPlot* plot ) + : QwtPlotPicker( plot->canvas() ) + , m_summaryMultiPlot( summaryMultiPlot ) + { + setTrackerMode( QwtPlotPicker::AlwaysOn ); + plot->canvas()->setMouseTracking( true ); + + setStateMachine( new QwtPickerTrackerMachine ); + } + + //-------------------------------------------------------------------------------------------------- + /// + //-------------------------------------------------------------------------------------------------- + QwtText trackerText( const QPoint& screenPixelCoordinates ) const override + { + if ( m_summaryMultiPlot ) + { + auto domainCoordinates = invTransform( screenPixelCoordinates ); + auto qwtTimeValue = domainCoordinates.x(); + auto yValue = domainCoordinates.y(); + + m_summaryMultiPlot->updateReadOutLines( qwtTimeValue, yValue ); + } + + // Return empty text here, as we only want to update the vertical line + return {}; + } + +private: + caf::PdmPointer m_summaryMultiPlot; +}; + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -97,7 +138,7 @@ RiuSummaryQwtPlot::RiuSummaryQwtPlot( RimSummaryPlot* plot, QWidget* parent /*= connect( panner, SIGNAL( panned( int, int ) ), SLOT( onZoomedSlot() ) ); setDefaults(); - new RiuQwtCurvePointTracker( m_plotWidget->qwtPlot(), true, &ensembleCurveInfoTextProvider ); + m_curvePointTracker = new RiuQwtCurvePointTracker( m_plotWidget->qwtPlot(), true, &ensembleCurveInfoTextProvider ); RiuQwtPlotTools::setCommonPlotBehaviour( m_plotWidget->qwtPlot() ); RiuQwtPlotTools::setDefaultAxes( m_plotWidget->qwtPlot() ); @@ -107,6 +148,11 @@ RiuSummaryQwtPlot::RiuSummaryQwtPlot( RimSummaryPlot* plot, QWidget* parent /*= m_plotWidget->clearLegend(); m_annotationTool = std::make_unique(); + + if ( auto multiPlot = RiaSummaryTools::parentSummaryMultiPlot( plot ) ) + { + new CoordinatePicker( multiPlot, m_plotWidget->qwtPlot() ); + } } //-------------------------------------------------------------------------------------------------- @@ -158,7 +204,8 @@ void RiuSummaryQwtPlot::updateAnnotationObjects( RimPlotAxisPropertiesInterface* annotation->name(), annotation->penStyle(), annotation->value(), - orientation ); + orientation, + RiuPlotAnnotationTool::textAlignment( annotation->textAlignment() ) ); } else if ( annotation->annotationType() == RimPlotAxisAnnotation::AnnotationType::RANGE ) { @@ -215,6 +262,14 @@ RiuPlotWidget* RiuSummaryQwtPlot::plotWidget() const return m_plotWidget; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuSummaryQwtPlot::enableCurvePointTracking( bool enable ) +{ + m_curvePointTracker->setEnabled( enable ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.h b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.h index c6afbcd410..ce8c7ea228 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.h +++ b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.h @@ -33,6 +33,7 @@ class RiuQwtPlotZoomer; class RiuQwtPlotWheelZoomer; class RimPlotAxisPropertiesInterface; class RiuPlotAnnotationTool; +class RiuQwtCurvePointTracker; //================================================================================================== // @@ -59,6 +60,8 @@ public: RiuPlotWidget* plotWidget() const override; + void enableCurvePointTracking( bool enable ) override; + protected: void setDefaults(); bool isZoomerActive() const; @@ -71,6 +74,7 @@ private: std::unique_ptr m_annotationTool; QPointer m_plotWidget; - QPointer m_plotZoomer; - QPointer m_wheelZoomer; + QPointer m_plotZoomer; + QPointer m_wheelZoomer; + QPointer m_curvePointTracker; }; diff --git a/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp b/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp index 68f8ec5e24..c481ffb7ba 100644 --- a/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp +++ b/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp @@ -107,7 +107,13 @@ void RiuWellLogTrack::createAnnotationsInPlot( const std::vectorattachAnnotation( qwtPlot(), annotation, orientation ); + m_annotationTool->attachAnnotationLine( qwtPlot(), + annotation->color(), + annotation->name(), + annotation->penStyle(), + annotation->value(), + orientation, + Qt::AlignRight ); } }