#12925: Add global curve style settings and per-item rules

This commit is contained in:
Magne Sjaastad committed 2026-10-19 15:55:25 +02:00
1 parent 635c49bb3b
commit e21da59dbb
19 files changed
+2215 -8

No files matched your search

@@ -0,0 +1,124 @@
#include "gtest/gtest.h"
#include "RifEclipseSummaryAddress.h"
#include "RimCurveStyleRule.h"
#include "RimCurveStyleRules.h"
#include "RimCurveStyleSettings.h"
#include "RimPlotCurveAppearance.h"
#include "RimSavedCurveAppearance.h"
#include "RimSummaryCurve.h"
using D = RimCurveStyleSettings::Dimension;
//--------------------------------------------------------------------------------------------------
/// Rules for the selected dimensions are returned ordered by dimension, independent of creation order
//--------------------------------------------------------------------------------------------------
TEST( RimCurveStyleRulesTest, RulesForOrderedByDimension )
{
RimCurveStyleRules rules;
rules.settings()->setColorDimension( D::WELL );
rules.settings()->setSymbolDimension( D::CASE );
auto wellRule = rules.findOrCreateRule( D::WELL, "A-1" );
wellRule->setCustom( true );
rules.findOrCreateRule( D::WELL, "B-2" )->setCustom( true );
rules.findOrCreateRule( D::VECTOR, "WOPR" )->setCustom( true );
rules.findOrCreateRule( D::CASE, "auto case" );
auto caseRule = rules.findOrCreateRule( D::CASE, "case" );
caseRule->setCustom( true );
EXPECT_EQ( wellRule, rules.findOrCreateRule( D::WELL, "A-1" ) );
const auto matching = rules.rulesFor( RifEclipseSummaryAddress::wellAddress( "WOPR", "A-1" ), "case" );
ASSERT_EQ( 2u, matching.size() );
EXPECT_EQ( caseRule, matching[0] );
EXPECT_EQ( wellRule, matching[1] );
EXPECT_TRUE( rules.rulesFor( RifEclipseSummaryAddress::wellAddress( "WOPR", "A-1" ), "auto case" ).size() == 1 );
}
//--------------------------------------------------------------------------------------------------
/// Registered names keep their index when new names are added
//--------------------------------------------------------------------------------------------------
TEST( RimCurveStyleRulesTest, ItemIndicesStableWhenNamesAdded )
{
RimCurveStyleRules rules;
rules.registerItemNames( D::CASE, { "B", "D" } );
auto indices = rules.itemIndices( D::CASE );
EXPECT_EQ( 0, indices["B"] );
EXPECT_EQ( 1, indices["D"] );
rules.registerItemNames( D::CASE, { "A", "B", "C", "D" } );
indices = rules.itemIndices( D::CASE );
ASSERT_EQ( 4u, indices.size() );
EXPECT_EQ( 0, indices["B"] );
EXPECT_EQ( 1, indices["D"] );
EXPECT_EQ( 2, indices["A"] );
EXPECT_EQ( 3, indices["C"] );
EXPECT_TRUE( rules.itemIndices( D::WELL ).empty() );
EXPECT_TRUE( rules.itemIndices( D::VECTOR ).empty() );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST( RimCurveStyleRulesTest, ControlsOnlyCurvesWithValueForDimension )
{
RimCurveStyleRules rules;
rules.settings()->setColorDimension( D::WELL );
rules.settings()->setSymbolDimension( D::NONE );
const auto wellAddress = RifEclipseSummaryAddress::wellAddress( "WOPR", "A-1" );
const auto fieldAddress = RifEclipseSummaryAddress::fieldAddress( "FOPT" );
EXPECT_FALSE( rules.controlsColor( wellAddress, "case" ) );
rules.setUseGlobalAppearance( true );
EXPECT_TRUE( rules.controlsColor( wellAddress, "case" ) );
EXPECT_FALSE( rules.controlsColor( fieldAddress, "case" ) );
EXPECT_FALSE( rules.controlsSymbol( wellAddress, "case" ) );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST( RimCurveStyleRulesTest, CopyAppearance )
{
RimPlotCurveAppearance source;
source.setColor( cvf::Color3f::RED );
source.setSymbol( RiuPlotCurveSymbol::SYMBOL_DIAMOND );
source.setLineThickness( 4 );
source.setSymbolLabel( "label" );
RimPlotCurveAppearance target;
target.copyFrom( source );
EXPECT_TRUE( target.color() == cvf::Color3f::RED );
EXPECT_EQ( RiuPlotCurveSymbol::SYMBOL_DIAMOND, target.symbol() );
EXPECT_EQ( 4, target.lineThickness() );
EXPECT_EQ( "label", target.symbolLabel() );
}
//--------------------------------------------------------------------------------------------------
/// The saved appearance is restored, and not applied after the curve is deleted
//--------------------------------------------------------------------------------------------------
TEST( RimCurveStyleRulesTest, SavedAppearanceRestore )
{
auto curve = new RimSummaryCurve;
curve->setColor( cvf::Color3f::RED );
RimSavedCurveAppearance saved;
saved.setCurve( curve );
curve->setColor( cvf::Color3f::BLUE );
EXPECT_EQ( curve, saved.restore() );
EXPECT_TRUE( curve->color() == cvf::Color3f::RED );
delete curve;
EXPECT_EQ( nullptr, saved.restore() );
}