Summary multiplot improvements (#8598)

* Create multi summary plot from summary plot(s)
* Rearrange multi summary plot properties
* Enable source stepping toolbar for multi summary plot
* Automatically activate new summary plot when creating from data sources -> data vector tree
* Enable global key controls for switching data in summary and multi summary plots
* Update tooltip texts for summary plot toolbar
This commit is contained in:
jonjenssen 2022-03-04 10:52:17 +01:00 committed by GitHub
parent a32dda2e65
commit abff06d2d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 793 additions and 422 deletions

View File

@ -125,6 +125,7 @@
#include <QDir> #include <QDir>
#include <QErrorMessage> #include <QErrorMessage>
#include <QGridLayout> #include <QGridLayout>
#include <QKeyEvent>
#include <QMdiSubWindow> #include <QMdiSubWindow>
#include <QMessageBox> #include <QMessageBox>
#include <QProcessEnvironment> #include <QProcessEnvironment>
@ -1681,13 +1682,24 @@ bool RiaGuiApplication::notify( QObject* receiver, QEvent* event )
"unstable and will probably crash soon." ); "unstable and will probably crash soon." );
} }
bool done = true; bool done = false;
try try
{ {
done = QApplication::notify( receiver, event ); if ( event->type() == QEvent::KeyPress )
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>( event );
RimPlotWindow* plot = dynamic_cast<RimPlotWindow*>( activePlotWindow() );
if ( plot ) done = plot->handleGlobalKeyEvent( keyEvent );
}
if ( !done )
{
done = QApplication::notify( receiver, event );
}
} }
catch ( const std::bad_alloc& ) catch ( const std::bad_alloc& )
{ {
done = true;
if ( memoryExhaustedBox ) memoryExhaustedBox->exec(); if ( memoryExhaustedBox ) memoryExhaustedBox->exec();
std::cout << "ResInsight: Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now " std::cout << "ResInsight: Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now "
"unstable " "unstable "

View File

@ -134,6 +134,8 @@ public:
void showFormattedTextInMessageBoxOrConsole( const QString& errMsg ) override; void showFormattedTextInMessageBoxOrConsole( const QString& errMsg ) override;
protected: protected:
bool notify( QObject* receiver, QEvent* event ) override;
// Protected RiaApplication overrides // Protected RiaApplication overrides
void invokeProcessEvents( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) override; void invokeProcessEvents( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) override;
void onFileSuccessfullyLoaded( const QString& fileName, RiaDefines::ImportFileType fileType ) override; void onFileSuccessfullyLoaded( const QString& fileName, RiaDefines::ImportFileType fileType ) override;
@ -159,8 +161,6 @@ private:
void storeTreeViewState(); void storeTreeViewState();
bool notify( QObject*, QEvent* ) override;
private slots: private slots:
void slotWorkerProcessFinished( int exitCode, QProcess::ExitStatus exitStatus ); void slotWorkerProcessFinished( int exitCode, QProcess::ExitStatus exitStatus );
void onLastWindowClosed(); void onLastWindowClosed();

View File

@ -3,6 +3,7 @@ set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.h ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.h
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFromDataVectorFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFromDataVectorFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFromDataVectorFeature.h
) )
set(SOURCE_GROUP_SOURCE_FILES set(SOURCE_GROUP_SOURCE_FILES
@ -10,6 +11,7 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.cpp ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.cpp
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFromDataVectorFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFromDataVectorFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFromDataVectorFeature.cpp
) )
list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})

View File

