mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Use field auto values for summary plots
Use auto value concept in summary plot configuration. Default behavior is unchanged, but it is now possible to unlink a field to specify a custom value for this field. Other changes: * Add missing requirement for Svg in test application * Use calculator icon and rename panel text Use icon and relevant text to make it clear that the content in Calculator Data can be used for Grid Property Calculator and nothing else. * Add example with scoped enum and auto value * Use enum value starting av 10 to make sure enum values (not option item index) are working as expected
This commit is contained in:
parent
69cc36b3bc
commit
72c070c3a9
@ -28,6 +28,8 @@
|
||||
#include "RiaGuiApplication.h"
|
||||
#endif
|
||||
|
||||
#include "cafUiAppearanceSettings.h"
|
||||
|
||||
#include "cvfProgramOptions.h"
|
||||
#include "cvfqtUtils.h"
|
||||
|
||||
@ -74,6 +76,9 @@ int main( int argc, char* argv[] )
|
||||
// Create feature manager before the application object is created
|
||||
RiaMainTools::initializeSingletons();
|
||||
|
||||
// https://www.w3.org/wiki/CSS/Properties/color/keywords
|
||||
caf::UiAppearanceSettings::instance()->setAutoValueEditorColor( "moccasin" );
|
||||
|
||||
std::unique_ptr<RiaApplication> app( createApplication( argc, argv ) );
|
||||
|
||||
cvf::ProgramOptions progOpt;
|
||||
|
@ -83,6 +83,21 @@ std::set<std::string> RiaSummaryAddressAnalyzer::quantityNamesNoHistory() const
|
||||
return m_quantitiesNoMatchingHistory;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RiaSummaryAddressAnalyzer::isSingleQuantityIgnoreHistory() const
|
||||
{
|
||||
if ( quantities().size() == 1 ) return true;
|
||||
|
||||
if ( quantities().size() == 2 && quantityNamesWithHistory().size() == 1 )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -46,6 +46,8 @@ public:
|
||||
std::set<std::string> quantityNamesWithHistory() const;
|
||||
std::set<std::string> quantityNamesNoHistory() const;
|
||||
|
||||
bool isSingleQuantityIgnoreHistory() const;
|
||||
|
||||
std::string quantityNameForTitle() const;
|
||||
|
||||
std::set<std::string> wellNames() const;
|
||||
|
@ -64,9 +64,6 @@ RimPlotAxisProperties::RimPlotAxisProperties()
|
||||
CAF_PDM_InitField( &m_isActive, "Active", true, "Active" );
|
||||
m_isActive.uiCapability()->setUiHidden( true );
|
||||
|
||||
CAF_PDM_InitField( &m_isMinMaxOverridden, "IsMinMaxOverridden", false, "IsMinMaxOverridden" );
|
||||
m_isMinMaxOverridden.uiCapability()->setUiHidden( true );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_objectName, "Name", "Name" );
|
||||
m_objectName.uiCapability()->setUiHidden( true );
|
||||
|
||||
@ -76,17 +73,22 @@ RimPlotAxisProperties::RimPlotAxisProperties()
|
||||
CAF_PDM_InitField( &isAutoTitle, "AutoTitle", true, "Auto Title" );
|
||||
|
||||
CAF_PDM_InitField( &m_displayLongName, "DisplayLongName", true, " Names" );
|
||||
m_displayLongName.uiCapability()->enableAutoValueSupport( true );
|
||||
|
||||
CAF_PDM_InitField( &m_displayShortName, "DisplayShortName", false, " Acronyms" );
|
||||
CAF_PDM_InitField( &m_displayUnitText, "DisplayUnitText", true, " Units" );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_customTitle, "CustomTitle", "Title" );
|
||||
|
||||
CAF_PDM_InitField( &m_visibleRangeMax, "VisibleRangeMax", RiaDefines::maximumDefaultValuePlot(), "Max" );
|
||||
m_visibleRangeMax.uiCapability()->enableAutoValueSupport( true );
|
||||
CAF_PDM_InitField( &m_visibleRangeMin, "VisibleRangeMin", RiaDefines::minimumDefaultValuePlot(), "Min" );
|
||||
m_visibleRangeMin.uiCapability()->enableAutoValueSupport( true );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_numberFormat, "NumberFormat", "Number Format" );
|
||||
CAF_PDM_InitField( &m_numberOfDecimals, "Decimals", 2, "Number of Decimals" );
|
||||
CAF_PDM_InitField( &m_scaleFactor, "ScaleFactor", 1.0, "Scale Factor" );
|
||||
m_scaleFactor.uiCapability()->enableAutoValueSupport( true );
|
||||
|
||||
CAF_PDM_InitField( &m_isAutoZoom, "AutoZoom", true, "Set Range Automatically" );
|
||||
CAF_PDM_InitField( &m_isLogarithmicScaleEnabled, "LogarithmicScale", false, "Logarithmic Scale" );
|
||||
@ -106,6 +108,7 @@ RimPlotAxisProperties::RimPlotAxisProperties()
|
||||
m_annotations.uiCapability()->setUiTreeHidden( true );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_majorTickmarkCount, "MajorTickmarkCount", "Major Tickmark Count" );
|
||||
m_majorTickmarkCount.uiCapability()->enableAutoValueSupport( true );
|
||||
|
||||
updateOptionSensitivity();
|
||||
}
|
||||
@ -261,8 +264,6 @@ void RimPlotAxisProperties::defineUiOrdering( QString uiConfigName, caf::PdmUiOr
|
||||
m_plotAxis.uiCapability()->setUiReadOnly( m_isAlwaysRequired );
|
||||
|
||||
uiOrdering.skipRemainingFields( true );
|
||||
|
||||
updateOverriddenLabelAndReadOnlyState();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -503,41 +504,52 @@ void RimPlotAxisProperties::setVisible( bool visible )
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::computeAndSetScaleFactor()
|
||||
void RimPlotAxisProperties::enableAutoValueForScaleFactor( bool enable )
|
||||
{
|
||||
m_scaleFactor.uiCapability()->enableAutoValue( enable );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::computeAndSetAutoValueForScaleFactor()
|
||||
{
|
||||
auto maxAbsValue = std::max( std::fabs( visibleRangeMax() ), std::fabs( visibleRangeMin() ) );
|
||||
|
||||
double scaleFactor = 1.0;
|
||||
|
||||
if ( maxAbsValue < 1.0 && maxAbsValue > 1e-6 )
|
||||
{
|
||||
// Do not use scale factor for small values above 1e-6
|
||||
m_scaleFactor = 1.0;
|
||||
return;
|
||||
scaleFactor = 1.0;
|
||||
}
|
||||
|
||||
if ( maxAbsValue > 1.0 && maxAbsValue < 1e6 )
|
||||
else if ( maxAbsValue > 1.0 && maxAbsValue < 1e6 )
|
||||
{
|
||||
// Do not use scale factor for values above 1 and below 1e-6
|
||||
m_scaleFactor = 1.0;
|
||||
return;
|
||||
}
|
||||
|
||||
int exponent = std::floor( std::log10( maxAbsValue ) );
|
||||
if ( exponent > 0 )
|
||||
{
|
||||
while ( exponent > -20 && ( exponent % 3 ) != 0 )
|
||||
{
|
||||
exponent--;
|
||||
}
|
||||
scaleFactor = 1.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( exponent < 1 && ( exponent % 3 ) != 0 )
|
||||
int exponent = std::floor( std::log10( maxAbsValue ) );
|
||||
if ( exponent > 0 )
|
||||
{
|
||||
exponent++;
|
||||
while ( exponent > -20 && ( exponent % 3 ) != 0 )
|
||||
{
|
||||
exponent--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( exponent < 1 && ( exponent % 3 ) != 0 )
|
||||
{
|
||||
exponent++;
|
||||
}
|
||||
}
|
||||
|
||||
scaleFactor = std::pow( 10, exponent );
|
||||
}
|
||||
|
||||
m_scaleFactor = std::pow( 10, exponent );
|
||||
m_scaleFactor.uiCapability()->setAutoValue( scaleFactor );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -567,9 +579,36 @@ double RimPlotAxisProperties::visibleRangeMax() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::setMinMaxOverridden( bool isOverridden )
|
||||
void RimPlotAxisProperties::enableAutoValueMinMax( bool enable )
|
||||
{
|
||||
m_isMinMaxOverridden = isOverridden;
|
||||
m_visibleRangeMin.uiCapability()->enableAutoValueSupport( enable );
|
||||
m_visibleRangeMax.uiCapability()->enableAutoValueSupport( enable );
|
||||
|
||||
if ( enable )
|
||||
{
|
||||
m_visibleRangeMin.uiCapability()->enableAutoValue( enable );
|
||||
m_visibleRangeMax.uiCapability()->enableAutoValue( enable );
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::setAutoValueVisibleRangeMin( double value )
|
||||
{
|
||||
// Do not notify editors, as this causes recursive updates
|
||||
bool notifyFieldChanged = false;
|
||||
m_visibleRangeMin.uiCapability()->setAutoValue( value, notifyFieldChanged );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::setAutoValueVisibleRangeMax( double value )
|
||||
{
|
||||
// Do not notify editors, as this causes recursive updates
|
||||
bool notifyFieldChanged = false;
|
||||
m_visibleRangeMax.uiCapability()->setAutoValue( value, notifyFieldChanged );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -588,6 +627,17 @@ void RimPlotAxisProperties::setVisibleRangeMax( double value )
|
||||
m_visibleRangeMax = value;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::setAutoZoomIfNoCustomRangeIsSet()
|
||||
{
|
||||
if ( !m_visibleRangeMax.uiCapability()->isAutoValueEnabled() ) return;
|
||||
if ( !m_visibleRangeMin.uiCapability()->isAutoValueEnabled() ) return;
|
||||
|
||||
setAutoZoom( true );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -604,6 +654,24 @@ void RimPlotAxisProperties::setMajorTickmarkCount( LegendTickmarkCount count )
|
||||
m_majorTickmarkCount = count;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::setAutoValueForMajorTickmarkCount( LegendTickmarkCount count )
|
||||
{
|
||||
auto enumValue = static_cast<std::underlying_type_t<LegendTickmarkCount>>( count );
|
||||
|
||||
m_majorTickmarkCount.uiCapability()->setAutoValue( enumValue );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::enableAutoValueForMajorTickmarkCount( bool enable )
|
||||
{
|
||||
m_majorTickmarkCount.uiCapability()->enableAutoValue( enable );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -659,23 +727,6 @@ void RimPlotAxisProperties::updateOptionSensitivity()
|
||||
m_customTitle.uiCapability()->setUiReadOnly( isAutoTitle );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisProperties::updateOverriddenLabelAndReadOnlyState()
|
||||
{
|
||||
// Auto Appearance is defined in RimSummaryMultiPlot::analyzePlotsAndAdjustAppearanceSettings()
|
||||
QString axisRangeToolTip = "Controlled by Axis Range Control";
|
||||
|
||||
RiaFieldHandleTools::updateOverrideStateAndLabel( &m_visibleRangeMin, m_isMinMaxOverridden, axisRangeToolTip );
|
||||
RiaFieldHandleTools::updateOverrideStateAndLabel( &m_visibleRangeMax, m_isMinMaxOverridden, axisRangeToolTip );
|
||||
|
||||
QString autoAppearanceToolTip = "Controlled by Auto Adjust Appearance";
|
||||
RiaFieldHandleTools::updateOverrideStateAndLabel( &m_majorTickmarkCount, isAppearanceOverridden(), autoAppearanceToolTip );
|
||||
RiaFieldHandleTools::updateOverrideStateAndLabel( &m_scaleFactor, isAppearanceOverridden(), autoAppearanceToolTip );
|
||||
RiaFieldHandleTools::updateOverrideStateAndLabel( &m_displayLongName, isAppearanceOverridden(), autoAppearanceToolTip );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -97,7 +97,8 @@ public:
|
||||
double scaleFactor() const;
|
||||
|
||||
void setVisible( bool visible );
|
||||
void computeAndSetScaleFactor();
|
||||
void enableAutoValueForScaleFactor( bool enable );
|
||||
void computeAndSetAutoValueForScaleFactor();
|
||||
|
||||
bool isDeletable() const override;
|
||||
|
||||
@ -113,12 +114,17 @@ public:
|
||||
double visibleRangeMin() const override;
|
||||
double visibleRangeMax() const override;
|
||||
|
||||
void setMinMaxOverridden( bool isOverridden );
|
||||
void enableAutoValueMinMax( bool enable );
|
||||
void setAutoValueVisibleRangeMin( double value );
|
||||
void setAutoValueVisibleRangeMax( double value );
|
||||
void setVisibleRangeMin( double value ) override;
|
||||
void setVisibleRangeMax( double value ) override;
|
||||
void setAutoZoomIfNoCustomRangeIsSet();
|
||||
|
||||
LegendTickmarkCount majorTickmarkCount() const override;
|
||||
void setMajorTickmarkCount( LegendTickmarkCount count ) override;
|
||||
void setAutoValueForMajorTickmarkCount( LegendTickmarkCount count );
|
||||
void enableAutoValueForMajorTickmarkCount( bool enable );
|
||||
|
||||
protected:
|
||||
void initAfterRead() override;
|
||||
@ -131,15 +137,12 @@ protected:
|
||||
|
||||
private:
|
||||
void updateOptionSensitivity();
|
||||
void updateOverriddenLabelAndReadOnlyState();
|
||||
caf::FontTools::FontSize plotFontSize() const;
|
||||
void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
|
||||
|
||||
private:
|
||||
caf::PdmField<bool> m_isActive;
|
||||
|
||||
caf::PdmField<bool> m_isMinMaxOverridden;
|
||||
|
||||
caf::PdmField<bool> isAutoTitle;
|
||||
caf::PdmField<bool> m_displayShortName;
|
||||
caf::PdmField<bool> m_displayLongName;
|
||||
|
@ -53,9 +53,6 @@ RimPlotAxisPropertiesInterface::RimPlotAxisPropertiesInterface()
|
||||
: settingsChanged( this )
|
||||
{
|
||||
CAF_PDM_InitObject( "Plot Axis Properties Interface" );
|
||||
|
||||
CAF_PDM_InitField( &m_isAppearanceOverridden, "IsAppearanceOverridden", false, "IsAppearanceOverridden" );
|
||||
m_isAppearanceOverridden.uiCapability()->setUiHidden( true );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -74,14 +71,6 @@ bool RimPlotAxisPropertiesInterface::isLogarithmicScaleEnabled() const
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotAxisPropertiesInterface::setAppearanceOverridden( bool isOverridden )
|
||||
{
|
||||
m_isAppearanceOverridden = isOverridden;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -109,11 +98,3 @@ int RimPlotAxisPropertiesInterface::tickmarkCountFromEnum( LegendTickmarkCount c
|
||||
|
||||
return maxTickmarkCount;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RimPlotAxisPropertiesInterface::isAppearanceOverridden() const
|
||||
{
|
||||
return m_isAppearanceOverridden();
|
||||
}
|
||||
|
@ -78,7 +78,6 @@ public:
|
||||
|
||||
virtual LegendTickmarkCount majorTickmarkCount() const = 0;
|
||||
virtual void setMajorTickmarkCount( LegendTickmarkCount count ) = 0;
|
||||
void setAppearanceOverridden( bool isOverridden );
|
||||
|
||||
static int tickmarkCountFromEnum( LegendTickmarkCount count );
|
||||
|
||||
@ -86,10 +85,4 @@ public:
|
||||
virtual AxisTitlePositionType titlePosition() const = 0;
|
||||
virtual int titleFontSize() const = 0;
|
||||
virtual int valuesFontSize() const = 0;
|
||||
|
||||
protected:
|
||||
bool isAppearanceOverridden() const;
|
||||
|
||||
private:
|
||||
caf::PdmField<bool> m_isAppearanceOverridden;
|
||||
};
|
||||
|
@ -146,7 +146,7 @@ RimSummaryMultiPlot::RimSummaryMultiPlot()
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_linkSubPlotAxes );
|
||||
CAF_PDM_InitField( &m_linkTimeAxis, "LinkTimeAxis", true, "Link Time Axis" );
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_linkTimeAxis );
|
||||
CAF_PDM_InitField( &m_autoAdjustAppearance, "AutoAdjustAppearance", true, "Auto Adjust Appearance" );
|
||||
CAF_PDM_InitField( &m_autoAdjustAppearance, "AutoAdjustAppearance", true, "Auto Plot Settings" );
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_autoAdjustAppearance );
|
||||
CAF_PDM_InitField( &m_allow3DSelectionLink, "Allow3DSelectionLink", true, "Allow Well Selection from 3D View" );
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_allow3DSelectionLink );
|
||||
@ -453,9 +453,8 @@ void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFi
|
||||
else if ( changedField == &m_linkSubPlotAxes || changedField == &m_axisRangeAggregation ||
|
||||
changedField == &m_linkTimeAxis )
|
||||
{
|
||||
syncAxisRanges();
|
||||
|
||||
setOverriddenFlag();
|
||||
syncAxisRanges();
|
||||
}
|
||||
else if ( changedField == &m_hidePlotsWithValuesBelow )
|
||||
{
|
||||
@ -493,8 +492,8 @@ void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFi
|
||||
}
|
||||
else if ( changedField == &m_autoAdjustAppearance )
|
||||
{
|
||||
checkAndApplyAutoAppearance();
|
||||
setOverriddenFlag();
|
||||
checkAndApplyAutoAppearance();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -731,6 +730,8 @@ void RimSummaryMultiPlot::onLoadDataAndUpdate()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::zoomAll()
|
||||
{
|
||||
setOverriddenFlag();
|
||||
|
||||
// Reset zoom to make sure the complete range for min/max is available
|
||||
RimMultiPlot::zoomAll();
|
||||
|
||||
@ -816,8 +817,16 @@ void RimSummaryMultiPlot::syncAxisRanges()
|
||||
return;
|
||||
}
|
||||
|
||||
// Reset zoom to make sure the complete range for min/max is available
|
||||
RimMultiPlot::zoomAllYAxes();
|
||||
// Reset zoom for axes with no custom range set to make sure the complete range for min/max is available
|
||||
|
||||
for ( auto p : summaryPlots() )
|
||||
{
|
||||
for ( auto ax : p->plotYAxes() )
|
||||
{
|
||||
ax->setAutoZoomIfNoCustomRangeIsSet();
|
||||
}
|
||||
}
|
||||
updateZoom();
|
||||
|
||||
if ( m_axisRangeAggregation() == AxisRangeAggregation::SUB_PLOTS )
|
||||
{
|
||||
@ -853,8 +862,8 @@ void RimSummaryMultiPlot::syncAxisRanges()
|
||||
auto [minVal, maxVal] = axisRanges[axis->plotAxisType()];
|
||||
if ( axis->isAxisInverted() ) std::swap( minVal, maxVal );
|
||||
axis->setAutoZoom( false );
|
||||
axis->setVisibleRangeMin( minVal );
|
||||
axis->setVisibleRangeMax( maxVal );
|
||||
axis->setAutoValueVisibleRangeMin( minVal );
|
||||
axis->setAutoValueVisibleRangeMax( maxVal );
|
||||
}
|
||||
|
||||
plot->updateAxes();
|
||||
@ -1099,8 +1108,8 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange()
|
||||
scaleEngine.autoScale( maxMajorTickIntervalCount, minVal, maxVal, stepSize );
|
||||
}
|
||||
|
||||
axis->setVisibleRangeMin( minVal );
|
||||
axis->setVisibleRangeMax( maxVal );
|
||||
axis->setAutoValueVisibleRangeMin( minVal );
|
||||
axis->setAutoValueVisibleRangeMax( maxVal );
|
||||
}
|
||||
}
|
||||
|
||||
@ -1152,17 +1161,17 @@ void RimSummaryMultiPlot::setOverriddenFlag()
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryMultiPlot::setOverriddenFlagsForPlot( RimSummaryPlot* summaryPlot,
|
||||
bool isMinMaxOverridden,
|
||||
bool isAppearanceOverridden )
|
||||
bool enableAutoValueMinMax,
|
||||
bool enableAutoValueAppearance )
|
||||
{
|
||||
for ( auto plotAxis : summaryPlot->plotAxes() )
|
||||
auto timeAxisProp = summaryPlot->timeAxisProperties();
|
||||
if ( timeAxisProp ) timeAxisProp->enableAutoValueForMajorTickmarkCount( enableAutoValueAppearance );
|
||||
|
||||
for ( auto plotAxis : summaryPlot->plotYAxes() )
|
||||
{
|
||||
plotAxis->setAppearanceOverridden( isAppearanceOverridden );
|
||||
auto plotAxProp = dynamic_cast<RimPlotAxisProperties*>( plotAxis );
|
||||
if ( plotAxProp )
|
||||
{
|
||||
plotAxProp->setMinMaxOverridden( isMinMaxOverridden );
|
||||
}
|
||||
plotAxis->enableAutoValueMinMax( enableAutoValueMinMax );
|
||||
plotAxis->enableAutoValueForMajorTickmarkCount( enableAutoValueAppearance );
|
||||
plotAxis->enableAutoValueForScaleFactor( enableAutoValueAppearance );
|
||||
}
|
||||
}
|
||||
|
||||
@ -1205,16 +1214,16 @@ void RimSummaryMultiPlot::analyzePlotsAndAdjustAppearanceSettings()
|
||||
analyzer.appendAddresses( addresses );
|
||||
}
|
||||
|
||||
bool hasOnlyOneQuantity = analyzer.quantities().size() == 1;
|
||||
bool hasOnlyOneQuantity = analyzer.isSingleQuantityIgnoreHistory();
|
||||
|
||||
for ( auto p : summaryPlots() )
|
||||
{
|
||||
auto timeAxisProp = p->timeAxisProperties();
|
||||
|
||||
if ( columnCount() < 3 )
|
||||
timeAxisProp->setMajorTickmarkCount( RimPlotAxisProperties::LegendTickmarkCount::TICKMARK_DEFAULT );
|
||||
timeAxisProp->setAutoValueForMajorTickmarkCount( RimPlotAxisProperties::LegendTickmarkCount::TICKMARK_DEFAULT );
|
||||
else
|
||||
timeAxisProp->setMajorTickmarkCount( RimPlotAxisProperties::LegendTickmarkCount::TICKMARK_FEW );
|
||||
timeAxisProp->setAutoValueForMajorTickmarkCount( RimPlotAxisProperties::LegendTickmarkCount::TICKMARK_FEW );
|
||||
|
||||
for ( RimPlotAxisPropertiesInterface* axisInterface : p->plotYAxes() )
|
||||
{
|
||||
@ -1223,11 +1232,13 @@ void RimSummaryMultiPlot::analyzePlotsAndAdjustAppearanceSettings()
|
||||
if ( !axisProp ) continue;
|
||||
|
||||
if ( rowsPerPage() == 1 )
|
||||
axisProp->setMajorTickmarkCount( RimPlotAxisPropertiesInterface::LegendTickmarkCount::TICKMARK_DEFAULT );
|
||||
axisProp->setAutoValueForMajorTickmarkCount(
|
||||
RimPlotAxisPropertiesInterface::LegendTickmarkCount::TICKMARK_DEFAULT );
|
||||
else
|
||||
axisProp->setMajorTickmarkCount( RimPlotAxisPropertiesInterface::LegendTickmarkCount::TICKMARK_FEW );
|
||||
axisProp->setAutoValueForMajorTickmarkCount(
|
||||
RimPlotAxisPropertiesInterface::LegendTickmarkCount::TICKMARK_FEW );
|
||||
|
||||
axisProp->computeAndSetScaleFactor();
|
||||
axisProp->computeAndSetAutoValueForScaleFactor();
|
||||
|
||||
if ( hasOnlyOneQuantity )
|
||||
{
|
||||
@ -1236,9 +1247,15 @@ void RimSummaryMultiPlot::analyzePlotsAndAdjustAppearanceSettings()
|
||||
|
||||
auto [row, col] = gridLayoutInfoForSubPlot( p );
|
||||
if ( col == 0 )
|
||||
{
|
||||
axisProp->setShowUnitText( true );
|
||||
axisProp->setShowDescription( true );
|
||||
}
|
||||
else
|
||||
{
|
||||
axisProp->setShowUnitText( false );
|
||||
axisProp->setShowDescription( false );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1369,8 +1386,8 @@ void RimSummaryMultiPlot::appendSubPlotByStepping( int direction )
|
||||
|
||||
// NOTE: If summary cross plots should be handled here, we also need to call
|
||||
// curve->setSummaryCaseX( newCase );
|
||||
// Setting summaryCaseX with a default uninitialized summary address causes issues for the summary name
|
||||
// analyzer
|
||||
// Setting summaryCaseX with a default uninitialized summary address causes issues for the summary
|
||||
// name analyzer
|
||||
}
|
||||
}
|
||||
else if ( m_sourceStepping()->stepDimension() == RimSummaryDataSourceStepping::SourceSteppingDimension::ENSEMBLE )
|
||||
|
@ -135,7 +135,8 @@ private:
|
||||
|
||||
void updatePlotVisibility();
|
||||
void setOverriddenFlag();
|
||||
void setOverriddenFlagsForPlot( RimSummaryPlot* summaryPlot, bool isMinMaxOverridden, bool isAppearanceOverridden );
|
||||
static void
|
||||
setOverriddenFlagsForPlot( RimSummaryPlot* summaryPlot, bool isMinMaxOverridden, bool isAppearanceOverridden );
|
||||
|
||||
void duplicate();
|
||||
|
||||
|
@ -1738,8 +1738,19 @@ void RimSummaryPlot::updateZoomFromParentPlot()
|
||||
auto [axisMin, axisMax] = plotWidget()->axisRange( axisProperties->plotAxisType() );
|
||||
if ( axisProperties->isAxisInverted() ) std::swap( axisMin, axisMax );
|
||||
|
||||
axisProperties->setVisibleRangeMax( axisMax );
|
||||
axisProperties->setVisibleRangeMin( axisMin );
|
||||
auto propertyAxis = dynamic_cast<RimPlotAxisProperties*>( axisProperties );
|
||||
|
||||
if ( propertyAxis )
|
||||
{
|
||||
propertyAxis->setAutoValueVisibleRangeMax( axisMax );
|
||||
propertyAxis->setAutoValueVisibleRangeMin( axisMin );
|
||||
}
|
||||
else
|
||||
{
|
||||
axisProperties->setVisibleRangeMax( axisMax );
|
||||
axisProperties->setVisibleRangeMin( axisMin );
|
||||
}
|
||||
|
||||
axisProperties->updateConnectedEditors();
|
||||
}
|
||||
}
|
||||
@ -2849,12 +2860,13 @@ std::vector<RimPlotAxisPropertiesInterface*> RimSummaryPlot::plotAxes() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<RimPlotAxisPropertiesInterface*> RimSummaryPlot::plotYAxes() const
|
||||
std::vector<RimPlotAxisProperties*> RimSummaryPlot::plotYAxes() const
|
||||
{
|
||||
std::vector<RimPlotAxisPropertiesInterface*> axisProps;
|
||||
std::vector<RimPlotAxisProperties*> axisProps;
|
||||
for ( const auto& ap : m_axisProperties )
|
||||
{
|
||||
if ( RiaDefines::isVertical( ap->plotAxisType().axis() ) ) axisProps.push_back( ap );
|
||||
auto plotAxisProp = dynamic_cast<RimPlotAxisProperties*>( ap.p() );
|
||||
if ( plotAxisProp ) axisProps.push_back( plotAxisProp );
|
||||
}
|
||||
|
||||
return axisProps;
|
||||
|
@ -197,7 +197,7 @@ public:
|
||||
std::vector<RimSummaryCurve*> allCurves( RimSummaryDataSourceStepping::Axis axis ) const override;
|
||||
|
||||
std::vector<RimPlotAxisPropertiesInterface*> plotAxes() const;
|
||||
std::vector<RimPlotAxisPropertiesInterface*> plotYAxes() const;
|
||||
std::vector<RimPlotAxisProperties*> plotYAxes() const;
|
||||
|
||||
RimPlotAxisPropertiesInterface* axisPropertiesForPlotAxis( RiuPlotAxis plotAxis ) const;
|
||||
|
||||
|
@ -120,6 +120,7 @@ RimSummaryTimeAxisProperties::RimSummaryTimeAxisProperties()
|
||||
m_timeFormat = RiaPreferences::current()->timeFormat();
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_majorTickmarkCount, "MajorTickmarkCount", "Major Tickmark Count" );
|
||||
m_majorTickmarkCount.uiCapability()->enableAutoValueSupport( true );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_annotations, "Annotations", "" );
|
||||
m_annotations.uiCapability()->setUiTreeHidden( true );
|
||||
@ -373,6 +374,24 @@ void RimSummaryTimeAxisProperties::setMajorTickmarkCount( LegendTickmarkCount co
|
||||
m_majorTickmarkCount = count;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryTimeAxisProperties::setAutoValueForMajorTickmarkCount( LegendTickmarkCount count )
|
||||
{
|
||||
auto enumValue = static_cast<std::underlying_type_t<LegendTickmarkCount>>( count );
|
||||
|
||||
m_majorTickmarkCount.uiCapability()->setAutoValue( enumValue );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryTimeAxisProperties::enableAutoValueForMajorTickmarkCount( bool enable )
|
||||
{
|
||||
m_majorTickmarkCount.uiCapability()->enableAutoValue( enable );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -616,10 +635,6 @@ void RimSummaryTimeAxisProperties::defineUiOrdering( QString uiConfigName, caf::
|
||||
timeGroup->add( &m_valuesFontSize );
|
||||
timeGroup->add( &m_majorTickmarkCount );
|
||||
|
||||
// Auto Appearance is defined in RimSummaryMultiPlot::analyzePlotsAndAdjustAppearanceSettings()
|
||||
QString autoAppearanceToolTip = "Controlled by Auto Adjust Appearance";
|
||||
RiaFieldHandleTools::updateOverrideStateAndLabel( &m_majorTickmarkCount, isAppearanceOverridden(), autoAppearanceToolTip );
|
||||
|
||||
if ( m_timeMode() == DATE )
|
||||
{
|
||||
caf::PdmUiGroup* advancedGroup = timeGroup->addNewGroup( "Date/Time Label Format" );
|
||||
|
@ -106,6 +106,8 @@ public:
|
||||
|
||||
LegendTickmarkCount majorTickmarkCount() const override;
|
||||
void setMajorTickmarkCount( LegendTickmarkCount count ) override;
|
||||
void setAutoValueForMajorTickmarkCount( LegendTickmarkCount count );
|
||||
void enableAutoValueForMajorTickmarkCount( bool enable );
|
||||
|
||||
const QString objectName() const override;
|
||||
const QString axisTitleText() const override;
|
||||
|
@ -336,7 +336,7 @@ QIcon RiuDockWidgetTools::dockIcon( const QString dockWidgetName )
|
||||
else if ( dockWidgetName == mainWindowProjectTreeName() )
|
||||
return QIcon( ":/standard.svg" );
|
||||
else if ( dockWidgetName == mainWindowDataSourceTreeName() )
|
||||
return QIcon( ":/data-sources.svg" );
|
||||
return QIcon( ":/Calculator.svg" );
|
||||
else if ( dockWidgetName == mainWindowScriptsTreeName() )
|
||||
return QIcon( ":/scripts.svg" );
|
||||
else if ( dockWidgetName == mainPlotWindowName() )
|
||||
|
@ -731,7 +731,7 @@ void RiuMainWindow::createToolBars()
|
||||
void RiuMainWindow::createDockPanels()
|
||||
{
|
||||
const int nTreeViews = 3;
|
||||
const std::vector<QString> treeViewTitles = { "Project Tree", "Data Sources", "Scripts" };
|
||||
const std::vector<QString> treeViewTitles = { "Project Tree", "Calculator Data ", "Scripts" };
|
||||
const std::vector<QString> treeViewConfigs = { "MainWindow.ProjectTree", "MainWindow.DataSources", "MainWindow.Scripts" };
|
||||
const std::vector<QString> treeViewDockNames = { RiuDockWidgetTools::mainWindowProjectTreeName(),
|
||||
RiuDockWidgetTools::mainWindowDataSourceTreeName(),
|
||||
|
@ -136,13 +136,13 @@ void PdmUiFieldHandle::enableAndSetAutoValue( const QVariant& autoValue )
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void PdmUiFieldHandle::setAutoValue( const QVariant& autoValue )
|
||||
void PdmUiFieldHandle::setAutoValue( const QVariant& autoValue, bool notifyFieldChanged )
|
||||
{
|
||||
m_autoValue = autoValue;
|
||||
|
||||
if ( m_useAutoValue )
|
||||
if ( m_useAutoValue && m_autoValue.isValid() )
|
||||
{
|
||||
setValueFromUiEditor( m_autoValue, false );
|
||||
setValueFromUiEditor( m_autoValue, notifyFieldChanged );
|
||||
updateConnectedEditors();
|
||||
}
|
||||
}
|
||||
@ -162,9 +162,9 @@ void PdmUiFieldHandle::enableAutoValue( bool enable )
|
||||
{
|
||||
m_useAutoValue = enable;
|
||||
|
||||
if ( m_useAutoValue )
|
||||
if ( m_useAutoValue && m_autoValue.isValid() )
|
||||
{
|
||||
setValueFromUiEditor( m_autoValue, false );
|
||||
setValueFromUiEditor( m_autoValue, true );
|
||||
updateConnectedEditors();
|
||||
}
|
||||
}
|
||||
@ -174,6 +174,8 @@ void PdmUiFieldHandle::enableAutoValue( bool enable )
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool PdmUiFieldHandle::isAutoValueEnabled() const
|
||||
{
|
||||
if ( !m_isAutoValueSupported ) return false;
|
||||
|
||||
return m_useAutoValue;
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@ public:
|
||||
void setAutoAddingOptionFromValue( bool isAddingValue );
|
||||
|
||||
void enableAndSetAutoValue( const QVariant& autoValue );
|
||||
void setAutoValue( const QVariant& autoValue );
|
||||
void setAutoValue( const QVariant& autoValue, bool notifyFieldChanged = true );
|
||||
QVariant autoValue() const;
|
||||
void enableAutoValue( bool enable );
|
||||
bool isAutoValueEnabled() const;
|
||||
|
@ -656,9 +656,9 @@ class SmallDemoPdmObjectA : public caf::PdmObject
|
||||
CAF_PDM_HEADER_INIT;
|
||||
|
||||
public:
|
||||
enum TestEnumType
|
||||
enum class TestEnumType
|
||||
{
|
||||
T1,
|
||||
T1 = 10,
|
||||
T2,
|
||||
T3
|
||||
};
|
||||
@ -687,13 +687,14 @@ public:
|
||||
"Enter some small number here",
|
||||
"This is a place you can enter a small integer value if you want");
|
||||
CAF_PDM_InitField(&m_textField, "TextField", QString("Small Demo Object A"), "Name Text Field", "", "", "");
|
||||
CAF_PDM_InitField(&m_testEnumField, "TestEnumValue", caf::AppEnum<TestEnumType>(T1), "EnumField", "", "", "");
|
||||
CAF_PDM_InitField(
|
||||
&m_testEnumField, "TestEnumValue", caf::AppEnum<TestEnumType>(TestEnumType::T1), "EnumField", "", "", "");
|
||||
CAF_PDM_InitFieldNoDefault(&m_ptrField, "m_ptrField", "PtrField", "", "", "");
|
||||
|
||||
CAF_PDM_InitFieldNoDefault(&m_proxyEnumField, "ProxyEnumValue", "ProxyEnum", "", "", "");
|
||||
m_proxyEnumField.registerSetMethod(this, &SmallDemoPdmObjectA::setEnumMember);
|
||||
m_proxyEnumField.registerGetMethod(this, &SmallDemoPdmObjectA::enumMember);
|
||||
m_proxyEnumMember = T2;
|
||||
m_proxyEnumMember = TestEnumType::T2;
|
||||
|
||||
CAF_PDM_InitFieldNoDefault(&m_multipleAppEnum, "MultipleAppEnumValue", "MultipleAppEnumValue", "", "", "");
|
||||
m_multipleAppEnum.capability<caf::PdmUiFieldHandle>()->setUiEditorTypeName(
|
||||
@ -739,7 +740,7 @@ public:
|
||||
}
|
||||
else if (changedField == &m_highlightedEnum)
|
||||
{
|
||||
std::cout << "Highlight value " << m_highlightedEnum() << std::endl;
|
||||
std::cout << "Highlight value " << m_highlightedEnum().uiText().toStdString() << std::endl;
|
||||
}
|
||||
else if (changedField == &m_pushButtonField)
|
||||
{
|
||||
@ -803,7 +804,11 @@ public:
|
||||
|
||||
void enableAutoValueForTestEnum(TestEnumType value)
|
||||
{
|
||||
m_testEnumField.uiCapability()->enableAndSetAutoValue(value);
|
||||
// Convert to integer value as this is used when communicating enum from UI to field enum value
|
||||
// See PdmUiFieldSpecialization<caf::AppEnum<T>>
|
||||
auto enumValue = static_cast<std::underlying_type_t<TestEnumType>>(value);
|
||||
|
||||
m_testEnumField.uiCapability()->enableAndSetAutoValue(enumValue);
|
||||
}
|
||||
|
||||
void enableAutoValueForDouble(double value)
|
||||
@ -818,7 +823,11 @@ public:
|
||||
|
||||
void setAutoValueForTestEnum(TestEnumType value)
|
||||
{
|
||||
m_testEnumField.uiCapability()->setAutoValue(value);
|
||||
// Convert to integer value as this is used when communicating enum from UI to field enum value
|
||||
// See PdmUiFieldSpecialization<caf::AppEnum<T>>
|
||||
auto enumValue = static_cast<std::underlying_type_t<TestEnumType>>(value);
|
||||
|
||||
m_testEnumField.uiCapability()->setAutoValue(enumValue);
|
||||
}
|
||||
|
||||
void setAutoValueForDouble(double value)
|
||||
@ -879,10 +888,10 @@ namespace caf
|
||||
template<>
|
||||
void AppEnum<SmallDemoPdmObjectA::TestEnumType>::setUp()
|
||||
{
|
||||
addItem(SmallDemoPdmObjectA::T1, "T1", "An A letter");
|
||||
addItem(SmallDemoPdmObjectA::T2, "T2", "A B letter");
|
||||
addItem(SmallDemoPdmObjectA::T3, "T3", "A B C letter");
|
||||
setDefault(SmallDemoPdmObjectA::T1);
|
||||
addItem(SmallDemoPdmObjectA::TestEnumType::T1, "T1", "An A letter");
|
||||
addItem(SmallDemoPdmObjectA::TestEnumType::T2, "T2", "A B letter");
|
||||
addItem(SmallDemoPdmObjectA::TestEnumType::T3, "T3", "A B C letter");
|
||||
setDefault(SmallDemoPdmObjectA::TestEnumType::T1);
|
||||
}
|
||||
|
||||
} // namespace caf
|
||||
|
@ -11,9 +11,9 @@ set(QRC_FILES textedit.qrc)
|
||||
find_package(
|
||||
Qt5
|
||||
COMPONENTS
|
||||
REQUIRED Core Gui Widgets OpenGL
|
||||
REQUIRED Core Gui Widgets OpenGL Svg
|
||||
)
|
||||
set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL)
|
||||
set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL Qt5::Svg)
|
||||
qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES})
|
||||
qt5_add_resources(QRC_FILES_CPP ${QRC_FILES})
|
||||
|
||||
|
@ -53,8 +53,6 @@ set(MOC_HEADER_FILES
|
||||
cafPdmDoubleStringValidator.h
|
||||
cafPdmUiPickableLineEditor.h
|
||||
cafPdmUiLabelEditor.h
|
||||
cafUiAppearanceSettings.h
|
||||
cafUiIconFactory.h
|
||||
)
|
||||
|
||||
find_package(
|
||||
|
@ -279,6 +279,8 @@ void PdmUiComboBoxEditor::configureAndUpdateUi( const QString& uiConfigName )
|
||||
m_autoValueToolButton->setIcon( icon );
|
||||
|
||||
m_autoValueToolButton->setChecked( uiField()->isAutoValueEnabled() );
|
||||
QString tooltipText = uiField()->isAutoValueEnabled() ? "Linked" : "Unlinked";
|
||||
m_autoValueToolButton->setToolTip( tooltipText );
|
||||
m_layout->insertWidget( 3, m_autoValueToolButton );
|
||||
m_autoValueToolButton->show();
|
||||
}
|
||||
|
@ -156,6 +156,9 @@ void PdmUiLineEditor::configureAndUpdateUi( const QString& uiConfigName )
|
||||
m_autoValueToolButton->setIcon( icon );
|
||||
|
||||
m_autoValueToolButton->setChecked( uiField()->isAutoValueEnabled() );
|
||||
QString tooltipText = uiField()->isAutoValueEnabled() ? "Linked" : "Unlinked";
|
||||
m_autoValueToolButton->setToolTip( tooltipText );
|
||||
|
||||
m_layout->insertWidget( 1, m_autoValueToolButton );
|
||||
m_autoValueToolButton->show();
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ static const struct
|
||||
|
||||
// clang-format off
|
||||
|
||||
static char* linked_svg_data = R"(
|
||||
static const char* linked_svg_data = R"(
|
||||
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||
@ -168,7 +168,7 @@ static char* linked_svg_data = R"(
|
||||
|
||||
)";
|
||||
|
||||
static char* linked_white_svg_data = R"(
|
||||
static const char* linked_white_svg_data = R"(
|
||||
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||
@ -183,7 +183,7 @@ static char* linked_white_svg_data = R"(
|
||||
|
||||
)";
|
||||
|
||||
static char* unlinked_svg_data= R"(
|
||||
static const char* unlinked_svg_data= R"(
|
||||
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||
@ -201,7 +201,7 @@ static char* unlinked_svg_data= R"(
|
||||
)";
|
||||
|
||||
|
||||
static char* unlinked_white_svg_data = R"(
|
||||
static const char* unlinked_white_svg_data = R"(
|
||||
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||
|
Loading…
Reference in New Issue
Block a user