ResInsight/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorWidgetCreator.cpp
2024-09-02 15:26:44 +02:00

326 lines
13 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2017- Statoil 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicSummaryPlotEditorWidgetCreator.h"
#include "RicSummaryPlotEditorUi.h"
#include "RimEnsembleCurveSetCollection.h"
#include "RimSummaryCurveCollection.h"
#include "RimSummaryPlot.h"
#include "RiuSummaryCurveDefinitionKeywords.h"
#include "RiuSummaryVectorSelectionUi.h"
#include "RiuSummaryVectorSelectionWidgetCreator.h"
#include "cafPdmUiFieldEditorHandle.h"
#include "cafPdmUiFieldHandle.h"
#include "cafPdmUiGroup.h"
#include "cafPdmUiTreeView.h"
#include "QMinimizePanel.h"
#include <QBoxLayout>
#include <QFrame>
#include <QSplitter>
#include <QTreeView>
#include <memory>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicSummaryPlotEditorWidgetCreator::RicSummaryPlotEditorWidgetCreator( QWidget* parent )
{
m_parentWidget = parent;
m_summaryCurveCreator = std::make_unique<RicSummaryPlotEditorUi>();
setPdmObject( m_summaryCurveCreator.get() );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicSummaryPlotEditorWidgetCreator::~RicSummaryPlotEditorWidgetCreator()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotEditorWidgetCreator::updateFromSummaryPlot( RimSummaryPlot* summaryPlot )
{
m_summaryCurveCreator->updateFromSummaryPlot( summaryPlot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotEditorWidgetCreator::updateFromSummaryMultiPlot( RimSummaryMultiPlot* summaryMultiPlot )
{
m_summaryCurveCreator->updateFromSummaryMultiPlot( summaryMultiPlot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotEditorWidgetCreator::updateFromDefaultSources( const std::vector<caf::PdmObject*> defaultSources )
{
m_summaryCurveCreator->updateFromSummaryPlot( nullptr, defaultSources );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotEditorWidgetCreator::recursivelyConfigureAndUpdateTopLevelUiOrdering( const caf::PdmUiOrdering& topLevelUiOrdering,
const QString& uiConfigName )
{
const std::vector<caf::PdmUiItem*>& topLevelUiItems = topLevelUiOrdering.uiItems();
if ( m_summaryCurveCreator->isCloseButtonPressed() )
{
m_summaryCurveCreator->clearCloseButton();
emit signalCloseButtonPressed();
}
if ( !m_layout ) return;
QWidget* addrWidget = m_summaryCurveCreator->addressSelectionWidget( m_parentWidget );
m_firstRowLayout->addWidget( addrWidget );
caf::PdmUiGroup* appearanceGroup = findGroupByKeyword( topLevelUiItems, RiuSummaryCurveDefinitionKeywords::appearance(), uiConfigName );
auto appearanceGroupBox = createGroupBoxWithContent( appearanceGroup, uiConfigName );
m_lowerLeftLayout->insertWidget( 0, appearanceGroupBox );
caf::PdmUiGroup* nameConfigGroup = findGroupByKeyword( topLevelUiItems, RiuSummaryCurveDefinitionKeywords::nameConfig(), uiConfigName );
auto nameConfigGroupBox = createGroupBoxWithContent( nameConfigGroup, uiConfigName );
m_lowerLeftLayout->insertWidget( 1, nameConfigGroupBox );
QMinimizePanel* curveGroup = getOrCreateCurveTreeGroup();
m_lowerLeftLayout->insertWidget( 2, curveGroup, 1 );
m_lowerLeftLayout->addStretch( 0 );
m_lowerRightLayout->insertWidget( 1, getOrCreatePlotWidget() );
// Fields at bottom of dialog
configureAndUpdateFields( 1, m_bottomFieldLayout, topLevelUiItems, uiConfigName );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RicSummaryPlotEditorWidgetCreator::createWidget( QWidget* parent )
{
QWidget* widget = new QWidget( parent );
m_layout = new QVBoxLayout();
m_layout->setContentsMargins( 5, 5, 5, 5 );
widget->setLayout( m_layout );
QFrame* firstRowFrame = new QFrame( widget );
m_firstRowLayout = new QHBoxLayout;
m_firstRowLayout->setContentsMargins( 0, 0, 0, 0 );
firstRowFrame->setLayout( m_firstRowLayout );
QFrame* secondRowFrame = new QFrame( widget );
m_secondRowLayout = new QHBoxLayout;
m_secondRowLayout->setContentsMargins( 0, 4, 0, 0 );
secondRowFrame->setLayout( m_secondRowLayout );
m_lowerLeftLayout = new QVBoxLayout;
m_lowerLeftLayout->setContentsMargins( 0, 0, 0, 0 );
m_secondRowLayout->addLayout( m_lowerLeftLayout );
m_lowerRightLayout = new QVBoxLayout;
m_lowerRightLayout->setContentsMargins( 0, 0, 0, 0 );
m_secondRowLayout->addLayout( m_lowerRightLayout );
m_firstColumnSplitter = new QSplitter( Qt::Vertical );
m_firstColumnSplitter->setContentsMargins( 0, 0, 0, 0 );
m_firstColumnSplitter->setHandleWidth( 6 );
m_firstColumnSplitter->setStyleSheet( "QSplitter::handle { image: url(:/SplitterH.png); }" );
m_firstColumnSplitter->insertWidget( 0, firstRowFrame );
m_firstColumnSplitter->insertWidget( 1, secondRowFrame );
const int firstRowPixelHeight = 500;
const int secondRowPixelHeight = 300;
m_firstColumnSplitter->setSizes( QList<int>() << firstRowPixelHeight << secondRowPixelHeight );
m_layout->addWidget( m_firstColumnSplitter );
m_bottomFieldLayout = new QHBoxLayout;
m_bottomFieldLayout->setContentsMargins( 0, 2, 0, 0 );
m_layout->addLayout( m_bottomFieldLayout );
m_bottomFieldLayout->insertStretch( 0, 1 );
return widget;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf::PdmUiGroup* RicSummaryPlotEditorWidgetCreator::findGroupByKeyword( const std::vector<caf::PdmUiItem*>& topLevelUiItems,
const QString& keyword,
const QString& uiConfigName )
{
for ( auto uiItem : topLevelUiItems )
{
if ( uiItem->isUiHidden( uiConfigName ) ) continue;
if ( uiItem->isUiGroup() )
{
caf::PdmUiGroup* group = static_cast<caf::PdmUiGroup*>( uiItem );
if ( group->keyword() == keyword )
{
return group;
}
}
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QMinimizePanel* RicSummaryPlotEditorWidgetCreator::getOrCreateCurveTreeGroup()
{
if ( !m_curvesPanel )
{
m_curvesPanel = new QMinimizePanel( widget() );
m_curvesPanel->setTitle( "Curves" );
QVBoxLayout* curvesLayout = new QVBoxLayout( m_curvesPanel->contentFrame() );
m_curveTreeView = new caf::PdmUiTreeView( m_curvesPanel->contentFrame() );
curvesLayout->setStretchFactor( m_curveTreeView, 1 );
curvesLayout->addWidget( m_curveTreeView );
m_curveTreeView->treeView()->setHeaderHidden( true );
}
if ( m_summaryCurveCreator )
{
RimSummaryPlot* previewPlot = m_summaryCurveCreator->previewPlot();
m_curveTreeView->setPdmItem( previewPlot );
m_curveTreeView->setUiConfigurationName( RicSummaryPlotEditorUi::CONFIGURATION_NAME );
m_curveTreeView->setExpanded( previewPlot->summaryCurveCollection(), true );
m_curveTreeView->setExpanded( previewPlot->ensembleCurveSetCollection(), true );
}
return m_curvesPanel;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RicSummaryPlotEditorWidgetCreator::getOrCreatePlotWidget()
{
if ( m_summaryCurveCreator )
{
auto widget = m_summaryCurveCreator->previewPlot()->createPlotWidget( this->widget() );
widget->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
return widget;
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotEditorWidgetCreator::configureAndUpdateFields( int widgetStartIndex,
QBoxLayout* layout,
const std::vector<caf::PdmUiItem*>& uiItems,
const QString& uiConfigName )
{
int currentWidgetIndex = widgetStartIndex;
for ( size_t i = 0; i < uiItems.size(); ++i )
{
if ( uiItems[i]->isUiHidden( uiConfigName ) ) continue;
if ( uiItems[i]->isUiGroup() ) continue;
{
caf::PdmUiFieldHandle* field = dynamic_cast<caf::PdmUiFieldHandle*>( uiItems[i] );
caf::PdmUiFieldEditorHandle* fieldEditor = findOrCreateFieldEditor( widget(), field, uiConfigName );
if ( fieldEditor )
{
// Place the widget(s) into the correct parent and layout
QWidget* fieldCombinedWidget = fieldEditor->combinedWidget();
if ( fieldCombinedWidget )
{
fieldCombinedWidget->setParent( widget() );
layout->insertWidget( currentWidgetIndex++, fieldCombinedWidget );
}
else
{
caf::PdmUiItemInfo::LabelPosType labelPos = field->uiLabelPosition( uiConfigName );
QWidget* fieldEditorWidget = fieldEditor->editorWidget();
if ( labelPos != caf::PdmUiItemInfo::HIDDEN )
{
QWidget* fieldLabelWidget = fieldEditor->labelWidget();
if ( fieldLabelWidget )
{
fieldLabelWidget->setParent( widget() );
layout->insertWidget( currentWidgetIndex++, fieldLabelWidget );
fieldLabelWidget->show();
}
}
else
{
QWidget* fieldLabelWidget = fieldEditor->labelWidget();
if ( fieldLabelWidget ) fieldLabelWidget->hide();
}
if ( fieldEditorWidget )
{
fieldEditorWidget->setParent( widget() ); // To make sure this widget has the current
// group box as parent.
layout->insertWidget( currentWidgetIndex++, fieldEditorWidget );
}
}
fieldEditor->updateUi( uiConfigName );
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QMinimizePanel* RicSummaryPlotEditorWidgetCreator::createGroupBoxWithContent( caf::PdmUiGroup* group, const QString& uiConfigName )
{
QMinimizePanel* groupBox = findOrCreateGroupBox( widget(), group, uiConfigName );
recursivelyConfigureAndUpdateUiOrderingInGridLayout( *group, groupBox->contentFrame(), uiConfigName );
return groupBox;
}