@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2021 Equinor ASA // Copyright (C) 2022 Equinor ASA
// //
// ResInsight is free software: you can redistribute it and/or modify // ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
@ -19,8 +19,10 @@
#include "RicNewSummaryMultiPlotFeature.h" #include "RicNewSummaryMultiPlotFeature.h"
#include "RimMultiPlotCollection.h" #include "RimMultiPlotCollection.h"
#include "RimPlot.h"
#include "RimSummaryMultiPlot.h" #include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h"
#include "RicSummaryPlotBuilder.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include "cvfAssert.h" #include "cvfAssert.h"
@ -34,17 +36,7 @@ RICF_SOURCE_INIT( RicNewSummaryMultiPlotFeature, "RicNewSummaryMultiPlotFeature"
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RicNewSummaryMultiPlotFeature::RicNewSummaryMultiPlotFeature() RicNewSummaryMultiPlotFeature::RicNewSummaryMultiPlotFeature()
{ {
} CAF_PDM_InitFieldNoDefault( &m_plots, "plots", "Plots" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
{
std::vector<RimSummaryPlot*> plots;
RimSummaryMultiPlot::createAndAppendMultiPlot( plots );
return caf::PdmScriptResponse();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -52,16 +44,12 @@ caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicNewSummaryMultiPlotFeature::isCommandEnabled() bool RicNewSummaryMultiPlotFeature::isCommandEnabled()
{ {
RimMultiPlotCollection* objToFind = nullptr; auto plots = selectedPlots();
auto pdmUiItem = caf::SelectionManager::instance()->selectedItem(); std::vector<caf::PdmUiItem*> selectedUiItems;
auto objHandle = dynamic_cast<caf::PdmObjectHandle*>( pdmUiItem ); caf::SelectionManager::instance()->selectedItems( selectedUiItems );
if ( objHandle )
{
objHandle->firstAncestorOrThisOfType( objToFind );
}
return ( objToFind != nullptr ); return !plots.empty() && plots.size() == selectedUiItems.size();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -69,6 +57,12 @@ bool RicNewSummaryMultiPlotFeature::isCommandEnabled()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFeature::onActionTriggered( bool isChecked ) void RicNewSummaryMultiPlotFeature::onActionTriggered( bool isChecked )
{ {
m_plots.v().clear();
auto plots = selectedPlots();
for ( RimPlot* plot : plots )
{
m_plots.v().push_back( reinterpret_cast<uintptr_t>( plot ) );
}
execute(); execute();
} }
@ -77,6 +71,47 @@ void RicNewSummaryMultiPlotFeature::onActionTriggered( bool isChecked )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFeature::setupActionLook( QAction* actionToSetup ) void RicNewSummaryMultiPlotFeature::setupActionLook( QAction* actionToSetup )
{ {
actionToSetup->setText( "Create Summary Multi Plot" ); actionToSetup->setText( "Create Summary Multi Plot from Selected Plots" );
actionToSetup->setIcon( QIcon( ":/MultiPlot16x16.png" ) ); actionToSetup->setIcon( QIcon( ":/MultiPlot16x16.png" ) );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryPlot*> RicNewSummaryMultiPlotFeature::selectedPlots()
{
std::vector<caf::PdmUiItem*> uiItems;
caf::SelectionManager::instance()->selectedItems( uiItems );
std::vector<RimSummaryPlot*> plots;
for ( caf::PdmUiItem* uiItem : uiItems )
{
RimSummaryPlot* summaryPlot = dynamic_cast<RimSummaryPlot*>( uiItem );
if ( summaryPlot )
{
plots.push_back( summaryPlot );
}
}
return plots;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
{
if ( !m_plots().empty() )
{
std::vector<RimSummaryPlot*> plots;
for ( auto ptr : m_plots() )
{
plots.push_back( reinterpret_cast<RimSummaryPlot*>( ptr ) );
}
auto copyOfPlots = RicSummaryPlotBuilder::duplicateSummaryPlots( plots );
RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( copyOfPlots );
}
return caf::PdmScriptResponse();
}

View File

@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2021 Equinor ASA // Copyright (C) 2022 Equinor ASA
// //
// ResInsight is free software: you can redistribute it and/or modify // ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
@ -25,7 +25,7 @@
#include <vector> #include <vector>
class RimPlot; class RimSummaryPlot;
//================================================================================================== //==================================================================================================
/// ///
@ -43,4 +43,9 @@ protected:
bool isCommandEnabled() override; bool isCommandEnabled() override;
void onActionTriggered( bool isChecked ) override; void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override; void setupActionLook( QAction* actionToSetup ) override;
private:
static std::vector<RimSummaryPlot*> selectedPlots();
caf::PdmField<std::vector<uint64_t>> m_plots;
}; };

View File

@ -0,0 +1,115 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicNewSummaryMultiPlotFromDataVectorFeature.h"
#include "RiaSummaryTools.h"
#include "RimSummaryAddress.h"
#include "RimSummaryPlot.h"
#include "RimSummaryPlotCollection.h"
#include "RicSummaryPlotBuilder.h"
#include "RifEclipseSummaryAddress.h"
#include "cafSelectionManagerTools.h"
#include "cvfAssert.h"
#include <QAction>
CAF_CMD_SOURCE_INIT( RicNewSummaryMultiPlotFromDataVectorFeature, "RicNewSummaryMultiPlotFromDataVectorFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicNewSummaryMultiPlotFromDataVectorFeature::isCommandEnabled()
{
std::vector<caf::PdmUiItem*> selectedItems;
caf::SelectionManager::instance()->selectedItems( selectedItems );
std::vector<RimSummaryAddress*> selectedAddressItems = caf::selectedObjectsByType<RimSummaryAddress*>();
unsigned int nEnsembles = 0;
for ( auto adr : selectedAddressItems )
{
if ( adr->isEnsemble() ) nEnsembles++;
}
bool bOk = ( selectedAddressItems.size() > 0 );
if ( nEnsembles > 0 )
{
bOk = bOk && ( nEnsembles == selectedItems.size() );
}
bOk = bOk && ( selectedAddressItems.size() == selectedItems.size() );
return bOk;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFromDataVectorFeature::onActionTriggered( bool isChecked )
{
std::vector<RimSummaryAddress*> selectedAddressItems = caf::selectedObjectsByType<RimSummaryAddress*>();
std::set<int> caseIds;
std::set<int> ensembleIds;
std::vector<RimSummaryCase*> selectedCases;
std::set<RifEclipseSummaryAddress> eclipseAddresses;
std::vector<RimSummaryCaseCollection*> selectedEnsembles;
bool isEnsemble = false;
for ( auto adr : selectedAddressItems )
{
eclipseAddresses.insert( adr->address() );
caseIds.insert( adr->caseId() );
ensembleIds.insert( adr->ensembleId() );
isEnsemble = isEnsemble || adr->isEnsemble();
}
if ( isEnsemble )
{
for ( auto id : ensembleIds )
{
selectedEnsembles.push_back( RiaSummaryTools::ensembleById( id ) );
}
}
else
{
for ( auto id : caseIds )
{
selectedCases.push_back( RiaSummaryTools::summaryCaseById( id ) );
}
}
auto newPlot = RicSummaryPlotBuilder::createPlot( eclipseAddresses, selectedCases, selectedEnsembles );
std::vector<RimSummaryPlot*> plots{ newPlot };
RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( plots );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFromDataVectorFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setText( "New Multi Summary Plot" );
actionToSetup->setIcon( QIcon( ":/SummaryPlotLight16x16.png" ) );
}

View File

@ -0,0 +1,37 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RicfCommandObject.h"
#include "cafCmdFeature.h"
//==================================================================================================
///
//==================================================================================================
class RicNewSummaryMultiPlotFromDataVectorFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;
protected:
// Overrides
bool isCommandEnabled() override;
void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override;
};

View File

@ -27,6 +27,8 @@
#include "RifEclipseSummaryAddress.h" #include "RifEclipseSummaryAddress.h"
#include "RiuPlotMainWindowTools.h"
#include "cafSelectionManagerTools.h" #include "cafSelectionManagerTools.h"
#include "cvfAssert.h" #include "cvfAssert.h"
@ -108,6 +110,8 @@ void RicNewSummaryPlotFromDataVectorFeature::onActionTriggered( bool isChecked )
newPlot->loadDataAndUpdate(); newPlot->loadDataAndUpdate();
plotCollection->updateConnectedEditors(); plotCollection->updateConnectedEditors();
RiuPlotMainWindowTools::selectAsCurrentItem( newPlot, true );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -36,6 +36,8 @@
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseCollection.h"
#include "RimSummaryCurve.h" #include "RimSummaryCurve.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RiuPlotMainWindowTools.h" #include "RiuPlotMainWindowTools.h"
@ -292,6 +294,27 @@ std::vector<RimPlot*> RicSummaryPlotBuilder::duplicatePlots( const std::vector<R
return plots; return plots;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryPlot*> RicSummaryPlotBuilder::duplicateSummaryPlots( const std::vector<RimSummaryPlot*>& sourcePlots )
{
std::vector<RimSummaryPlot*> plots;
for ( auto plot : sourcePlots )
{
auto copy =
dynamic_cast<RimSummaryPlot*>( plot->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) );
if ( copy )
{
plots.push_back( copy );
}
}
return plots;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -335,6 +358,49 @@ void RicSummaryPlotBuilder::appendPlotsToMultiPlot( RimMultiPlot* multiPlot, con
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlot* RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( const std::vector<RimSummaryPlot*>& plots )
{
RimProject* project = RimProject::current();
auto* plotCollection = project->mainPlotCollection()->summaryMultiPlotCollection();
auto* plotWindow = new RimSummaryMultiPlot();
plotWindow->setMultiPlotTitle( QString( "Multi Summary Plot %1" ).arg( plotCollection->multiPlots().size() + 1 ) );
plotWindow->setAsPlotMdiWindow();
plotCollection->addMultiSummaryPlot( plotWindow );
appendPlotsToSummaryMultiPlot( plotWindow, plots );
plotCollection->updateAllRequiredEditors();
plotWindow->loadDataAndUpdate();
RiuPlotMainWindowTools::selectAsCurrentItem( plotWindow, true );
plotWindow->updateAllRequiredEditors();
return plotWindow;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotBuilder::appendPlotsToSummaryMultiPlot( RimSummaryMultiPlot* multiPlot,
const std::vector<RimSummaryPlot*>& plots )
{
for ( auto plot : plots )
{
plot->revokeMdiWindowStatus();
multiPlot->addPlot( plot );
plot->resolveReferencesRecursively();
plot->setShowWindow( true );
plot->loadDataAndUpdate();
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -26,6 +26,7 @@ class RimSummaryCaseCollection;
class RimSummaryPlot; class RimSummaryPlot;
class RimEnsembleCurveSet; class RimEnsembleCurveSet;
class RimSummaryCurve; class RimSummaryCurve;
class RimSummaryMultiPlot;
namespace caf namespace caf
{ {
@ -67,9 +68,14 @@ public:
static RimEnsembleCurveSet* createCurveSet( RimSummaryCaseCollection* ensemble, const RifEclipseSummaryAddress& addr ); static RimEnsembleCurveSet* createCurveSet( RimSummaryCaseCollection* ensemble, const RifEclipseSummaryAddress& addr );
static RimSummaryCurve* createCurve( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& addr ); static RimSummaryCurve* createCurve( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& addr );
static std::vector<RimPlot*> duplicatePlots( const std::vector<RimPlot*>& plots ); static std::vector<RimPlot*> duplicatePlots( const std::vector<RimPlot*>& plots );
static RimMultiPlot* createAndAppendMultiPlot( const std::vector<RimPlot*>& plots ); static std::vector<RimSummaryPlot*> duplicateSummaryPlots( const std::vector<RimSummaryPlot*>& plots );
static void appendPlotsToMultiPlot( RimMultiPlot* multiPlot, const std::vector<RimPlot*>& plots );
static RimMultiPlot* createAndAppendMultiPlot( const std::vector<RimPlot*>& plots );
static void appendPlotsToMultiPlot( RimMultiPlot* multiPlot, const std::vector<RimPlot*>& plots );
static RimSummaryMultiPlot* createAndAppendSummaryMultiPlot( const std::vector<RimSummaryPlot*>& plots );
static void appendPlotsToSummaryMultiPlot( RimSummaryMultiPlot* multiPlot, const std::vector<RimSummaryPlot*>& plots );
static RimSummaryPlot* createPlot( const std::set<RifEclipseSummaryAddress>& addresses, static RimSummaryPlot* createPlot( const std::set<RifEclipseSummaryAddress>& addresses,
const std::vector<RimSummaryCase*>& summaryCases, const std::vector<RimSummaryCase*>& summaryCases,

View File

@ -68,7 +68,7 @@ public:
} }
} }
void addPlot( RimPlotType* plot ) { insertPlot( plot, plotCount() ); } virtual void addPlot( RimPlotType* plot ) { insertPlot( plot, plotCount() ); }
virtual void insertPlot( RimPlotType* plot, size_t index ) = 0; virtual void insertPlot( RimPlotType* plot, size_t index ) = 0;
virtual void removePlot( RimPlotType* plot ) = 0; virtual void removePlot( RimPlotType* plot ) = 0;
void removeRimPlot( RimPlot* rimPlot ) override void removeRimPlot( RimPlot* rimPlot ) override

View File

@ -1065,6 +1065,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
menuBuilder << "RicNewDerivedEnsembleFeature"; menuBuilder << "RicNewDerivedEnsembleFeature";
menuBuilder << "RicNewSummaryPlotFeature"; menuBuilder << "RicNewSummaryPlotFeature";
menuBuilder << "RicNewDefaultSummaryPlotFeature"; menuBuilder << "RicNewDefaultSummaryPlotFeature";
menuBuilder << "RicNewSummaryMultiPlotFeature";
menuBuilder << "RicNewSummaryCrossPlotFeature"; menuBuilder << "RicNewSummaryCrossPlotFeature";
menuBuilder << "RicSummaryCurveSwitchAxisFeature"; menuBuilder << "RicSummaryCurveSwitchAxisFeature";
menuBuilder << "RicNewDerivedSummaryFeature"; menuBuilder << "RicNewDerivedSummaryFeature";
@ -1104,7 +1105,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
menuBuilder << "RicCloseObservedDataFeature"; menuBuilder << "RicCloseObservedDataFeature";
menuBuilder << "RicNewMultiPlotFeature"; menuBuilder << "RicNewMultiPlotFeature";
menuBuilder << "RicNewSummaryMultiPlotFeature";
// Work in progress -- End // Work in progress -- End
@ -1189,6 +1189,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
else if ( dynamic_cast<RimSummaryAddress*>( firstUiItem ) ) else if ( dynamic_cast<RimSummaryAddress*>( firstUiItem ) )
{ {
menuBuilder << "RicNewSummaryPlotFromDataVectorFeature"; menuBuilder << "RicNewSummaryPlotFromDataVectorFeature";
menuBuilder << "RicNewSummaryMultiPlotFromDataVectorFeature";
} }
#ifdef USE_ODB_API #ifdef USE_ODB_API
else if ( dynamic_cast<RimWellIASettings*>( firstUiItem ) ) else if ( dynamic_cast<RimWellIASettings*>( firstUiItem ) )

View File

@ -38,6 +38,7 @@
#include "RimStimPlanModelPlotCollection.h" #include "RimStimPlanModelPlotCollection.h"
#include "RimSummaryAddress.h" #include "RimSummaryAddress.h"
#include "RimSummaryCrossPlotCollection.h" #include "RimSummaryCrossPlotCollection.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RimVfpPlotCollection.h" #include "RimVfpPlotCollection.h"
#include "RimViewWindow.h" #include "RimViewWindow.h"
@ -82,6 +83,9 @@ RimMainPlotCollection::RimMainPlotCollection()
CAF_PDM_InitFieldNoDefault( &m_summaryPlotCollection, "SummaryPlotCollection", "Summary Plots" ); CAF_PDM_InitFieldNoDefault( &m_summaryPlotCollection, "SummaryPlotCollection", "Summary Plots" );
m_summaryPlotCollection.uiCapability()->setUiTreeHidden( true ); m_summaryPlotCollection.uiCapability()->setUiTreeHidden( true );
CAF_PDM_InitFieldNoDefault( &m_summaryMultiPlotCollection, "SummaryMultiPlotCollection", "Multi Summary Plots" );
m_summaryMultiPlotCollection.uiCapability()->setUiTreeHidden( true );
CAF_PDM_InitFieldNoDefault( &m_analysisPlotCollection, "AnalysisPlotCollection", "Analysis Plots" ); CAF_PDM_InitFieldNoDefault( &m_analysisPlotCollection, "AnalysisPlotCollection", "Analysis Plots" );
m_analysisPlotCollection.uiCapability()->setUiTreeHidden( true ); m_analysisPlotCollection.uiCapability()->setUiTreeHidden( true );
@ -122,6 +126,7 @@ RimMainPlotCollection::RimMainPlotCollection()
m_rftPlotCollection = new RimRftPlotCollection(); m_rftPlotCollection = new RimRftPlotCollection();
m_pltPlotCollection = new RimPltPlotCollection(); m_pltPlotCollection = new RimPltPlotCollection();
m_summaryPlotCollection = new RimSummaryPlotCollection(); m_summaryPlotCollection = new RimSummaryPlotCollection();
m_summaryMultiPlotCollection = new RimSummaryMultiPlotCollection();
m_summaryCrossPlotCollection = new RimSummaryCrossPlotCollection(); m_summaryCrossPlotCollection = new RimSummaryCrossPlotCollection();
m_flowPlotCollection = new RimFlowPlotCollection(); m_flowPlotCollection = new RimFlowPlotCollection();
m_gridCrossPlotCollection = new RimGridCrossPlotCollection; m_gridCrossPlotCollection = new RimGridCrossPlotCollection;
@ -193,6 +198,14 @@ RimSummaryPlotCollection* RimMainPlotCollection::summaryPlotCollection() const
return m_summaryPlotCollection(); return m_summaryPlotCollection();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlotCollection* RimMainPlotCollection::summaryMultiPlotCollection() const
{
return m_summaryMultiPlotCollection();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -403,6 +416,7 @@ std::vector<RimPlotCollection*> RimMainPlotCollection::allPlotCollections() cons
std::vector<RimPlotCollection*> plotCollections; std::vector<RimPlotCollection*> plotCollections;
plotCollections.push_back( wellLogPlotCollection() ); plotCollections.push_back( wellLogPlotCollection() );
plotCollections.push_back( summaryPlotCollection() ); plotCollections.push_back( summaryPlotCollection() );
plotCollections.push_back( summaryMultiPlotCollection() );
plotCollections.push_back( summaryCrossPlotCollection() ); plotCollections.push_back( summaryCrossPlotCollection() );
plotCollections.push_back( gridCrossPlotCollection() ); plotCollections.push_back( gridCrossPlotCollection() );
plotCollections.push_back( analysisPlotCollection() ); plotCollections.push_back( analysisPlotCollection() );

View File

@ -33,6 +33,7 @@ class RimRftPlotCollection;
class RimPltPlotCollection; class RimPltPlotCollection;
class RimGridCrossPlotCollection; class RimGridCrossPlotCollection;
class RimMultiPlotCollection; class RimMultiPlotCollection;
class RimSummaryMultiPlotCollection;
class RimSummaryPlotCollection; class RimSummaryPlotCollection;
class RimSummaryCrossPlotCollection; class RimSummaryCrossPlotCollection;
class RimSummaryPlot; class RimSummaryPlot;
@ -65,6 +66,7 @@ public:
RimRftPlotCollection* rftPlotCollection() const; RimRftPlotCollection* rftPlotCollection() const;
RimPltPlotCollection* pltPlotCollection() const; RimPltPlotCollection* pltPlotCollection() const;
RimSummaryPlotCollection* summaryPlotCollection() const; RimSummaryPlotCollection* summaryPlotCollection() const;
RimSummaryMultiPlotCollection* summaryMultiPlotCollection() const;
RimSummaryCrossPlotCollection* summaryCrossPlotCollection() const; RimSummaryCrossPlotCollection* summaryCrossPlotCollection() const;
RimAnalysisPlotCollection* analysisPlotCollection() const; RimAnalysisPlotCollection* analysisPlotCollection() const;
RimCorrelationPlotCollection* correlationPlotCollection() const; RimCorrelationPlotCollection* correlationPlotCollection() const;
@ -105,6 +107,7 @@ private:
caf::PdmChildField<RimRftPlotCollection*> m_rftPlotCollection; caf::PdmChildField<RimRftPlotCollection*> m_rftPlotCollection;
caf::PdmChildField<RimPltPlotCollection*> m_pltPlotCollection; caf::PdmChildField<RimPltPlotCollection*> m_pltPlotCollection;
caf::PdmChildField<RimSummaryPlotCollection*> m_summaryPlotCollection; caf::PdmChildField<RimSummaryPlotCollection*> m_summaryPlotCollection;
caf::PdmChildField<RimSummaryMultiPlotCollection*> m_summaryMultiPlotCollection;
caf::PdmChildField<RimSummaryCrossPlotCollection*> m_summaryCrossPlotCollection; caf::PdmChildField<RimSummaryCrossPlotCollection*> m_summaryCrossPlotCollection;
caf::PdmChildField<RimAnalysisPlotCollection*> m_analysisPlotCollection; caf::PdmChildField<RimAnalysisPlotCollection*> m_analysisPlotCollection;
caf::PdmChildField<RimCorrelationPlotCollection*> m_correlationPlotCollection; caf::PdmChildField<RimCorrelationPlotCollection*> m_correlationPlotCollection;

View File

@ -757,22 +757,9 @@ void RimMultiPlot::uiOrderingForMultiPlotLayout( QString uiConfigName, caf::PdmU
uiOrdering.add( &m_showPlotWindowTitle ); uiOrdering.add( &m_showPlotWindowTitle );
uiOrdering.add( &m_plotWindowTitle ); uiOrdering.add( &m_plotWindowTitle );
uiOrdering.add( &m_showIndividualPlotTitles ); uiOrdering.add( &m_showIndividualPlotTitles );
RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, uiOrdering );
uiOrdering.add( &m_subTitleFontSize ); uiOrdering.add( &m_subTitleFontSize );
uiOrdering.add( &m_columnCount );
uiOrdering.add( &m_rowsPerPage );
uiOrdering.add( &m_majorTickmarkCount );
}
//-------------------------------------------------------------------------------------------------- RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, uiOrdering );
///
//--------------------------------------------------------------------------------------------------
void RimMultiPlot::uiOrderingForSummaryMultiPlot( caf::PdmUiOrdering& uiOrdering ) const
{
uiOrdering.add( &m_showPlotWindowTitle );
uiOrdering.add( &m_plotWindowTitle );
uiOrdering.add( &m_showIndividualPlotTitles );
uiOrdering.add( &m_subTitleFontSize );
uiOrdering.add( &m_columnCount ); uiOrdering.add( &m_columnCount );
uiOrdering.add( &m_rowsPerPage ); uiOrdering.add( &m_rowsPerPage );
uiOrdering.add( &m_majorTickmarkCount ); uiOrdering.add( &m_majorTickmarkCount );

View File

@ -79,7 +79,6 @@ public:
void insertPlots( const std::vector<RimPlot*>& plots ); void insertPlots( const std::vector<RimPlot*>& plots );
void deleteAllPlots() override; void deleteAllPlots() override;
void uiOrderingForSummaryMultiPlot( caf::PdmUiOrdering& uiOrdering ) const;
size_t plotCount() const override; size_t plotCount() const override;
size_t plotIndex( const RimPlot* plot ) const; size_t plotIndex( const RimPlot* plot ) const;
@ -140,11 +139,12 @@ protected:
void updateZoom(); void updateZoom();
void recreatePlotWidgets(); void recreatePlotWidgets();
virtual void updatePlotWindowTitle();
private: private:
void cleanupBeforeClose(); void cleanupBeforeClose();
void doUpdateLayout() override; void doUpdateLayout() override;
void updateSubPlotNames(); void updateSubPlotNames();
void updatePlotWindowTitle();
void doRenderWindowContent( QPaintDevice* paintDevice ) override; void doRenderWindowContent( QPaintDevice* paintDevice ) override;
void onPlotAdditionOrRemoval(); void onPlotAdditionOrRemoval();
void onPlotsReordered( const caf::SignalEmitter* emitter ); void onPlotsReordered( const caf::SignalEmitter* emitter );

View File

@ -19,7 +19,6 @@
#include "RimMultiPlot.h" #include "RimMultiPlot.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimSummaryMultiPlot.h"
#include "cafPdmFieldReorderCapability.h" #include "cafPdmFieldReorderCapability.h"
@ -35,10 +34,6 @@ RimMultiPlotCollection::RimMultiPlotCollection()
CAF_PDM_InitFieldNoDefault( &m_multiPlots, "MultiPlots", "Plots Reports" ); CAF_PDM_InitFieldNoDefault( &m_multiPlots, "MultiPlots", "Plots Reports" );
m_multiPlots.uiCapability()->setUiTreeHidden( true ); m_multiPlots.uiCapability()->setUiTreeHidden( true );
caf::PdmFieldReorderCapability::addToField( &m_multiPlots ); caf::PdmFieldReorderCapability::addToField( &m_multiPlots );
CAF_PDM_InitFieldNoDefault( &m_multiSummaryPlots, "MultiSummaryPlots", "Multi Summary Plots" );
m_multiSummaryPlots.uiCapability()->setUiTreeHidden( true );
caf::PdmFieldReorderCapability::addToField( &m_multiSummaryPlots );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -54,7 +49,6 @@ RimMultiPlotCollection::~RimMultiPlotCollection()
void RimMultiPlotCollection::deleteAllPlots() void RimMultiPlotCollection::deleteAllPlots()
{ {
m_multiPlots.deleteAllChildObjects(); m_multiPlots.deleteAllChildObjects();
m_multiSummaryPlots.deleteAllChildObjects();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -65,18 +59,6 @@ std::vector<RimMultiPlot*> RimMultiPlotCollection::multiPlots() const
return m_multiPlots.childObjects(); return m_multiPlots.childObjects();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMultiPlot* RimMultiPlotCollection::createMultiPlot()
{
RimMultiPlot* plot = new RimMultiPlot();
plot->setAsPlotMdiWindow();
addMultiPlot( plot );
return plot;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -85,14 +67,6 @@ void RimMultiPlotCollection::addMultiPlot( RimMultiPlot* plot )
m_multiPlots().push_back( plot ); m_multiPlots().push_back( plot );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMultiPlotCollection::addMultiSummaryPlot( RimSummaryMultiPlot* plot )
{
m_multiSummaryPlots().push_back( plot );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -100,9 +74,6 @@ void RimMultiPlotCollection::loadDataAndUpdateAllPlots()
{ {
for ( const auto& p : m_multiPlots.childObjects() ) for ( const auto& p : m_multiPlots.childObjects() )
p->loadDataAndUpdate(); p->loadDataAndUpdate();
for ( const auto& p : m_multiSummaryPlots.childObjects() )
p->loadDataAndUpdate();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -110,5 +81,5 @@ void RimMultiPlotCollection::loadDataAndUpdateAllPlots()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
size_t RimMultiPlotCollection::plotCount() const size_t RimMultiPlotCollection::plotCount() const
{ {
return m_multiPlots.size() + m_multiSummaryPlots.size(); return m_multiPlots.size();
} }

View File

@ -23,7 +23,6 @@
#include "cafPdmObject.h" #include "cafPdmObject.h"
class RimMultiPlot; class RimMultiPlot;
class RimSummaryMultiPlot;
//================================================================================================== //==================================================================================================
/// ///
@ -42,11 +41,9 @@ public:
size_t plotCount() const override; size_t plotCount() const override;
std::vector<RimMultiPlot*> multiPlots() const; std::vector<RimMultiPlot*> multiPlots() const;
RimMultiPlot* createMultiPlot();
void addMultiPlot( RimMultiPlot* plot ); void addMultiPlot( RimMultiPlot* plot );
void addMultiSummaryPlot( RimSummaryMultiPlot* plot );
private: private:
caf::PdmChildArrayField<RimMultiPlot*> m_multiPlots; caf::PdmChildArrayField<RimMultiPlot*> m_multiPlots;
caf::PdmChildArrayField<RimSummaryMultiPlot*> m_multiSummaryPlots;
}; };

View File

@ -336,3 +336,11 @@ void RimPlotWindow::assignIdIfNecessary()
RimProject::current()->assignPlotIdToPlotWindow( this ); RimProject::current()->assignPlotIdToPlotWindow( this );
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimPlotWindow::handleGlobalKeyEvent( QKeyEvent* keyEvent )
{
return false;
}

View File

@ -75,6 +75,8 @@ public:
void renderWindowContent( QPaintDevice* painter ); void renderWindowContent( QPaintDevice* painter );
QPageLayout pageLayout() const; QPageLayout pageLayout() const;
virtual bool handleGlobalKeyEvent( QKeyEvent* keyEvent );
protected: protected:
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
@ -82,6 +84,7 @@ protected:
bool* useOptionsOnly ) override; bool* useOptionsOnly ) override;
void uiOrderingForPlotLayout( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); void uiOrderingForPlotLayout( QString uiConfigName, caf::PdmUiOrdering& uiOrdering );
void updateWindowVisibility(); void updateWindowVisibility();
private: private:

View File

@ -76,6 +76,7 @@
#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseCollection.h"
#include "RimSummaryCaseMainCollection.h" #include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCrossPlotCollection.h" #include "RimSummaryCrossPlotCollection.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RimSurfaceCollection.h" #include "RimSurfaceCollection.h"
#include "RimTools.h" #include "RimTools.h"
@ -1377,6 +1378,11 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q
uiTreeOrdering.add( mainPlotCollection->summaryPlotCollection() ); uiTreeOrdering.add( mainPlotCollection->summaryPlotCollection() );
} }
if ( mainPlotCollection->summaryMultiPlotCollection() )
{
uiTreeOrdering.add( mainPlotCollection->summaryMultiPlotCollection() );
}
if ( mainPlotCollection->analysisPlotCollection() ) if ( mainPlotCollection->analysisPlotCollection() )
{ {
uiTreeOrdering.add( mainPlotCollection->analysisPlotCollection() ); uiTreeOrdering.add( mainPlotCollection->analysisPlotCollection() );

View File

@ -35,7 +35,7 @@ public:
RimVfpPlotCollection(); RimVfpPlotCollection();
~RimVfpPlotCollection() override; ~RimVfpPlotCollection() override;
void addPlot( RimVfpPlot* newPlot ); void addPlot( RimVfpPlot* newPlot ) override;
std::vector<RimVfpPlot*> plots() const override; std::vector<RimVfpPlot*> plots() const override;
void deleteAllChildObjects(); void deleteAllChildObjects();

View File

@ -43,6 +43,8 @@ set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RimSummaryNameHelper.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryNameHelper.h
${CMAKE_CURRENT_LIST_DIR}/RimMultipleSummaryPlotNameHelper.h ${CMAKE_CURRENT_LIST_DIR}/RimMultipleSummaryPlotNameHelper.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryMultiPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotControls.h
) )
set(SOURCE_GROUP_SOURCE_FILES set(SOURCE_GROUP_SOURCE_FILES
@ -90,6 +92,8 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RimSummaryNameHelper.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryNameHelper.cpp
${CMAKE_CURRENT_LIST_DIR}/RimMultipleSummaryPlotNameHelper.cpp ${CMAKE_CURRENT_LIST_DIR}/RimMultipleSummaryPlotNameHelper.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryMultiPlotCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotControls.cpp
) )
list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})

View File

@ -29,6 +29,7 @@
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseCollection.h"
#include "RimSummaryCurve.h" #include "RimSummaryCurve.h"
#include "RimSummaryPlotControls.h"
#include "RimSummaryMultiPlot.h" #include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h" #include "RimSummaryPlot.h"
@ -51,20 +52,8 @@ RimSummaryMultiPlot::RimSummaryMultiPlot()
CAF_PDM_InitObject( "Multi Summary Plot" ); CAF_PDM_InitObject( "Multi Summary Plot" );
this->setDeletable( true ); this->setDeletable( true );
CAF_PDM_InitFieldNoDefault( &m_filterText, "FilterText", "Filter Text" ); CAF_PDM_InitField( &m_autoPlotTitles, "AutoPlotTitles", true, "Auto Plot Titles" );
m_filterText.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); CAF_PDM_InitField( &m_autoPlotTitlesOnSubPlots, "AutoPlotTitlesSubPlots", true, "Auto Plot Titles Sub Plots" );
CAF_PDM_InitField( &m_individualPlotPerVector, "IndividualPlotPerVector", false, "One plot per Vector" );
CAF_PDM_InitField( &m_individualPlotPerObject, "IndividualPlotPerObject", false, "One plot per Object" );
CAF_PDM_InitField( &m_individualPlotPerDataSource, "IndividualPlotPerDataSource", false, "One plot per Data Source" );
CAF_PDM_InitField( &m_autoPlotTitles, "AutoPlotTitles", false, "Auto Plot Titles" );
CAF_PDM_InitField( &m_autoPlotTitlesOnSubPlots, "AutoPlotTitlesSubPlots", false, "Auto Plot Titles Sub Plots" );
CAF_PDM_InitField( &m_showMultiPlotInProjectTree, "ShowMultiPlotInProjectTree", true, "Show Multi Plot In Project Tree" );
CAF_PDM_InitFieldNoDefault( &m_multiPlot, "MultiPlot", "Multi Plot" );
m_multiPlot.uiCapability()->setUiTreeHidden( true );
m_multiPlot = new RimMultiPlot;
CAF_PDM_InitFieldNoDefault( &m_sourceStepping, "SourceStepping", "" ); CAF_PDM_InitFieldNoDefault( &m_sourceStepping, "SourceStepping", "" );
m_sourceStepping = new RimSummaryPlotSourceStepping; m_sourceStepping = new RimSummaryPlotSourceStepping;
@ -82,67 +71,26 @@ RimSummaryMultiPlot::RimSummaryMultiPlot()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimSummaryMultiPlot::~RimSummaryMultiPlot() RimSummaryMultiPlot::~RimSummaryMultiPlot()
{ {
removeMdiWindowFromMdiArea();
m_multiPlot->cleanupBeforeClose();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QWidget* RimSummaryMultiPlot::viewWidget() void RimSummaryMultiPlot::addPlot( RimPlot* plot )
{ {
return m_multiPlot->viewWidget(); RimSummaryPlot* sumPlot = dynamic_cast<RimSummaryPlot*>( plot );
CVF_ASSERT( sumPlot != nullptr );
if ( sumPlot ) RimMultiPlot::addPlot( plot );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QImage RimSummaryMultiPlot::snapshotWindowContent() void RimSummaryMultiPlot::insertPlot( RimPlot* plot, size_t index )
{ {
return m_multiPlot->snapshotWindowContent(); RimSummaryPlot* sumPlot = dynamic_cast<RimSummaryPlot*>( plot );
} CVF_ASSERT( sumPlot != nullptr );
if ( sumPlot ) RimMultiPlot::insertPlot( plot, index );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::zoomAll()
{
m_multiPlot->zoomAll();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryMultiPlot::description() const
{
return "RimSummaryMultiPlot Placeholder Text";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::addPlot( RimSummaryPlot* plot )
{
m_multiPlot->addPlot( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlot* RimSummaryMultiPlot::createAndAppendMultiPlot( const std::vector<RimSummaryPlot*>& plots )
{
RimProject* project = RimProject::current();
auto* plotCollection = project->mainPlotCollection()->multiPlotCollection();
auto* plotWindow = new RimSummaryMultiPlot;
plotWindow->setAsPlotMdiWindow();
plotCollection->addMultiSummaryPlot( plotWindow );
insertGraphsIntoPlot( plotWindow, plots );
plotCollection->updateAllRequiredEditors();
return plotWindow;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -235,83 +183,32 @@ void RimSummaryMultiPlot::populateNameHelper( RimSummaryPlotNameHelper* nameHelp
nameHelper->setEnsembleCases( ensembleCases ); nameHelper->setEnsembleCases( ensembleCases );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RimSummaryMultiPlot::createViewWidget( QWidget* mainWindowParent /*= nullptr*/ )
{
return m_multiPlot->createViewWidget( mainWindowParent );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::deleteViewWidget()
{
m_multiPlot->deleteViewWidget();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::onLoadDataAndUpdate()
{
updateMdiWindowVisibility();
if ( m_autoPlotTitles )
{
updatePlotTitles();
}
m_multiPlot->onLoadDataAndUpdate();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::doRenderWindowContent( QPaintDevice* paintDevice )
{
m_multiPlot->doRenderWindowContent( paintDevice );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo> RimSummaryMultiPlot::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly )
{
QList<caf::PdmOptionItemInfo> options;
return options;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimSummaryMultiPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
uiOrdering.add( &m_autoPlotTitles ); caf::PdmUiGroup* titlesGroup = uiOrdering.addNewGroup( "Titles" );
uiOrdering.add( &m_autoPlotTitlesOnSubPlots ); titlesGroup->add( &m_autoPlotTitles );
titlesGroup->add( &m_autoPlotTitlesOnSubPlots );
{ titlesGroup->add( &m_showPlotWindowTitle );
auto group = uiOrdering.addNewGroup( "Data Source" ); titlesGroup->add( &m_plotWindowTitle );
m_sourceStepping()->uiOrdering( uiConfigName, *group ); titlesGroup->add( &m_showIndividualPlotTitles );
} titlesGroup->add( &m_titleFontSize );
titlesGroup->add( &m_subTitleFontSize );
auto group = uiOrdering.addNewGroup( "Multi Plot Options" ); caf::PdmUiGroup* legendsGroup = uiOrdering.addNewGroup( "Legends" );
m_multiPlot->uiOrderingForSummaryMultiPlot( *group ); legendsGroup->add( &m_showPlotLegends );
legendsGroup->add( &m_plotLegendsHorizontal );
legendsGroup->add( &m_legendFontSize );
{ caf::PdmUiGroup* layoutGroup = uiOrdering.addNewGroup( "Layout" );
auto group = uiOrdering.addNewGroup( "Graph Building" ); layoutGroup->add( &m_columnCount );
group->setCollapsedByDefault( true ); layoutGroup->add( &m_rowsPerPage );
layoutGroup->add( &m_majorTickmarkCount );
group->add( &m_filterText ); uiOrdering.skipRemainingFields( true );
group->add( &m_individualPlotPerVector );
group->add( &m_individualPlotPerDataSource );
group->add( &m_individualPlotPerObject );
}
uiOrdering.add( &m_showMultiPlotInProjectTree );
uiOrdering.skipRemainingFields();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -321,110 +218,29 @@ void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFi
const QVariant& oldValue, const QVariant& oldValue,
const QVariant& newValue ) const QVariant& newValue )
{ {
RimPlotWindow::fieldChangedByUi( changedField, oldValue, newValue ); if ( changedField == &m_autoPlotTitles || changedField == &m_autoPlotTitlesOnSubPlots )
if ( changedField == &m_showWindow && m_showWindow() )
{
// Plots contained in a RimMultiPlot will automatically be set invisible
// Restore plot visibility
for ( auto p : m_multiPlot->plots() )
{
p->setShowWindow( true );
}
}
else if ( changedField == &m_filterText || changedField == &m_individualPlotPerDataSource ||
changedField == &m_individualPlotPerVector || changedField == &m_individualPlotPerObject )
{
updatePlots();
}
else if ( changedField == &m_autoPlotTitles || changedField == &m_autoPlotTitlesOnSubPlots )
{ {
onLoadDataAndUpdate(); onLoadDataAndUpdate();
updateLayout(); updateLayout();
} }
} else
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::defineEditorAttribute( const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute )
{
if ( field == &m_filterText )
{ {
auto attr = dynamic_cast<caf::PdmUiComboBoxEditorAttribute*>( attribute ); RimMultiPlot::fieldChangedByUi( changedField, oldValue, newValue );
if ( attr )
{
attr->enableEditableContent = true;
attr->enableAutoComplete = false;
attr->adjustWidthToContents = true;
attr->notifyWhenTextIsEdited = true;
}
} }
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) void RimSummaryMultiPlot::updatePlotWindowTitle()
{ {
uiTreeOrdering.skipRemainingChildren( !m_showMultiPlotInProjectTree ); if ( m_autoPlotTitles )
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::updatePlots()
{
auto [addressFilters, dataSourceFilters] =
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( m_filterText() );
auto [matchingSummaryCases, matchingEnsembles] = RiaSummaryStringTools::dataSourcesMatchingFilters( dataSourceFilters );
std::set<RifEclipseSummaryAddress> allAddresses;
if ( !matchingSummaryCases.empty() )
{ {
allAddresses = RicSummaryPlotBuilder::addressesForSource( matchingSummaryCases.front() ); populateNameHelper( m_nameHelper.get() );
auto title = m_nameHelper->plotTitle();
setMultiPlotTitle( title );
} }
else if ( !matchingEnsembles.empty() )
{
allAddresses = RicSummaryPlotBuilder::addressesForSource( matchingEnsembles.front() );
}
bool includeDiffCurves = false;
auto filteredAddresses =
RiaSummaryStringTools::computeFilteredAddresses( addressFilters, allAddresses, includeDiffCurves );
{
m_multiPlot->deleteAllPlots();
RicSummaryPlotBuilder plotBuilder;
plotBuilder.setAddresses( filteredAddresses );
plotBuilder.setDataSources( matchingSummaryCases, matchingEnsembles );
plotBuilder.setIndividualPlotPerDataSource( m_individualPlotPerDataSource );
RicSummaryPlotBuilder::RicGraphCurveGrouping groping = RicSummaryPlotBuilder::RicGraphCurveGrouping::NONE;
if ( m_individualPlotPerVector ) groping = RicSummaryPlotBuilder::RicGraphCurveGrouping::SINGLE_CURVES;
if ( m_individualPlotPerObject ) groping = RicSummaryPlotBuilder::RicGraphCurveGrouping::CURVES_FOR_OBJECT;
plotBuilder.setGrouping( groping );
auto plots = plotBuilder.createPlots();
insertGraphsIntoPlot( this, plots );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::updatePlotTitles()
{
populateNameHelper( m_nameHelper.get() );
auto title = m_nameHelper->plotTitle();
m_multiPlot->setMultiPlotTitle( title );
if ( m_autoPlotTitlesOnSubPlots ) if ( m_autoPlotTitlesOnSubPlots )
{ {
@ -473,7 +289,7 @@ std::vector<RimSummaryPlot*> RimSummaryMultiPlot::summaryPlots() const
{ {
std::vector<RimSummaryPlot*> typedPlots; std::vector<RimSummaryPlot*> typedPlots;
for ( auto plot : m_multiPlot->plots() ) for ( auto plot : plots() )
{ {
auto summaryPlot = dynamic_cast<RimSummaryPlot*>( plot ); auto summaryPlot = dynamic_cast<RimSummaryPlot*>( plot );
if ( summaryPlot ) typedPlots.push_back( summaryPlot ); if ( summaryPlot ) typedPlots.push_back( summaryPlot );
@ -519,10 +335,10 @@ void RimSummaryMultiPlot::insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const
plot->setAutoTitlePlot( true ); plot->setAutoTitlePlot( true );
plot->setAutoTitleGraphs( showTitleSubGraph ); plot->setAutoTitleGraphs( showTitleSubGraph );
plot->m_multiPlot->setColumnCount( columnCount ); plot->setColumnCount( columnCount );
plot->m_multiPlot->setRowCount( rowCount ); plot->setRowCount( rowCount );
plot->m_multiPlot->setShowPlotTitles( showTitleSubGraph ); plot->setShowPlotTitles( showTitleSubGraph );
plot->m_multiPlot->setTickmarkCount( tickmarkCount ); plot->setTickmarkCount( tickmarkCount );
for ( auto graph : graphs ) for ( auto graph : graphs )
{ {
@ -537,3 +353,28 @@ void RimSummaryMultiPlot::insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const
plot->loadDataAndUpdate(); plot->loadDataAndUpdate();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<caf::PdmFieldHandle*> RimSummaryMultiPlot::fieldsToShowInToolbar()
{
std::vector<caf::PdmFieldHandle*> toolBarFields;
auto& sourceObject = m_sourceStepping();
if ( sourceObject )
{
auto fields = sourceObject->fieldsToShowInToolbar();
toolBarFields.insert( std::end( toolBarFields ), std::begin( fields ), std::end( fields ) );
}
return toolBarFields;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimSummaryMultiPlot::handleGlobalKeyEvent( QKeyEvent* keyEvent )
{
return RimSummaryPlotControls::handleKeyEvents( m_sourceStepping(), keyEvent );
}

View File

@ -18,14 +18,15 @@
#pragma once #pragma once
#include "RimPlotWindow.h" #include "RimMultiPlot.h"
#include "RimSummaryDataSourceStepping.h" #include "RimSummaryDataSourceStepping.h"
#include "cafPdmChildField.h" #include "cafPdmChildField.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafPdmPtrArrayField.h" #include "cafPdmPtrArrayField.h"
class RimMultiPlot; #include <vector>
class RimSummaryPlot; class RimSummaryPlot;
class RimSummaryPlotSourceStepping; class RimSummaryPlotSourceStepping;
class RimSummaryPlotNameHelper; class RimSummaryPlotNameHelper;
@ -35,7 +36,7 @@ class RimSummaryNameHelper;
/// ///
/// ///
//================================================================================================== //==================================================================================================
class RimSummaryMultiPlot : public RimPlotWindow, public RimSummaryDataSourceStepping class RimSummaryMultiPlot : public RimMultiPlot, public RimSummaryDataSourceStepping
{ {
CAF_PDM_HEADER_INIT; CAF_PDM_HEADER_INIT;
@ -43,60 +44,38 @@ public:
RimSummaryMultiPlot(); RimSummaryMultiPlot();
~RimSummaryMultiPlot() override; ~RimSummaryMultiPlot() override;
QWidget* viewWidget() override;
QImage snapshotWindowContent() override;
void zoomAll() override;
QString description() const override;
void addPlot( RimSummaryPlot* plot );
void updatePlotTitles();
const RimSummaryNameHelper* nameHelper() const; const RimSummaryNameHelper* nameHelper() const;
void setAutoTitlePlot( bool enable ); void setAutoTitlePlot( bool enable );
void setAutoTitleGraphs( bool enable ); void setAutoTitleGraphs( bool enable );
static RimSummaryMultiPlot* createAndAppendMultiPlot( const std::vector<RimSummaryPlot*>& plots );
std::vector<RimSummaryDataSourceStepping::Axis> availableAxes() const override; std::vector<RimSummaryDataSourceStepping::Axis> availableAxes() const override;
std::vector<RimSummaryCurve*> curvesForStepping( RimSummaryDataSourceStepping::Axis axis ) const override; std::vector<RimSummaryCurve*> curvesForStepping( RimSummaryDataSourceStepping::Axis axis ) const override;
std::vector<RimEnsembleCurveSet*> curveSets() const override; std::vector<RimEnsembleCurveSet*> curveSets() const override;
std::vector<RimSummaryCurve*> allCurves( RimSummaryDataSourceStepping::Axis axis ) const override; std::vector<RimSummaryCurve*> allCurves( RimSummaryDataSourceStepping::Axis axis ) const override;
void addPlot( RimPlot* plot ) override;
void insertPlot( RimPlot* plot, size_t index ) override;
std::vector<caf::PdmFieldHandle*> fieldsToShowInToolbar();
protected:
bool handleGlobalKeyEvent( QKeyEvent* keyEvent ) override;
private: private:
QWidget* createViewWidget( QWidget* mainWindowParent = nullptr ) override;
void deleteViewWidget() override;
void onLoadDataAndUpdate() override;
void doRenderWindowContent( QPaintDevice* paintDevice ) override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void defineEditorAttribute( const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute ) override;
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override;
void updatePlots();
void populateNameHelper( RimSummaryPlotNameHelper* nameHelper ); void populateNameHelper( RimSummaryPlotNameHelper* nameHelper );
std::vector<RimSummaryPlot*> summaryPlots() const; std::vector<RimSummaryPlot*> summaryPlots() const;
static void insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const std::vector<RimSummaryPlot*>& graphs ); static void insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const std::vector<RimSummaryPlot*>& graphs );
private: void updatePlotWindowTitle() override;
caf::PdmField<QString> m_filterText;
caf::PdmField<bool> m_individualPlotPerVector;
caf::PdmField<bool> m_individualPlotPerDataSource;
caf::PdmField<bool> m_individualPlotPerObject;
caf::PdmField<bool> m_autoPlotTitles;
caf::PdmField<bool> m_autoPlotTitlesOnSubPlots;
caf::PdmField<bool> m_showMultiPlotInProjectTree; private:
caf::PdmChildField<RimMultiPlot*> m_multiPlot; caf::PdmField<bool> m_autoPlotTitles;
caf::PdmField<bool> m_autoPlotTitlesOnSubPlots;
caf::PdmChildField<RimSummaryPlotSourceStepping*> m_sourceStepping; caf::PdmChildField<RimSummaryPlotSourceStepping*> m_sourceStepping;

View File

@ -0,0 +1,85 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimSummaryMultiPlotCollection.h"
#include "RimProject.h"
#include "RimSummaryMultiPlot.h"
#include "cafPdmFieldReorderCapability.h"
CAF_PDM_SOURCE_INIT( RimSummaryMultiPlotCollection, "RimSummaryMultiPlotCollection" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlotCollection::RimSummaryMultiPlotCollection()
{
CAF_PDM_InitObject( "Summary Multi Plots", ":/MultiPlot16x16.png" );
CAF_PDM_InitFieldNoDefault( &m_summaryMultiPlots, "MultiSummaryPlots", "Multi Summary Plots" );
m_summaryMultiPlots.uiCapability()->setUiTreeHidden( true );
caf::PdmFieldReorderCapability::addToField( &m_summaryMultiPlots );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlotCollection::~RimSummaryMultiPlotCollection()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlotCollection::deleteAllPlots()
{
m_summaryMultiPlots.deleteAllChildObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryMultiPlot*> RimSummaryMultiPlotCollection::multiPlots() const
{
return m_summaryMultiPlots.childObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlotCollection::addMultiSummaryPlot( RimSummaryMultiPlot* plot )
{
m_summaryMultiPlots().push_back( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlotCollection::loadDataAndUpdateAllPlots()
{
for ( const auto& p : m_summaryMultiPlots.childObjects() )
p->loadDataAndUpdate();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RimSummaryMultiPlotCollection::plotCount() const
{
return m_summaryMultiPlots.size();
}

View File

@ -0,0 +1,49 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RimAbstractPlotCollection.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmObject.h"
class RimSummaryMultiPlot;
//==================================================================================================
///
///
//==================================================================================================
class RimSummaryMultiPlotCollection : public caf::PdmObject, public RimPlotCollection
{
CAF_PDM_HEADER_INIT;
public:
RimSummaryMultiPlotCollection();
~RimSummaryMultiPlotCollection() override;
void deleteAllPlots() override;
void loadDataAndUpdateAllPlots() override;
size_t plotCount() const override;
std::vector<RimSummaryMultiPlot*> multiPlots() const;
void addMultiSummaryPlot( RimSummaryMultiPlot* plot );
private:
caf::PdmChildArrayField<RimSummaryMultiPlot*> m_summaryMultiPlots;
};

View File

@ -51,6 +51,7 @@
#include "RimSummaryCurvesData.h" #include "RimSummaryCurvesData.h"
#include "RimSummaryPlotAxisFormatter.h" #include "RimSummaryPlotAxisFormatter.h"
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RimSummaryPlotControls.h"
#include "RimSummaryPlotFilterTextCurveSetEditor.h" #include "RimSummaryPlotFilterTextCurveSetEditor.h"
#include "RimSummaryPlotNameHelper.h" #include "RimSummaryPlotNameHelper.h"
#include "RimSummaryTimeAxisProperties.h" #include "RimSummaryTimeAxisProperties.h"
@ -2279,60 +2280,9 @@ void RimSummaryPlot::reattachAllCurves()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryPlot::handleKeyPressEvent( QKeyEvent* keyEvent ) bool RimSummaryPlot::handleGlobalKeyEvent( QKeyEvent* keyEvent )
{ {
if ( !keyEvent ) return; return RimSummaryPlotControls::handleKeyEvents( sourceSteppingObjectForKeyEventHandling(), keyEvent );
if ( RiuTreeViewEventFilter::activateFeatureFromKeyEvent( keyEvent ) )
{
return;
}
RimSummaryPlotSourceStepping* sourceStepping = sourceSteppingObjectForKeyEventHandling();
if ( !sourceStepping ) return;
if ( keyEvent->key() == Qt::Key_PageUp )
{
if ( keyEvent->modifiers() & Qt::ShiftModifier )
{
sourceStepping->applyPrevCase();
keyEvent->accept();
}
else if ( keyEvent->modifiers() & Qt::ControlModifier )
{
sourceStepping->applyPrevOtherIdentifier();
keyEvent->accept();
}
else
{
sourceStepping->applyPrevQuantity();
keyEvent->accept();
}
}
else if ( keyEvent->key() == Qt::Key_PageDown )
{
if ( keyEvent->modifiers() & Qt::ShiftModifier )
{
sourceStepping->applyNextCase();
keyEvent->accept();
}
else if ( keyEvent->modifiers() & Qt::ControlModifier )
{
sourceStepping->applyNextOtherIdentifier();
keyEvent->accept();
}
else
{
sourceStepping->applyNextQuantity();
keyEvent->accept();
}
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -208,8 +208,6 @@ private:
void detachAllPlotItems(); void detachAllPlotItems();
void deleteAllPlotCurves(); void deleteAllPlotCurves();
void handleKeyPressEvent( QKeyEvent* keyEvent ) override;
void onCurveCollectionChanged( const SignalEmitter* emitter ); void onCurveCollectionChanged( const SignalEmitter* emitter );
void connectCurveToPlot( RimSummaryCurve* curve, bool update, bool autoAssignPlotAxis ); void connectCurveToPlot( RimSummaryCurve* curve, bool update, bool autoAssignPlotAxis );
@ -231,6 +229,8 @@ protected:
QImage snapshotWindowContent() override; QImage snapshotWindowContent() override;
bool handleGlobalKeyEvent( QKeyEvent* keyEvent ) override;
private slots: private slots:
void onPlotZoomed(); void onPlotZoomed();

View File

@ -0,0 +1,123 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimSummaryPlotControls.h"
#include "RimSummaryPlotSourceStepping.h"
#include <QKeyEvent>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimSummaryPlotControls::handleKeyEvents( RimSummaryPlotSourceStepping* srcStepping, QKeyEvent* keyEvent )
{
if ( !keyEvent ) return false;
if ( !srcStepping ) return false;
if ( !( keyEvent->modifiers() & Qt::ControlModifier ) ) return false;
bool bHandled = false;
if ( keyEvent->key() == Qt::Key_Left )
{
srcStepping->applyPrevOtherIdentifier();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_Right )
{
srcStepping->applyNextOtherIdentifier();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_PageDown )
{
srcStepping->applyNextCase();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_PageUp )
{
srcStepping->applyPrevCase();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_Up )
{
srcStepping->applyPrevQuantity();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_Down )
{
srcStepping->applyNextQuantity();
keyEvent->accept();
bHandled = true;
}
return bHandled;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::quantityNextKeyText()
{
return QString( "Ctrl-Down" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::quantityPrevKeyText()
{
return QString( "Ctrl-Up" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::caseNextKeyText()
{
return QString( "Ctrl-PgDown" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::casePrevKeyText()
{
return QString( "Ctrl-PgUp" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::otherNextKeyText()
{
return QString( "Ctrl-Right" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::otherPrevKeyText()
{
return QString( "Ctrl-Left" );
}

View File

@ -0,0 +1,40 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
class RimSummaryPlotSourceStepping;
class QKeyEvent;
#include <QString>
class RimSummaryPlotControls
{
public:
static bool handleKeyEvents( RimSummaryPlotSourceStepping* srcStepping, QKeyEvent* keyEvent );
static QString quantityNextKeyText();
static QString quantityPrevKeyText();
static QString caseNextKeyText();
static QString casePrevKeyText();
static QString otherNextKeyText();
static QString otherPrevKeyText();
private:
RimSummaryPlotControls() = default;
};

View File

@ -399,9 +399,7 @@ void RimSummaryPlotManager::createNewPlot()
{ {
{ {
auto summaryPlots = plotBuilder.createPlots(); auto summaryPlots = plotBuilder.createPlots();
auto plot = RimSummaryMultiPlot::createAndAppendMultiPlot( summaryPlots ); RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( summaryPlots );
RiuPlotMainWindowTools::selectAsCurrentItem( plot );
} }
bool createStandardMultiPlot = false; bool createStandardMultiPlot = false;

View File

@ -35,6 +35,7 @@
#include "RimSummaryDataSourceStepping.h" #include "RimSummaryDataSourceStepping.h"
#include "RimSummaryMultiPlot.h" #include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h" #include "RimSummaryPlot.h"
#include "RimSummaryPlotControls.h"
#include "RiuPlotMainWindow.h" #include "RiuPlotMainWindow.h"
@ -976,25 +977,29 @@ void RimSummaryPlotSourceStepping::defineEditorAttribute( const caf::PdmFieldHan
myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" ); myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" );
myAttr->previousIcon = QIcon( ":/ComboBoxUp.svg" ); myAttr->previousIcon = QIcon( ":/ComboBoxUp.svg" );
QString modifierText; QString nextText;
QString prevText;
if ( field == &m_summaryCase ) if ( field == &m_summaryCase )
{ {
modifierText = ( "(Shift+" ); nextText = RimSummaryPlotControls::caseNextKeyText();
prevText = RimSummaryPlotControls::casePrevKeyText();
} }
else if ( field == &m_wellName || field == &m_wellGroupName || field == &m_region ) else if ( field == &m_wellName || field == &m_wellGroupName || field == &m_region )
{ {
modifierText = ( "(Ctrl+" ); nextText = RimSummaryPlotControls::otherNextKeyText();
prevText = RimSummaryPlotControls::otherPrevKeyText();
} }
else if ( field == &m_quantity ) else if ( field == &m_quantity )
{ {
modifierText = ( "(" ); nextText = RimSummaryPlotControls::quantityNextKeyText();
prevText = RimSummaryPlotControls::quantityPrevKeyText();
} }
if ( !modifierText.isEmpty() ) if ( !nextText.isEmpty() )
{ {
myAttr->nextButtonText = "Next " + modifierText + "PgDown)"; myAttr->nextButtonText = "Next (" + nextText + ")";
myAttr->prevButtonText = "Previous " + modifierText + "PgUp)"; myAttr->prevButtonText = "Previous (" + prevText + ")";
} }
} }

View File

@ -255,7 +255,16 @@ void RiuMainWindowBase::selectAsCurrentItem( const caf::PdmObject* object, bool
m_allowActiveViewChangeFromSelection = allowActiveViewChange; m_allowActiveViewChangeFromSelection = allowActiveViewChange;
auto tv = getTreeViewWithItem( object ); auto tv = getTreeViewWithItem( object );
if ( tv ) tv->selectAsCurrentItem( object ); if ( tv )
{
tv->selectAsCurrentItem( object );
QDockWidget* dw = dynamic_cast<QDockWidget*>( tv->parentWidget() );
if ( dw )
{
dw->show();
dw->raise();
}
}
m_allowActiveViewChangeFromSelection = true; m_allowActiveViewChangeFromSelection = true;
} }

View File

@ -31,6 +31,7 @@
#include "RimProject.h" #include "RimProject.h"
#include "RimSummaryCaseMainCollection.h" #include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCurveCollection.h" #include "RimSummaryCurveCollection.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h" #include "RimSummaryPlot.h"
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RimSummaryPlotFilterTextCurveSetEditor.h" #include "RimSummaryPlotFilterTextCurveSetEditor.h"
@ -702,17 +703,22 @@ void RiuPlotMainWindow::updateMultiPlotToolBar()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiuPlotMainWindow::updateSummaryPlotToolBar( bool forceUpdateUi ) void RiuPlotMainWindow::updateSummaryPlotToolBar( bool forceUpdateUi )
{ {
RimSummaryPlot* summaryPlot = dynamic_cast<RimSummaryPlot*>( m_activePlotViewWindow.p() ); RimSummaryPlot* summaryPlot = dynamic_cast<RimSummaryPlot*>( m_activePlotViewWindow.p() );
RimMultiPlot* multiPlot = dynamic_cast<RimMultiPlot*>( m_activePlotViewWindow.p() ); RimSummaryMultiPlot* summaryMultiPlot = dynamic_cast<RimSummaryMultiPlot*>( m_activePlotViewWindow.p() );
if ( multiPlot )
std::vector<caf::PdmFieldHandle*> toolBarFields;
if ( summaryMultiPlot )
{ {
summaryPlot = caf::SelectionManager::instance()->selectedItemOfType<RimSummaryPlot>(); toolBarFields = summaryMultiPlot->fieldsToShowInToolbar();
}
else if ( summaryPlot )
{
toolBarFields = summaryPlot->fieldsToShowInToolbar();
} }
if ( summaryPlot ) if ( toolBarFields.size() > 0 )
{ {
std::vector<caf::PdmFieldHandle*> toolBarFields = summaryPlot->fieldsToShowInToolbar();
QString keyword; QString keyword;
if ( !m_summaryPlotToolBarEditor->isEditorDataValid( toolBarFields ) ) if ( !m_summaryPlotToolBarEditor->isEditorDataValid( toolBarFields ) )
@ -997,6 +1003,16 @@ void RiuPlotMainWindow::selectedObjectsChanged()
{ {
updateSummaryPlotToolBar(); updateSummaryPlotToolBar();
} }
else
{
RimSummaryMultiPlot* multiSummaryPlot = nullptr;
firstSelectedObject->firstAncestorOrThisOfType( multiSummaryPlot );
if ( multiSummaryPlot )
{
updateSummaryPlotToolBar();
updateMultiPlotToolBar();
}
}
} }
// The only way to get to this code is by selection change initiated from the project tree view // The only way to get to this code is by selection change initiated from the project tree view