diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.cpp index 2e602d3b34..65e6172061 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimEquilibriumAxisAnnotation.cpp @@ -33,7 +33,9 @@ namespace caf template <> void RimEquilibriumAxisAnnotation::ExportKeywordEnum::setUp() { - addItem( RimEquilibriumAxisAnnotation::PlotAxisAnnotationType::PL_USER_DEFINED, "User Defined", "User Defined" ); + // The alias is the serialization text used by previous versions, as read back from XML, and maps + // old project files to the correct enum value + addItem( RimEquilibriumAxisAnnotation::PlotAxisAnnotationType::PL_USER_DEFINED, "USER_DEFINED", "User Defined", { "User" } ); addItem( RimEquilibriumAxisAnnotation::PlotAxisAnnotationType::PL_EQUIL_WATER_OIL_CONTACT, "PL_EQUIL_WATER_OIL_CONTACT", "PL_EQUIL_WATER_OIL_CONTACT" ); diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapResolutionTools.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapResolutionTools.cpp index 415c6dbc2e..2587bb3e06 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapResolutionTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapResolutionTools.cpp @@ -25,11 +25,15 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RimContourMapResolutionTools::SamplingResolution::EXTRA_FINE, "Extra Fine", "Extra Fine" ); - addItem( RimContourMapResolutionTools::SamplingResolution::FINE, "Fine", "Fine" ); - addItem( RimContourMapResolutionTools::SamplingResolution::NORMAL, "Normal", "Normal" ); - addItem( RimContourMapResolutionTools::SamplingResolution::COARSE, "Coarse", "Coarse" ); - addItem( RimContourMapResolutionTools::SamplingResolution::EXTRA_COARSE, "Extra Coarse", "Extra Coarse" ); + // The alias is the serialization text used by previous versions, as read back from XML, and maps + // old project files to the correct enum value. EXTRA_FINE and EXTRA_COARSE have no alias, as their + // legacy texts contained whitespace and were never read back correctly from XML + // https://github.com/OPM/ResInsight/issues/14404 + addItem( RimContourMapResolutionTools::SamplingResolution::EXTRA_FINE, "EXTRA_FINE", "Extra Fine" ); + addItem( RimContourMapResolutionTools::SamplingResolution::FINE, "FINE", "Fine", { "Fine" } ); + addItem( RimContourMapResolutionTools::SamplingResolution::NORMAL, "NORMAL", "Normal", { "Normal" } ); + addItem( RimContourMapResolutionTools::SamplingResolution::COARSE, "COARSE", "Coarse", { "Coarse" } ); + addItem( RimContourMapResolutionTools::SamplingResolution::EXTRA_COARSE, "EXTRA_COARSE", "Extra Coarse" ); setDefault( RimContourMapResolutionTools::SamplingResolution::NORMAL ); } }; // namespace caf diff --git a/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp index fbe6c52edc..f5b01e0b45 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp @@ -246,7 +246,7 @@ QString RimGridTimeHistoryCurve::quantityName() const { if ( geoMechTopItem->m_elementFace >= 0 ) { - text.append( ", " + caf::AppEnum::textFromIndex( geoMechTopItem->m_elementFace ) ); + text.append( ", " + caf::AppEnum::uiTextFromIndex( geoMechTopItem->m_elementFace ) ); } else { diff --git a/ApplicationLibCode/UserInterface/RiuFemResultTextBuilder.cpp b/ApplicationLibCode/UserInterface/RiuFemResultTextBuilder.cpp index cf5d6853fc..8a2c49f0a2 100644 --- a/ApplicationLibCode/UserInterface/RiuFemResultTextBuilder.cpp +++ b/ApplicationLibCode/UserInterface/RiuFemResultTextBuilder.cpp @@ -436,7 +436,7 @@ QString RiuFemResultTextBuilder::closestNodeResultText( RimGeoMechResultDefiniti { text.append( QString( "Closest result: N[%1], on face: %2, %3\n" ) .arg( closestNodeId ) - .arg( caf::AppEnum::textFromIndex( m_face ) ) + .arg( caf::AppEnum::uiTextFromIndex( m_face ) ) .arg( scalarValue ) ); } else if ( m_isIntersectionTriangleSet && activeResultPosition == RIG_ELEMENT_NODAL_FACE ) diff --git a/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp b/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp index e4b1a17f5d..c76de4a66c 100644 --- a/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp +++ b/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp @@ -229,7 +229,7 @@ QString RiuResultTextBuilder::geometrySelectionText( const QString& itemSeparato { cvf::StructGridInterface::FaceEnum faceEnum( m_face ); - QString faceText = faceEnum.text(); + QString faceText = faceEnum.uiText(); text += QString( "Face: %1" ).arg( faceText ) + itemSeparator; } @@ -417,7 +417,7 @@ QString RiuResultTextBuilder::faultResultDetails() text += QString( "Name: %1\n" ).arg( fault->name() ); cvf::StructGridInterface::FaceEnum faceHelper( m_face ); - text += "Face: " + faceHelper.text() + "\n"; + text += "Face: " + faceHelper.uiText() + "\n"; if ( m_eclipseView && m_eclipseView->faultResultSettings()->hasValidCustomResult() ) { @@ -937,7 +937,7 @@ QString RiuResultTextBuilder::nncDetails() QString gridName = QString::fromStdString( hostGrid->gridName() ); text.append( - QString( "NNC 1: cell [%1, %2, %3] face %4 (%5)\n" ).arg( i ).arg( j ).arg( k ).arg( face.text() ).arg( gridName ) ); + QString( "NNC 1: cell [%1, %2, %3] face %4 (%5)\n" ).arg( i ).arg( j ).arg( k ).arg( face.uiText() ).arg( gridName ) ); } } @@ -959,7 +959,7 @@ QString RiuResultTextBuilder::nncDetails() QString gridName = QString::fromStdString( hostGrid->gridName() ); cvf::StructGridInterface::FaceEnum oppositeFaceEnum( cvf::StructGridInterface::oppositeFace( face ) ); - QString faceText = oppositeFaceEnum.text(); + QString faceText = oppositeFaceEnum.uiText(); text.append( QString( "NNC 2: cell [%1, %2, %3] face %4 (%5)\n" ).arg( i ).arg( j ).arg( k ).arg( faceText ).arg( gridName ) ); diff --git a/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp b/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp index 90cf6b5d42..0dafb3c285 100644 --- a/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp +++ b/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp @@ -244,7 +244,7 @@ void RiuSelectionChangedHandler::addResultCurveFromSelectionItem( const RiuGeoMe { if ( geomSelectionItem->m_elementFace >= 0 ) { - curveName.append( ", " + caf::AppEnum::textFromIndex( geomSelectionItem->m_elementFace ) ); + curveName.append( ", " + caf::AppEnum::uiTextFromIndex( geomSelectionItem->m_elementFace ) ); } else { diff --git a/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp b/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp index 22bfe09aa7..ab753ea81e 100644 --- a/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp +++ b/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp @@ -46,13 +46,13 @@ namespace caf template <> void cvf::StructGridInterface::FaceEnum::setUp() { - addItem( cvf::StructGridInterface::POS_I, "POS I", "" ); - addItem( cvf::StructGridInterface::NEG_I, "NEG I", "" ); - addItem( cvf::StructGridInterface::POS_J, "POS J", "" ); - addItem( cvf::StructGridInterface::NEG_J, "NEG J", "" ); - addItem( cvf::StructGridInterface::POS_K, "POS K", "" ); - addItem( cvf::StructGridInterface::NEG_K, "NEG K", "" ); - addItem( cvf::StructGridInterface::NO_FACE, "UnDef", "" ); + addItem( cvf::StructGridInterface::POS_I, "POS_I", "POS I" ); + addItem( cvf::StructGridInterface::NEG_I, "NEG_I", "NEG I" ); + addItem( cvf::StructGridInterface::POS_J, "POS_J", "POS J" ); + addItem( cvf::StructGridInterface::NEG_J, "NEG_J", "NEG J" ); + addItem( cvf::StructGridInterface::POS_K, "POS_K", "POS K" ); + addItem( cvf::StructGridInterface::NEG_K, "NEG_K", "NEG K" ); + addItem( cvf::StructGridInterface::NO_FACE, "UNDEF", "UnDef" ); } } // namespace caf diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.cpp index cc4a92474a..4589bd304f 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.cpp @@ -43,6 +43,8 @@ #include "cafAssert.h" +#include + namespace caf { @@ -57,11 +59,25 @@ bool AppEnumMapperBase::EnumData::isMatching( const QString& text ) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +namespace +{ + bool containsWhitespace( const QString& text ) + { + return std::any_of( text.begin(), text.end(), []( const QChar& c ) { return c.isSpace(); } ); + } +} // namespace + void AppEnumMapperBase::addItem( int enumVal, const QString& text, QString uiText, const QStringList& aliases ) { + // The serialization text is read back from XML one whitespace-delimited token at a time, so texts and + // aliases with embedded whitespace would silently be replaced by the default enum value on import + // https://github.com/OPM/ResInsight/issues/14404 + CAF_ASSERT( !containsWhitespace( text.trimmed() ) ); + // Make sure the alias text is unique for enum for ( const auto& alias : aliases ) { + CAF_ASSERT( !containsWhitespace( alias ) ); for ( const auto& enumData : m_mapping ) { CAF_ASSERT( !enumData.isMatching( alias ) );