diff --git a/ApplicationCode/Application/CMakeLists_files.cmake b/ApplicationCode/Application/CMakeLists_files.cmake index f9828e8acf..c575b75c48 100644 --- a/ApplicationCode/Application/CMakeLists_files.cmake +++ b/ApplicationCode/Application/CMakeLists_files.cmake @@ -1,6 +1,8 @@ set (SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaApplication.h +${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.h +${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.h ${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.h ${CMAKE_CURRENT_LIST_DIR}/RiaDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.h @@ -17,6 +19,8 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaEclipseFileNameTools.h set (SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaApplication.cpp +${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.cpp +${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaDefines.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.cpp @@ -42,7 +46,8 @@ ${SOURCE_GROUP_SOURCE_FILES} set (QT_MOC_HEADERS ${QT_MOC_HEADERS} -${CMAKE_CURRENT_LIST_DIR}/RiaApplication.h +${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.h +${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.h ${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.h ${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.h ) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index 9f994bef10..9c9e7b37b4 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -1,8 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2011- Statoil ASA -// Copyright (C) 2013- Ceetron Solutions AS -// Copyright (C) 2011-2012 Ceetron AS +// Copyright (C) 2019- 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 @@ -17,24 +15,24 @@ // for more details. // ///////////////////////////////////////////////////////////////////////////////// - #include "RiaApplication.h" #include "RiaArgumentParser.h" #include "RiaBaseDefs.h" -#include "RiaColorTables.h" #include "RiaFilePathTools.h" #include "RiaFontCache.h" +#include "RiaGuiApplication.h" #include "RiaImportEclipseCaseTools.h" #include "RiaLogging.h" #include "RiaPreferences.h" #include "RiaProjectModifier.h" #include "RiaSocketServer.h" #include "RiaVersionInfo.h" -#include "RiaViewRedrawScheduler.h" #include "ExportCommands/RicSnapshotAllViewsToFileFeature.h" #include "HoloLensCommands/RicHoloLensSessionManager.h" +#include "RicfCommandFileExecutor.h" +#include "RicfMessages.h" #include "RicImportGeneralDataFeature.h" #include "Rim2dIntersectionViewCollection.h" @@ -84,38 +82,21 @@ #include "RimWellPltPlot.h" #include "RimWellRftPlot.h" -#include "Riu3dSelectionManager.h" -#include "RiuDockWidgetTools.h" -#include "RiuMainWindow.h" -#include "RiuMessagePanel.h" -#include "RiuPlotMainWindow.h" -#include "RiuProcessMonitor.h" -#include "RiuRecentFileActionProvider.h" -#include "RiuViewer.h" - -#include "cafAppEnum.h" -#include "cafEffectGenerator.h" -#include "cafFixedAtlasFont.h" #include "cafPdmSettings.h" -#include "cafPdmUiModelChangeDetector.h" -#include "cafPdmUiTreeView.h" #include "cafProgressInfo.h" -#include "cafQTreeViewStateSerializer.h" -#include "cafSelectionManager.h" #include "cafUiProcess.h" #include "cafUtils.h" #include "cvfProgramOptions.h" #include "cvfqtUtils.h" +#include #include -#include -#include -#include -#include -#include +#include -#ifndef WIN32 +#ifdef WIN32 +#include +#else #include // for usleep #endif // WIN32 @@ -123,104 +104,32 @@ #include "gtest/gtest.h" #endif // USE_UNIT_TESTS -namespace caf -{ -template<> -void AppEnum::setUp() -{ - addItem(RiaApplication::NAVIGATION_POLICY_CEETRON, "NAVIGATION_POLICY_CEETRON", "Ceetron"); - addItem(RiaApplication::NAVIGATION_POLICY_CAD, "NAVIGATION_POLICY_CAD", "CAD"); - addItem(RiaApplication::NAVIGATION_POLICY_GEOQUEST, "NAVIGATION_POLICY_GEOQUEST", "GEOQUEST"); - addItem(RiaApplication::NAVIGATION_POLICY_RMS, "NAVIGATION_POLICY_RMS", "RMS"); - setDefault(RiaApplication::NAVIGATION_POLICY_RMS); -} -} // namespace caf - -//================================================================================================== -/// -/// \class RiaApplication -/// -/// Application class -/// -//================================================================================================== +RiaApplication* RiaApplication::s_riaApplication = nullptr; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaApplication::notify(QObject* receiver, QEvent* event) +RiaApplication* RiaApplication::instance() { - // Pre-allocating a memory exhaustion message - // Doing som e trickery to avoid deadlock, as creating a messagebox actually triggers a call to this notify method. - - static QMessageBox* memoryExhaustedBox = nullptr; - static bool allocatingMessageBox = false; - if (!memoryExhaustedBox && !allocatingMessageBox) - { - allocatingMessageBox = true; - memoryExhaustedBox = new QMessageBox(QMessageBox::Critical, - "ResInsight Exhausted Memory", - "Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now " - "unstable and will probably crash soon."); - } - - bool done = true; - try - { - done = QApplication::notify(receiver, event); - } - catch (const std::bad_alloc&) - { - if (memoryExhaustedBox) memoryExhaustedBox->exec(); - std::cout << "ResInsight: Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now unstable " - "and will probably crash soon." - << std::endl; - // If we really want to crash instead of limping forward: - // throw; - } - - return done; + return s_riaApplication; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiaApplication::RiaApplication(int& argc, char** argv) - : QApplication(argc, argv) - , m_socketServer(nullptr) +RiaApplication::RiaApplication() + : m_socketServer(nullptr) , m_workerProcess(nullptr) , m_preferences(nullptr) , m_runningWorkerProcess(false) - , m_mainWindow(nullptr) - , m_mainPlotWindow(nullptr) { + CAF_ASSERT(s_riaApplication == nullptr); + s_riaApplication = this; + // USed to get registry settings in the right place QCoreApplication::setOrganizationName(RI_COMPANY_NAME); QCoreApplication::setApplicationName(RI_APPLICATION_NAME); - // For idle processing - // m_idleTimerStarted = false; - installEventFilter(this); - - // cvf::Trace::enable(false); - - m_preferences = new RiaPreferences; - caf::PdmSettings::readFieldsFromApplicationStore(m_preferences); - applyPreferences(); - - if (useShaders()) - { - caf::EffectGenerator::setRenderingMode(caf::EffectGenerator::SHADER_BASED); - } - else - { - caf::EffectGenerator::setRenderingMode(caf::EffectGenerator::FIXED_FUNCTION); - } - - // Start with a project - m_project = new RimProject; - - setWindowIcon(QIcon(":/AppLogo48x48.png")); - #ifdef WIN32 m_startupDefaultDirectory = QDir::homePath(); #else @@ -228,18 +137,6 @@ RiaApplication::RiaApplication(int& argc, char** argv) #endif setLastUsedDialogDirectory("MULTICASEIMPORT", "/"); - - m_recentFileActionProvider = std::unique_ptr(new RiuRecentFileActionProvider); - - // Create main windows - // The plot window is created to be able to set expanded state on created objects, but hidden by default - getOrCreateAndShowMainWindow(); - getOrCreateMainPlotWindow(); - - RiaLogging::setLoggerInstance(new RiuMessagePanelLogger(m_mainWindow->messagePanel())); - RiaLogging::loggerInstance()->setLevel(RI_LL_DEBUG); - - m_socketServer = new RiaSocketServer(this); } //-------------------------------------------------------------------------------------------------- @@ -247,85 +144,7 @@ RiaApplication::RiaApplication(int& argc, char** argv) //-------------------------------------------------------------------------------------------------- RiaApplication::~RiaApplication() { - RiuDockWidgetTools::instance()->saveDockWidgetsState(); - - deleteMainPlotWindow(); - deleteMainWindow(); - delete m_preferences; - - RiaLogging::deleteLoggerInstance(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiaApplication* RiaApplication::instance() -{ - return static_cast qApp; -} - -//-------------------------------------------------------------------------------------------------- -/// Return -1 if unit test is not executed, returns 0 if test passed, returns 1 if tests failed -//-------------------------------------------------------------------------------------------------- -int RiaApplication::parseArgumentsAndRunUnitTestsIfRequested() -{ - cvf::ProgramOptions progOpt; - progOpt.registerOption("unittest", "", "Execute unit tests"); - progOpt.setOptionPrefix(cvf::ProgramOptions::DOUBLE_DASH); - - QStringList arguments = QCoreApplication::arguments(); - - bool parseOk = progOpt.parse(cvfqt::Utils::toStringVector(arguments)); - if (!parseOk) - { - return -1; - } - - // Unit testing - // -------------------------------------------------------- - if (cvf::Option o = progOpt.option("unittest")) - { - int testReturnValue = launchUnitTestsWithConsole(); - - return testReturnValue; - } - - return -1; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::setWindowCaptionFromAppState() -{ - if (!m_mainWindow) return; - - // The stuff being done here should really be handled by Qt automatically as a result of - // setting applicationName and windowFilePath - // Was unable to make this work in Qt4.4.0! - - QString capt = RI_APPLICATION_NAME; -#ifdef _DEBUG - capt += " ##DEBUG##"; -#endif - - { - QString projFileName = m_project->fileName(); - if (projFileName.isEmpty()) projFileName = "Untitled project"; - - capt = projFileName + QString("[*]") + QString(" - ") + capt; - } - - m_mainWindow->setWindowTitle(capt); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::processNonGuiEvents() -{ - processEvents(QEventLoop::ExcludeUserInputEvents); } //-------------------------------------------------------------------------------------------------- @@ -356,47 +175,180 @@ const char* RiaApplication::getVersionStringApp(bool includeCrtInfo) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -class RiaMdiMaximizeWindowGuard +bool RiaApplication::enableDevelopmentFeatures() { -public: - RiaMdiMaximizeWindowGuard() + QString environmentVar = QProcessEnvironment::systemEnvironment().value("RESINSIGHT_DEVEL", QString("0")); + return environmentVar.toInt() == 1; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::createMockModel() +{ + RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelBasic()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::createResultsMockModel() +{ + RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelBasicWithResults()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::createLargeResultsMockModel() +{ + RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelLargeWithResults()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::createMockModelCustomized() +{ + RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelCustomized()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::createInputMockModel() +{ + RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames(QStringList(RiaDefines::mockModelBasicInputCase())); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::setActiveReservoirView(Rim3dView* rv) +{ + m_activeReservoirView = rv; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const Rim3dView* RiaApplication::activeReservoirView() const +{ + return m_activeReservoirView; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +Rim3dView* RiaApplication::activeReservoirView() +{ + return m_activeReservoirView; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGridView* RiaApplication::activeGridView() +{ + return dynamic_cast(m_activeReservoirView.p()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimProject* RiaApplication::project() +{ + return m_project; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaApplication::openFile(const QString& fileName) +{ + if (!caf::Utils::fileExists(fileName)) return false; + + bool loadingSucceded = false; + + QString lastUsedDialogTag; + + RiaDefines::ImportFileType fileType = RiaDefines::obtainFileTypeFromFileName(fileName); + + if (fileType == RiaDefines::RESINSIGHT_PROJECT_FILE) { + loadingSucceded = loadProject(fileName); + } + else if (fileType == RiaDefines::GEOMECH_ODB_FILE) + { + loadingSucceded = openOdbCaseFromFile(fileName); + lastUsedDialogTag = "GEOMECH_MODEL"; + } + else if (fileType & RiaDefines::ANY_ECLIPSE_FILE) + { + loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames(QStringList{fileName}); + lastUsedDialogTag = RiaDefines::defaultDirectoryLabel(fileType); + } + + if (loadingSucceded) + { + if (!lastUsedDialogTag.isEmpty()) { - RiuMainWindow* mainWindow = RiaApplication::instance()->mainWindow(); - if (mainWindow) - { - mainWindow->enableShowFirstVisibleMdiWindowMaximized(false); - } + RiaApplication::instance()->setLastUsedDialogDirectory(lastUsedDialogTag, QFileInfo(fileName).absolutePath()); } + onFileSuccessfullyLoaded(fileName, fileType); + } + + return loadingSucceded; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaApplication::currentProjectPath() const +{ + QString projectFolder; + if (m_project) + { + QString projectFileName = m_project->fileName(); + + if (!projectFileName.isEmpty()) { - RiuPlotMainWindow* plotMainWindow = RiaApplication::instance()->mainPlotWindow(); - if (plotMainWindow) - { - plotMainWindow->enableShowFirstVisibleMdiWindowMaximized(false); - } + QFileInfo fi(projectFileName); + projectFolder = fi.absolutePath(); } } - ~RiaMdiMaximizeWindowGuard() - { - { - RiuMainWindow* mainWindow = RiaApplication::instance()->mainWindow(); - if (mainWindow) - { - mainWindow->enableShowFirstVisibleMdiWindowMaximized(true); - } - } + return projectFolder; +} - { - RiuPlotMainWindow* plotMainWindow = RiaApplication::instance()->mainPlotWindow(); - if (plotMainWindow) - { - plotMainWindow->enableShowFirstVisibleMdiWindowMaximized(true); - } - } +//-------------------------------------------------------------------------------------------------- +/// Create an absolute path from a path that is specified relative to the project directory +/// +/// If the path specified in \a projectRelativePath is already absolute, no changes will be made +//-------------------------------------------------------------------------------------------------- +QString RiaApplication::createAbsolutePathFromProjectRelativePath(QString projectRelativePath) +{ + // Check if path is already absolute + if (QDir::isAbsolutePath(projectRelativePath)) + { + return projectRelativePath; } -}; + + QString absolutePath; + if (m_project && !m_project->fileName().isEmpty()) + { + absolutePath = QFileInfo(m_project->fileName()).absolutePath(); + } + else + { + absolutePath = this->lastUsedDialogDirectory("BINARY_GRID"); + } + + QDir projectDir(absolutePath); + + return projectDir.absoluteFilePath(projectRelativePath); +} //-------------------------------------------------------------------------------------------------- /// @@ -409,8 +361,7 @@ bool RiaApplication::loadProject(const QString& projectFileName, closeProject(); - // When importing a project, do not maximize the first MDI window to be created - RiaMdiMaximizeWindowGuard maximizeWindowGuard; + onProjectBeingOpened(); RiaLogging::info(QString("Starting to open project file : '%1'").arg(projectFileName)); @@ -441,48 +392,20 @@ bool RiaApplication::loadProject(const QString& projectFileName, { closeProject(); - QString tmp = + QString errMsg = QString("Unknown project file version detected in file \n%1\n\nCould not open project.").arg(fullPathProjectFileName); - QMessageBox::warning(nullptr, "Error when opening project file", tmp); - - m_mainWindow->setPdmRoot(nullptr); + + onProjectOpeningError(errMsg); // Delete all object possibly generated by readFile() delete m_project; m_project = new RimProject; - onProjectOpenedOrClosed(); + onProjectOpened(); return true; } - - if (m_project->show3DWindow()) - { - m_mainWindow->show(); - } - else - { - m_mainWindow->hide(); - } - - if (m_project->showPlotWindow()) - { - if (!m_mainPlotWindow) - { - createMainPlotWindow(); - m_mainPlotWindow->show(); - } - else - { - m_mainPlotWindow->show(); - m_mainPlotWindow->raise(); - } - } - else if (mainPlotWindow()) - { - mainPlotWindow()->hide(); - } - + /////// // Load the external data, and initialize stuff that needs specific ordering @@ -667,14 +590,11 @@ bool RiaApplication::loadProject(const QString& projectFileName, oilField->annotationCollection()->loadDataAndUpdate(); } - loadAndUpdatePlotData(); - // NB! This function must be called before executing command objects, // because the tree view state is restored from project file and sets // current active view ( see restoreTreeViewState() ) // Default behavior for scripts is to use current active view for data read/write - onProjectOpenedOrClosed(); - processEvents(); + onProjectOpened(); // Loop over command objects and execute them for (size_t i = 0; i < m_project->commandObjects.size(); i++) @@ -704,174 +624,150 @@ bool RiaApplication::loadProject(const QString& projectFileName) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiaApplication::loadAndUpdatePlotData() +bool RiaApplication::saveProjectAs(const QString& fileName, QString* errorMessage) { - RimWellLogPlotCollection* wlpColl = nullptr; - RimSummaryPlotCollection* spColl = nullptr; - RimSummaryCrossPlotCollection* scpColl = nullptr; - RimFlowPlotCollection* flowColl = nullptr; - RimRftPlotCollection* rftColl = nullptr; - RimPltPlotCollection* pltColl = nullptr; - RimGridCrossPlotCollection* gcpColl = nullptr; - RimSaturationPressurePlotCollection* sppColl = nullptr; + // Make sure we always store path with forward slash to avoid issues when opening the project file on Linux + m_project->fileName = RiaFilePathTools::toInternalSeparator(fileName); - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->wellLogPlotCollection()) + if (!m_project->writeFile()) { - wlpColl = m_project->mainPlotCollection()->wellLogPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->summaryPlotCollection()) - { - spColl = m_project->mainPlotCollection()->summaryPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->summaryCrossPlotCollection()) - { - scpColl = m_project->mainPlotCollection()->summaryCrossPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->flowPlotCollection()) - { - flowColl = m_project->mainPlotCollection()->flowPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->rftPlotCollection()) - { - rftColl = m_project->mainPlotCollection()->rftPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->pltPlotCollection()) - { - pltColl = m_project->mainPlotCollection()->pltPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->gridCrossPlotCollection()) - { - gcpColl = m_project->mainPlotCollection()->gridCrossPlotCollection(); - } - if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->saturationPressurePlotCollection()) - { - sppColl = m_project->mainPlotCollection()->saturationPressurePlotCollection(); + CAF_ASSERT(errorMessage); + *errorMessage = + QString("Not possible to save project file. Make sure you have sufficient access rights.\n\nProject file location : %1") + .arg(fileName); + + return false; } - size_t plotCount = 0; - plotCount += wlpColl ? wlpColl->wellLogPlots().size() : 0; - plotCount += spColl ? spColl->summaryPlots().size() : 0; - plotCount += scpColl ? scpColl->summaryPlots().size() : 0; - plotCount += flowColl ? flowColl->plotCount() : 0; - plotCount += rftColl ? rftColl->rftPlots().size() : 0; - plotCount += pltColl ? pltColl->pltPlots().size() : 0; - plotCount += gcpColl ? gcpColl->gridCrossPlots().size() : 0; - plotCount += sppColl ? sppColl->plots().size() : 0; + m_preferences->lastUsedProjectFileName = fileName; + caf::PdmSettings::writeFieldsToApplicationStore(m_preferences); - if (plotCount > 0) - { - caf::ProgressInfo plotProgress(plotCount, "Loading Plot Data"); - if (wlpColl) - { - for (size_t wlpIdx = 0; wlpIdx < wlpColl->wellLogPlots().size(); ++wlpIdx) - { - wlpColl->wellLogPlots[wlpIdx]->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - - if (spColl) - { - for (size_t wlpIdx = 0; wlpIdx < spColl->summaryPlots().size(); ++wlpIdx) - { - spColl->summaryPlots[wlpIdx]->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - - if (scpColl) - { - for (auto plot : scpColl->summaryPlots()) - { - plot->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - - if (flowColl) - { - plotProgress.setNextProgressIncrement(flowColl->plotCount()); - flowColl->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - - if (rftColl) - { - for (const auto& rftPlot : rftColl->rftPlots()) - { - rftPlot->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - - if (pltColl) - { - for (const auto& pltPlot : pltColl->pltPlots()) - { - pltPlot->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - - if (gcpColl) - { - for (const auto& gcpPlot : gcpColl->gridCrossPlots()) - { - gcpPlot->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - - if (sppColl) - { - for (const auto& sppPlot : sppColl->plots()) - { - sppPlot->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } - } + return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiaApplication::storeTreeViewState() +bool RiaApplication::hasValidProjectFileExtension(const QString& fileName) { + if (fileName.contains(".rsp", Qt::CaseInsensitive) || fileName.contains(".rip", Qt::CaseInsensitive)) { - if (mainPlotWindow() && mainPlotWindow()->projectTreeView()) - { - caf::PdmUiTreeView* projectTreeView = mainPlotWindow()->projectTreeView(); - - QString treeViewState; - caf::QTreeViewStateSerializer::storeTreeViewStateToString(projectTreeView->treeView(), treeViewState); - - QModelIndex mi = projectTreeView->treeView()->currentIndex(); - - QString encodedModelIndexString; - caf::QTreeViewStateSerializer::encodeStringFromModelIndex(mi, encodedModelIndexString); - - project()->plotWindowTreeViewState = treeViewState; - project()->plotWindowCurrentModelIndexPath = encodedModelIndexString; - } + return true; } + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::closeProject() +{ + onProjectBeingClosed(); + + terminateProcess(); + m_project->close(); + m_commandQueue.clear(); + + onProjectClosed(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaApplication::lastUsedDialogDirectory(const QString& dialogName) +{ + QString lastUsedDirectory = m_startupDefaultDirectory; + + auto it = m_fileDialogDefaultDirectories.find(dialogName); + if (it != m_fileDialogDefaultDirectories.end()) { - caf::PdmUiTreeView* projectTreeView = m_mainWindow->projectTreeView(); - if (projectTreeView) - { - QString treeViewState; - caf::QTreeViewStateSerializer::storeTreeViewStateToString(projectTreeView->treeView(), treeViewState); - - QModelIndex mi = projectTreeView->treeView()->currentIndex(); - - QString encodedModelIndexString; - caf::QTreeViewStateSerializer::encodeStringFromModelIndex(mi, encodedModelIndexString); - - project()->mainWindowTreeViewState = treeViewState; - project()->mainWindowCurrentModelIndexPath = encodedModelIndexString; - } + lastUsedDirectory = it->second; } + + return lastUsedDirectory; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaApplication::lastUsedDialogDirectoryWithFallback(const QString& dialogName, const QString& fallbackDirectory) +{ + QString lastUsedDirectory = m_startupDefaultDirectory; + if (!fallbackDirectory.isEmpty()) + { + lastUsedDirectory = fallbackDirectory; + } + + auto it = m_fileDialogDefaultDirectories.find(dialogName); + if (it != m_fileDialogDefaultDirectories.end()) + { + lastUsedDirectory = it->second; + } + + return lastUsedDirectory; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaApplication::lastUsedDialogDirectoryWithFallbackToProjectFolder(const QString& dialogName) +{ + return lastUsedDialogDirectoryWithFallback(dialogName, currentProjectPath()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::setLastUsedDialogDirectory(const QString& dialogName, const QString& directory) +{ + m_fileDialogDefaultDirectories[dialogName] = directory; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaApplication::openOdbCaseFromFile(const QString& fileName, bool applyTimeStepFilter) +{ + if (!caf::Utils::fileExists(fileName)) return false; + + QFileInfo gridFileName(fileName); + QString caseName = gridFileName.completeBaseName(); + + RimGeoMechCase* geoMechCase = new RimGeoMechCase(); + geoMechCase->setFileName(fileName); + geoMechCase->caseUserDescription = caseName; + geoMechCase->setApplyTimeFilter(applyTimeStepFilter); + + RimGeoMechModels* geoMechModelCollection = + m_project->activeOilField() ? m_project->activeOilField()->geoMechModels() : nullptr; + + // Create the geoMech model container if it is not there already + if (geoMechModelCollection == nullptr) + { + geoMechModelCollection = new RimGeoMechModels(); + m_project->activeOilField()->geoMechModels = geoMechModelCollection; + } + + RimGeoMechView* riv = geoMechCase->createAndAddReservoirView(); + caf::ProgressInfo progress(11, "Loading Case"); + progress.setNextProgressIncrement(10); + + riv->loadDataAndUpdate(); + + if (!riv->geoMechCase()) + { + delete geoMechCase; + return false; + } + geoMechModelCollection->cases.push_back(geoMechCase); + + progress.incrementProgress(); + progress.setProgressDescription("Loading results information"); + + m_project->updateConnectedEditors(); + + return true; } //-------------------------------------------------------------------------------------------------- @@ -939,817 +835,7 @@ void RiaApplication::addWellLogsToModel(const QList& wellLogFilePaths) m_project->updateConnectedEditors(); } - RimWellLogFile* wellLogFile = oilField->wellPathCollection->addWellLogs(wellLogFilePaths); - oilField->wellPathCollection->updateConnectedEditors(); - - m_mainWindow->selectAsCurrentItem(wellLogFile); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::saveProject() -{ - CVF_ASSERT(m_project.notNull()); - - if (!caf::Utils::fileExists(m_project->fileName())) - { - return saveProjectPromptForFileName(); - } - else - { - return saveProjectAs(m_project->fileName()); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::saveProjectPromptForFileName() -{ - // if (m_project.isNull()) return true; - - RiaApplication* app = RiaApplication::instance(); - - QString startPath; - if (!m_project->fileName().isEmpty()) - { - startPath = m_project->fileName(); - } - else - { - startPath = app->lastUsedDialogDirectory("BINARY_GRID"); - startPath += "/ResInsightProject.rsp"; - } - - QString fileName = - QFileDialog::getSaveFileName(nullptr, tr("Save File"), startPath, tr("Project Files (*.rsp);;All files(*.*)")); - if (fileName.isEmpty()) - { - return false; - } - - // Remember the directory to next time - app->setLastUsedDialogDirectory("BINARY_GRID", QFileInfo(fileName).absolutePath()); - - bool bSaveOk = saveProjectAs(fileName); - - setWindowCaptionFromAppState(); - - return bSaveOk; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::hasValidProjectFileExtension(const QString& fileName) -{ - if (fileName.contains(".rsp", Qt::CaseInsensitive) || fileName.contains(".rip", Qt::CaseInsensitive)) - { - return true; - } - - return false; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::askUserToSaveModifiedProject() -{ - if (m_preferences->showProjectChangedDialog() && caf::PdmUiModelChangeDetector::instance()->isModelChanged()) - { - QMessageBox msgBox; - msgBox.setIcon(QMessageBox::Question); - - QString questionText; - questionText = QString("The current project is modified.\n\nDo you want to save the changes?"); - - msgBox.setText(questionText); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - - int ret = msgBox.exec(); - if (ret == QMessageBox::Cancel) - { - return false; - } - else if (ret == QMessageBox::Yes) - { - if (!saveProject()) - { - return false; - } - } - else - { - caf::PdmUiModelChangeDetector::instance()->reset(); - } - } - - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::saveProjectAs(const QString& fileName) -{ - // Make sure we always store path with forward slash to avoid issues when opening the project file on Linux - m_project->fileName = RiaFilePathTools::toInternalSeparator(fileName); - - storeTreeViewState(); - - if (!m_project->writeFile()) - { - QMessageBox::warning( - nullptr, - "Error when saving project file", - QString( - "Not possible to save project file. Make sure you have sufficient access rights.\n\nProject file location : %1") - .arg(fileName)); - - return false; - } - - m_preferences->lastUsedProjectFileName = fileName; - caf::PdmSettings::writeFieldsToApplicationStore(m_preferences); - - m_recentFileActionProvider->addFileName(fileName); - - caf::PdmUiModelChangeDetector::instance()->reset(); - - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::closeProject() -{ - RicHoloLensSessionManager::instance()->terminateSession(); - RicHoloLensSessionManager::refreshToolbarState(); - - RiaViewRedrawScheduler::instance()->clearViewsScheduledForUpdate(); - - terminateProcess(); - - RiaApplication::clearAllSelections(); - - m_mainWindow->cleanupGuiBeforeProjectClose(); - - if (m_mainPlotWindow) - { - m_mainPlotWindow->cleanupGuiBeforeProjectClose(); - } - - caf::EffectGenerator::clearEffectCache(); - m_project->close(); - - m_commandQueue.clear(); - - onProjectOpenedOrClosed(); - - // Make sure all project windows are closed down properly before returning - processEvents(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::onProjectOpenedOrClosed() -{ - if (m_mainWindow) - { - m_mainWindow->initializeGuiNewProjectLoaded(); - } - if (m_mainPlotWindow) - { - m_mainPlotWindow->initializeGuiNewProjectLoaded(); - } - - setWindowCaptionFromAppState(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaApplication::currentProjectPath() const -{ - QString projectFolder; - if (m_project) - { - QString projectFileName = m_project->fileName(); - - if (!projectFileName.isEmpty()) - { - QFileInfo fi(projectFileName); - projectFolder = fi.absolutePath(); - } - } - - return projectFolder; -} - -//-------------------------------------------------------------------------------------------------- -/// Create an absolute path from a path that is specified relative to the project directory -/// -/// If the path specified in \a projectRelativePath is already absolute, no changes will be made -//-------------------------------------------------------------------------------------------------- -QString RiaApplication::createAbsolutePathFromProjectRelativePath(QString projectRelativePath) -{ - // Check if path is already absolute - if (QDir::isAbsolutePath(projectRelativePath)) - { - return projectRelativePath; - } - - QString absolutePath; - if (m_project && !m_project->fileName().isEmpty()) - { - absolutePath = QFileInfo(m_project->fileName()).absolutePath(); - } - else - { - absolutePath = this->lastUsedDialogDirectory("BINARY_GRID"); - } - - QDir projectDir(absolutePath); - - return projectDir.absoluteFilePath(projectRelativePath); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::openOdbCaseFromFile(const QString& fileName, bool applyTimeStepFilter) -{ - if (!caf::Utils::fileExists(fileName)) return false; - - QFileInfo gridFileName(fileName); - QString caseName = gridFileName.completeBaseName(); - - RimGeoMechCase* geoMechCase = new RimGeoMechCase(); - geoMechCase->setFileName(fileName); - geoMechCase->caseUserDescription = caseName; - geoMechCase->setApplyTimeFilter(applyTimeStepFilter); - - RimGeoMechModels* geoMechModelCollection = - m_project->activeOilField() ? m_project->activeOilField()->geoMechModels() : nullptr; - - // Create the geoMech model container if it is not there already - if (geoMechModelCollection == nullptr) - { - geoMechModelCollection = new RimGeoMechModels(); - m_project->activeOilField()->geoMechModels = geoMechModelCollection; - } - - RimGeoMechView* riv = geoMechCase->createAndAddReservoirView(); - caf::ProgressInfo progress(11, "Loading Case"); - progress.setNextProgressIncrement(10); - - riv->loadDataAndUpdate(); - - if (!riv->geoMechCase()) - { - delete geoMechCase; - return false; - } - geoMechModelCollection->cases.push_back(geoMechCase); - - // if (!riv->cellResult()->hasResult()) - //{ - // riv->cellResult()->setResultVariable(RiaDefines::undefinedResultName()); - //} - progress.incrementProgress(); - progress.setProgressDescription("Loading results information"); - - m_project->updateConnectedEditors(); - - m_mainWindow->selectAsCurrentItem(riv->cellResult()); - - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createMockModel() -{ - RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelBasic()); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createResultsMockModel() -{ - RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelBasicWithResults()); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createLargeResultsMockModel() -{ - RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelLargeWithResults()); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createMockModelCustomized() -{ - RiaImportEclipseCaseTools::openMockModel(RiaDefines::mockModelCustomized()); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createInputMockModel() -{ - RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames(QStringList(RiaDefines::mockModelBasicInputCase())); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const Rim3dView* RiaApplication::activeReservoirView() const -{ - return m_activeReservoirView; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -Rim3dView* RiaApplication::activeReservoirView() -{ - return m_activeReservoirView; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGridView* RiaApplication::activeGridView() -{ - return dynamic_cast(m_activeReservoirView.p()); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimViewWindow* RiaApplication::activePlotWindow() const -{ - RimViewWindow* viewWindow = nullptr; - - if (m_mainPlotWindow) - { - QList subwindows = m_mainPlotWindow->subWindowList(QMdiArea::StackingOrder); - if (subwindows.size() > 0) - { - viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget(subwindows.back()->widget()); - } - } - - return viewWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::setActiveReservoirView(Rim3dView* rv) -{ - m_activeReservoirView = rv; - - RiuDockWidgetTools::instance()->changeDockWidgetVisibilityBasedOnView(rv); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::useShaders() const -{ - if (!m_preferences->useShaders) return false; - - bool isShadersSupported = caf::Viewer::isShadersSupported(); - if (!isShadersSupported) return false; - - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiaApplication::RINavigationPolicy RiaApplication::navigationPolicy() const -{ - return m_preferences->navigationPolicy(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::showPerformanceInfo() const -{ - return m_preferences->showHud; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::parseArguments() -{ - bool result = RiaArgumentParser::parseArguments(); - if (!result) - { - closeAllWindows(); - processEvents(); - } - - return result; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RiaApplication::launchUnitTests() -{ -#ifdef USE_UNIT_TESTS - - caf::ProgressInfoBlocker progressBlocker; - cvf::Assert::setReportMode(cvf::Assert::CONSOLE); - -#if QT_VERSION < 0x050000 - int argc = QCoreApplication::argc(); - char** argv = QCoreApplication::argv(); -#else - int argc = QCoreApplication::arguments().size(); - QStringList arguments = QCoreApplication::arguments(); - std::vector argumentsStd; - for (QString qstring : arguments) - { - argumentsStd.push_back(qstring.toStdString()); - } - std::vector argVector; - for (std::string& string : argumentsStd) - { - argVector.push_back(&string.front()); - } - char** argv = argVector.data(); -#endif - - testing::InitGoogleTest(&argc, argv); - - // Use this macro in main() to run all tests. It returns 0 if all - // tests are successful, or 1 otherwise. - // - // RUN_ALL_TESTS() should be invoked after the command line has been - // parsed by InitGoogleTest(). - - return RUN_ALL_TESTS(); - -#else - return -1; -#endif -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RiaApplication::launchUnitTestsWithConsole() -{ - // Following code is taken from cvfAssert.cpp -#ifdef WIN32 - { - // Allocate a new console for this app - // Only one console can be associated with an app, so should fail if a console is already present. - AllocConsole(); - - FILE* consoleFilePointer; - - freopen_s(&consoleFilePointer, "CONOUT$", "w", stdout); - freopen_s(&consoleFilePointer, "CONOUT$", "w", stderr); - - // Make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well - std::ios::sync_with_stdio(); - } -#endif - - return launchUnitTests(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuMainWindow* RiaApplication::getOrCreateAndShowMainWindow() -{ - if (!m_mainWindow) - { - createMainWindow(); - } - return m_mainWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuMainWindow* RiaApplication::mainWindow() -{ - return m_mainWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuPlotMainWindow* RiaApplication::getOrCreateMainPlotWindow() -{ - if (!m_mainPlotWindow) - { - createMainPlotWindow(); - m_mainPlotWindow->initializeGuiNewProjectLoaded(); - loadAndUpdatePlotData(); - } - return m_mainPlotWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createMainWindow() -{ - CVF_ASSERT(m_mainWindow == nullptr); - m_mainWindow = new RiuMainWindow; - QString platform = cvf::System::is64Bit() ? "(64bit)" : "(32bit)"; - m_mainWindow->setWindowTitle("ResInsight " + platform); - m_mainWindow->setDefaultWindowSize(); - m_mainWindow->setDefaultToolbarVisibility(); - m_mainWindow->loadWinGeoAndDockToolBarLayout(); - m_mainWindow->showWindow(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::deleteMainWindow() -{ - if (m_mainWindow) - { - delete m_mainWindow; - m_mainWindow = nullptr; - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::createMainPlotWindow() -{ - CVF_ASSERT(m_mainPlotWindow == nullptr); - - m_mainPlotWindow = new RiuPlotMainWindow; - - m_mainPlotWindow->setWindowTitle("Plots - ResInsight"); - m_mainPlotWindow->setDefaultWindowSize(); - m_mainPlotWindow->loadWinGeoAndDockToolBarLayout(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::deleteMainPlotWindow() -{ - if (m_mainPlotWindow) - { - m_mainPlotWindow->deleteLater(); - m_mainPlotWindow = nullptr; - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuPlotMainWindow* RiaApplication::getOrCreateAndShowMainPlotWindow() -{ - if (!m_mainPlotWindow) - { - createMainPlotWindow(); - m_mainPlotWindow->initializeGuiNewProjectLoaded(); - loadAndUpdatePlotData(); - } - - if (m_mainPlotWindow->isMinimized()) - { - m_mainPlotWindow->showNormal(); - m_mainPlotWindow->update(); - } - else - { - m_mainPlotWindow->show(); - } - - m_mainPlotWindow->raise(); - m_mainPlotWindow->activateWindow(); - return m_mainPlotWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuPlotMainWindow* RiaApplication::mainPlotWindow() -{ - return m_mainPlotWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuMainWindowBase* RiaApplication::mainWindowByID(int mainWindowID) -{ - if (mainWindowID == 0) - return m_mainWindow; - else if (mainWindowID == 1) - return m_mainPlotWindow; - else - return nullptr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimViewWindow* RiaApplication::activeViewWindow() -{ - RimViewWindow* viewWindow = nullptr; - - QWidget* mainWindowWidget = RiaApplication::activeWindow(); - - if (dynamic_cast(mainWindowWidget)) - { - viewWindow = RiaApplication::instance()->activeReservoirView(); - } - else if (dynamic_cast(mainWindowWidget)) - { - RiuPlotMainWindow* mainPlotWindow = dynamic_cast(mainWindowWidget); - - QList subwindows = mainPlotWindow->subWindowList(QMdiArea::StackingOrder); - if (subwindows.size() > 0) - { - viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget(subwindows.back()->widget()); - } - } - - return viewWindow; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::isMain3dWindowVisible() const -{ - return m_mainWindow && m_mainWindow->isVisible(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::isMainPlotWindowVisible() const -{ - return m_mainPlotWindow && m_mainPlotWindow->isVisible(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::closeMainWindowIfOpenButHidden() -{ - if (m_mainWindow && !m_mainWindow->isVisible()) - { - m_mainWindow->close(); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::closeMainPlotWindowIfOpenButHidden() -{ - if (m_mainPlotWindow && !m_mainPlotWindow->isVisible()) - { - m_mainPlotWindow->close(); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::addToRecentFiles(const QString& fileName) -{ - CVF_ASSERT(m_recentFileActionProvider && - "The provider needs to be created before any attempts to use the recent file actions"); - m_recentFileActionProvider->addFileName(fileName); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::vector RiaApplication::recentFileActions() const -{ - CVF_ASSERT(m_recentFileActionProvider && - "The provider needs to be created before any attempts to use the recent file actions"); - return m_recentFileActionProvider->actions(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::setStartDir(const QString& startDir) -{ - m_startupDefaultDirectory = startDir; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::vector RiaApplication::readFileListFromTextFile(QString listFileName) -{ - std::vector fileList; - - QFile file(listFileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - return fileList; - } - - QTextStream in(&file); - QString line = in.readLine(); - while (!line.isNull()) - { - line = line.trimmed(); - if (!line.isEmpty()) - { - fileList.push_back(line); - } - - line = in.readLine(); - } - - return fileList; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::waitUntilCommandObjectsHasBeenProcessed() -{ - // Wait until all command objects have completed - bool mutexLockedSuccessfully = m_commandQueueLock.tryLock(); - - while (!mutexLockedSuccessfully) - { - processEvents(); - - mutexLockedSuccessfully = m_commandQueueLock.tryLock(); - } - m_commandQueueLock.unlock(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::saveMainWinGeoAndDockToolBarLayout() -{ - if (isMain3dWindowVisible()) - { - m_mainWindow->saveWinGeoAndDockToolBarLayout(); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::savePlotWinGeoAndDockToolBarLayout() -{ - if (isMainPlotWindowVisible()) - { - m_mainPlotWindow->saveWinGeoAndDockToolBarLayout(); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::enableDevelopmentFeatures() -{ - QString environmentVar = QProcessEnvironment::systemEnvironment().value("RESINSIGHT_DEVEL", QString("0")); - return environmentVar.toInt() == 1; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::clearAllSelections() -{ - Riu3dSelectionManager::instance()->deleteAllItems(Riu3dSelectionManager::RUI_APPLICATION_GLOBAL); - Riu3dSelectionManager::instance()->deleteAllItems(Riu3dSelectionManager::RUI_TEMPORARY); - caf::SelectionManager::instance()->clearAll(); } //-------------------------------------------------------------------------------------------------- @@ -1803,52 +889,6 @@ QStringList RiaApplication::octaveArguments() const return arguments; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::slotWorkerProcessFinished(int exitCode, QProcess::ExitStatus exitStatus) -{ - m_mainWindow->processMonitor()->stopMonitorWorkProcess(); - - // Execute delete later so that other slots that are hooked up - // get a chance to run before we delete the object - if (m_workerProcess) - { - m_workerProcess->close(); - } - m_workerProcess = nullptr; - - // Either the work process crashed or was aborted by the user - if (exitStatus == QProcess::CrashExit) - { - // MFLog::error("Simulation execution crashed or was aborted."); - m_runningWorkerProcess = false; - return; - } - - executeCommandObjects(); - - // Exit code != 0 means we have an error - if (exitCode != 0) - { - // MFLog::error(QString("Simulation execution failed (exit code %1).").arg(exitCode)); - m_runningWorkerProcess = false; - return; - } - - // If multiple cases are present, invoke launchProcess() which will set next current case, and run script on this case - if (!m_currentCaseIds.empty()) - { - launchProcess(m_currentProgram, m_currentArguments); - } - else - { - // Disable concept of current case - m_socketServer->setCurrentCaseId(-1); - m_runningWorkerProcess = false; - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1871,7 +911,7 @@ bool RiaApplication::launchProcess(const QString& program, const QStringList& ar } m_runningWorkerProcess = true; - m_workerProcess = new caf::UiProcess(this); + m_workerProcess = new caf::UiProcess(QCoreApplication::instance()); QProcessEnvironment penv = QProcessEnvironment::systemEnvironment(); @@ -1902,11 +942,11 @@ bool RiaApplication::launchProcess(const QString& program, const QStringList& ar m_workerProcess->setProcessEnvironment(penv); - connect(m_workerProcess, + QCoreApplication::instance()->connect(m_workerProcess, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(slotWorkerProcessFinished(int, QProcess::ExitStatus))); - m_mainWindow->processMonitor()->startMonitorWorkProcess(m_workerProcess); + startMonitoringWorkProgress(m_workerProcess); m_workerProcess->start(program, arguments); @@ -1919,9 +959,9 @@ bool RiaApplication::launchProcess(const QString& program, const QStringList& ar m_workerProcess = nullptr; m_runningWorkerProcess = false; - m_mainWindow->processMonitor()->stopMonitorWorkProcess(); + stopMonitoringWorkProgress(); - QMessageBox::warning(m_mainWindow, "Script execution", "Failed to start script executable located at\n" + program); +// QMessageBox::warning(m_mainWindow, "Script execution", "Failed to start script executable located at\n" + program); return false; } @@ -1930,9 +970,9 @@ bool RiaApplication::launchProcess(const QString& program, const QStringList& ar } else { - QMessageBox::warning(nullptr, - "Script execution", - "An Octave process is still running. Please stop this process before executing a new script."); + //QMessageBox::warning(nullptr, + // "Script execution", + // "An Octave process is still running. Please stop this process before executing a new script."); return false; } } @@ -1953,221 +993,6 @@ bool RiaApplication::launchProcessForMultipleCases(const QString& progr return launchProcess(m_currentProgram, m_currentArguments); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiaPreferences* RiaApplication::preferences() -{ - return m_preferences; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::applyPreferences(const RiaPreferences* oldPreferences) -{ - if (m_activeReservoirView && m_activeReservoirView->viewer()) - { - m_activeReservoirView->viewer()->updateNavigationPolicy(); - m_activeReservoirView->viewer()->enablePerfInfoHud(m_preferences->showHud()); - } - - if (useShaders()) - { - caf::EffectGenerator::setRenderingMode(caf::EffectGenerator::SHADER_BASED); - } - else - { - caf::EffectGenerator::setRenderingMode(caf::EffectGenerator::FIXED_FUNCTION); - } - - if (m_mainWindow && m_mainWindow->projectTreeView()) - { - m_mainWindow->projectTreeView()->enableAppendOfClassNameToUiItemText(m_preferences->appendClassNameToUiText()); - if (mainPlotWindow()) - mainPlotWindow()->projectTreeView()->enableAppendOfClassNameToUiItemText(m_preferences->appendClassNameToUiText()); - } - - // The creation of a font is time consuming, so make sure you really need your own font - // instead of using the application font - std::map fontSizes = m_preferences->defaultFontSizes(); - - m_defaultSceneFont = RiaFontCache::getFont(fontSizes[RiaDefines::SCENE_FONT]); - m_defaultAnnotationFont = RiaFontCache::getFont(fontSizes[RiaDefines::ANNOTATION_FONT]); - m_defaultWellLabelFont = RiaFontCache::getFont(fontSizes[RiaDefines::WELL_LABEL_FONT]); - - if (this->project()) - { - this->project()->setScriptDirectories(m_preferences->scriptDirectories()); - this->project()->updateConnectedEditors(); - - RimWellPathCollection* wellPathCollection = this->project()->activeOilField()->wellPathCollection(); - - std::vector allViewWindows; - project()->descendantsIncludingThisOfType(allViewWindows); - - bool existingViewsWithDifferentMeshLines = false; - bool existingViewsWithCustomColors = false; - bool existingViewsWithCustomZScale = false; - bool existingObjectsWithCustomFonts = false; - if (oldPreferences) - { - for (auto viewWindow : allViewWindows) - { - auto rim3dView = dynamic_cast(viewWindow); - if (rim3dView) - { - if (rim3dView->meshMode() != oldPreferences->defaultMeshModeType()) - { - existingViewsWithDifferentMeshLines = true; - } - if (rim3dView->backgroundColor() != oldPreferences->defaultViewerBackgroundColor()) - { - existingViewsWithCustomColors = true; - } - if (rim3dView->scaleZ() != static_cast(oldPreferences->defaultScaleFactorZ)) - { - existingViewsWithCustomZScale = true; - } - - RimGridView* gridView = dynamic_cast(rim3dView); - if (gridView && gridView->annotationCollection()) - { - RiaFontCache::FontSize oldFontSize = oldPreferences->defaultAnnotationFontSize(); - existingObjectsWithCustomFonts = gridView->annotationCollection()->hasTextAnnotationsWithCustomFontSize(oldFontSize); - } - RimEclipseView* eclipseView = dynamic_cast(rim3dView); - if (eclipseView) - { - if (eclipseView->wellCollection()->wellLabelColor() != oldPreferences->defaultWellLabelColor()) - { - existingViewsWithCustomColors = true; - } - } - } - - for (auto fontTypeSizePair : fontSizes) - { - RiaFontCache::FontSize oldFontSizeEnum = oldPreferences->defaultFontSizes()[fontTypeSizePair.first]; - if (oldFontSizeEnum != fontTypeSizePair.second) - { - int oldFontSize = RiaFontCache::pointSizeFromFontSizeEnum(oldFontSizeEnum); - if (viewWindow->hasCustomFontSizes(fontTypeSizePair.first, oldFontSize)) - { - existingObjectsWithCustomFonts = true; - } - } - } - } - - if (oldPreferences->defaultWellLabelColor() != wellPathCollection->wellPathLabelColor()) - { - existingViewsWithCustomColors = true; - } - } - - bool applySettingsToAllViews = false; - if (existingViewsWithCustomColors || existingViewsWithCustomZScale || - existingViewsWithDifferentMeshLines || existingObjectsWithCustomFonts) - { - QStringList changedData; - if (existingViewsWithDifferentMeshLines) changedData << "Mesh Visibility"; - if (existingViewsWithCustomColors) changedData << "Colors"; - if (existingViewsWithCustomZScale) changedData << "Z-Scale"; - if (existingObjectsWithCustomFonts) changedData << "Fonts Sizes"; - - QString listString = changedData.takeLast(); - if (!changedData.empty()) - { - listString = changedData.join(", ") + " and " + listString; - } - - QMessageBox::StandardButton reply; - reply = QMessageBox::question(m_mainWindow, - QString("Apply %1 to Existing Views or Plots?").arg(listString), - QString("You have changed default %1 and have existing views or plots with different settings.\n").arg(listString) + - QString("Do you want to apply the new default settings to all existing views?"), - QMessageBox::Ok | QMessageBox::Cancel); - applySettingsToAllViews = (reply == QMessageBox::Ok); - } - - for (auto viewWindow : allViewWindows) - { - for (auto fontTypeSizePair : fontSizes) - { - RiaFontCache::FontSize oldFontSizeEnum = oldPreferences->defaultFontSizes()[fontTypeSizePair.first]; - if (oldFontSizeEnum != fontTypeSizePair.second) - { - int oldFontSize = RiaFontCache::pointSizeFromFontSizeEnum(oldFontSizeEnum); - int newFontSize = RiaFontCache::pointSizeFromFontSizeEnum(fontTypeSizePair.second); - viewWindow->applyFontSize(fontTypeSizePair.first, oldFontSize, newFontSize, applySettingsToAllViews); - } - - } - - auto rim3dView = dynamic_cast(viewWindow); - if (rim3dView) - { - if (oldPreferences && (applySettingsToAllViews || rim3dView->meshMode() == oldPreferences->defaultMeshModeType())) - { - rim3dView->meshMode = m_preferences->defaultMeshModeType(); - } - - if (oldPreferences && (applySettingsToAllViews || rim3dView->backgroundColor() == oldPreferences->defaultViewerBackgroundColor())) - { - rim3dView->setBackgroundColor(m_preferences->defaultViewerBackgroundColor()); - rim3dView->applyBackgroundColorAndFontChanges(); - } - - if (oldPreferences && (applySettingsToAllViews || rim3dView->scaleZ == static_cast(oldPreferences->defaultScaleFactorZ()))) - { - rim3dView->scaleZ = static_cast(m_preferences->defaultScaleFactorZ()); - rim3dView->updateScaling(); - if (rim3dView == activeViewWindow()) - { - RiuMainWindow::instance()->updateScaleValue(); - } - } - - RimEclipseView* eclipseView = dynamic_cast(rim3dView); - if (eclipseView) - { - if (oldPreferences && (applySettingsToAllViews || eclipseView->wellCollection()->wellLabelColor() == oldPreferences->defaultWellLabelColor())) - { - eclipseView->wellCollection()->wellLabelColor = m_preferences->defaultWellLabelColor(); - } - eclipseView->scheduleReservoirGridGeometryRegen(); - } - rim3dView->scheduleCreateDisplayModelAndRedraw(); - } - } - - if (oldPreferences) - { - bool matchingColor = wellPathCollection->wellPathLabelColor() == oldPreferences->defaultWellLabelColor(); - if (applySettingsToAllViews || matchingColor) - { - wellPathCollection->wellPathLabelColor = oldPreferences->defaultWellLabelColor(); - } - - if (oldPreferences->defaultPlotFontSize() != m_preferences->defaultPlotFontSize()) - { - m_mainWindow->applyFontSizesToDockedPlots(); - } - } - - std::vector uiEditorsToUpdate; - caf::SelectionManager::instance()->selectedItems(uiEditorsToUpdate); - - for (caf::PdmUiItem* uiItem : uiEditorsToUpdate) - { - uiItem->updateConnectedEditors(); - } - } - - caf::PdmUiItem::enableExtraDebugText(m_preferences->appendFieldKeywordToToolTipText()); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -2194,210 +1019,48 @@ void RiaApplication::waitForProcess() const #else usleep(100000); #endif - processEvents(); + QCoreApplication::processEvents(); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaPreferences* RiaApplication::preferences() +{ + return m_preferences; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RiaApplication::lastUsedDialogDirectory(const QString& dialogName) -{ - QString lastUsedDirectory = m_startupDefaultDirectory; - - auto it = m_fileDialogDefaultDirectories.find(dialogName); - if (it != m_fileDialogDefaultDirectories.end()) - { - lastUsedDirectory = it->second; - } - - return lastUsedDirectory; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaApplication::lastUsedDialogDirectoryWithFallback(const QString& dialogName, const QString& fallbackDirectory) -{ - QString lastUsedDirectory = m_startupDefaultDirectory; - if (!fallbackDirectory.isEmpty()) - { - lastUsedDirectory = fallbackDirectory; - } - - auto it = m_fileDialogDefaultDirectories.find(dialogName); - if (it != m_fileDialogDefaultDirectories.end()) - { - lastUsedDirectory = it->second; - } - - return lastUsedDirectory; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaApplication::lastUsedDialogDirectoryWithFallbackToProjectFolder(const QString& dialogName) -{ - return lastUsedDialogDirectoryWithFallback(dialogName, currentProjectPath()); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::setLastUsedDialogDirectory(const QString& dialogName, const QString& directory) -{ - m_fileDialogDefaultDirectories[dialogName] = directory; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaApplication::openFile(const QString& fileName) -{ - if (!caf::Utils::fileExists(fileName)) return false; - - bool loadingSucceded = false; - - QString lastUsedDialogTag; - - RiaDefines::ImportFileType fileType = RiaDefines::obtainFileTypeFromFileName(fileName); - - if (fileType == RiaDefines::RESINSIGHT_PROJECT_FILE) - { - loadingSucceded = loadProject(fileName); - } - else if (fileType == RiaDefines::GEOMECH_ODB_FILE) - { - loadingSucceded = openOdbCaseFromFile(fileName); - if (loadingSucceded) lastUsedDialogTag = "GEOMECH_MODEL"; - } - else if ( fileType & RiaDefines::ANY_ECLIPSE_FILE) - { - loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames(QStringList{ fileName }); - if (loadingSucceded) - { - lastUsedDialogTag = RiaDefines::defaultDirectoryLabel(fileType); - - if (fileType & RiaDefines::ECLIPSE_SUMMARY_FILE) - { - getOrCreateAndShowMainPlotWindow(); - } - } - } - - if (loadingSucceded) - { - if (!lastUsedDialogTag.isEmpty()) - { - RiaApplication::instance()->setLastUsedDialogDirectory(lastUsedDialogTag, QFileInfo(fileName).absolutePath()); - } - if (!RiaApplication::hasValidProjectFileExtension(fileName)) - { - caf::PdmUiModelChangeDetector::instance()->setModelChanged(); - } - } - - return loadingSucceded; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::runMultiCaseSnapshots(const QString& templateProjectFileName, - std::vector gridFileNames, - const QString& snapshotFolderName) -{ - if (!m_mainWindow) return; - - m_mainWindow->hideAllDockWindows(); - - const size_t numGridFiles = gridFileNames.size(); - for (size_t i = 0; i < numGridFiles; i++) - { - QString gridFn = gridFileNames[i]; - - RiaProjectModifier modifier; - modifier.setReplaceCaseFirstOccurrence(gridFn); - - bool loadOk = loadProject(templateProjectFileName, PLA_NONE, &modifier); - if (loadOk) - { - RicSnapshotAllViewsToFileFeature::exportSnapshotOfAllViewsIntoFolder(snapshotFolderName); - } - } - - m_mainWindow->loadWinGeoAndDockToolBarLayout(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::Font* RiaApplication::defaultSceneFont() -{ - CVF_ASSERT(m_defaultSceneFont.notNull()); - +void RiaApplication::applyPreferences(const RiaPreferences* oldPreferences) +{ // The creation of a font is time consuming, so make sure you really need your own font // instead of using the application font + std::map fontSizes = m_preferences->defaultFontSizes(); - return m_defaultSceneFont.p(); + m_defaultSceneFont = RiaFontCache::getFont(fontSizes[RiaDefines::SCENE_FONT]); + m_defaultAnnotationFont = RiaFontCache::getFont(fontSizes[RiaDefines::ANNOTATION_FONT]); + m_defaultWellLabelFont = RiaFontCache::getFont(fontSizes[RiaDefines::WELL_LABEL_FONT]); + + if (this->project()) + { + this->project()->setScriptDirectories(m_preferences->scriptDirectories()); + this->project()->updateConnectedEditors(); + } } + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -cvf::Font* RiaApplication::defaultAnnotationFont() +QString RiaApplication::commandLineParameterHelp() { - CVF_ASSERT(m_defaultAnnotationFont.notNull()); - - return m_defaultAnnotationFont.p(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::Font* RiaApplication::defaultWellLabelFont() -{ - CVF_ASSERT(m_defaultWellLabelFont.notNull()); - - return m_defaultWellLabelFont.p(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimProject* RiaApplication::project() -{ - return m_project; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaApplication::showFormattedTextInMessageBox(const QString& text) -{ - QString helpText = text; - - QMessageBox msgBox; - msgBox.setIcon(QMessageBox::Information); - msgBox.setWindowTitle("ResInsight"); - - helpText.replace("&", "&"); - helpText.replace("<", "<"); - helpText.replace(">", ">"); - - helpText = QString("
%1
").arg(helpText); - msgBox.setText(helpText); - - msgBox.exec(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaApplication::commandLineParameterHelp() const -{ - return m_helpText; + QString helpText = QString("\n%1 v. %2\n").arg(RI_APPLICATION_NAME).arg(RiaApplication::getVersionStringApp(false)); + helpText += "Copyright Equinor ASA, Ceetron Solution AS, Ceetron AS\n\n"; + return helpText; } //-------------------------------------------------------------------------------------------------- @@ -2423,6 +1086,23 @@ QVariant RiaApplication::cacheDataObject(const QString& key) const return QVariant(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::executeCommandFile(const QString& commandFile) +{ + QFile file(commandFile); + RicfMessages messages; + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + // TODO : Error logging? + return; + } + + QTextStream in(&file); + RicfCommandFileExecutor::instance()->executeCommands(in); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -2476,7 +1156,161 @@ void RiaApplication::executeCommandObjects() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiaApplication::setHelpText(const QString& helpText) +void RiaApplication::waitUntilCommandObjectsHasBeenProcessed() { - m_helpText = helpText; + // Wait until all command objects have completed + bool mutexLockedSuccessfully = m_commandQueueLock.tryLock(); + + while (!mutexLockedSuccessfully) + { + handleEvents(); + + mutexLockedSuccessfully = m_commandQueueLock.tryLock(); + } + m_commandQueueLock.unlock(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RiaApplication::launchUnitTests() +{ +#ifdef USE_UNIT_TESTS + + caf::ProgressInfoBlocker progressBlocker; + cvf::Assert::setReportMode(cvf::Assert::CONSOLE); + +#if QT_VERSION < 0x050000 + int argc = QCoreApplication::argc(); + char** argv = QCoreApplication::argv(); +#else + int argc = QCoreApplication::arguments().size(); + QStringList arguments = QCoreApplication::arguments(); + std::vector argumentsStd; + for (QString qstring : arguments) + { + argumentsStd.push_back(qstring.toStdString()); + } + std::vector argVector; + for (std::string& string : argumentsStd) + { + argVector.push_back(&string.front()); + } + char** argv = argVector.data(); +#endif + + testing::InitGoogleTest(&argc, argv); + + // Use this macro in main() to run all tests. It returns 0 if all + // tests are successful, or 1 otherwise. + // + // RUN_ALL_TESTS() should be invoked after the command line has been + // parsed by InitGoogleTest(). + + return RUN_ALL_TESTS(); + +#else + return -1; +#endif +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const QString RiaApplication::startDir() const +{ + return m_startupDefaultDirectory; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::setStartDir(const QString& startDir) +{ + m_startupDefaultDirectory = startDir; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiaApplication::readFileListFromTextFile(QString listFileName) +{ + std::vector fileList; + + QFile file(listFileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + return fileList; + } + + QTextStream in(&file); + QString line = in.readLine(); + while (!line.isNull()) + { + line = line.trimmed(); + if (!line.isEmpty()) + { + fileList.push_back(line); + } + + line = in.readLine(); + } + + return fileList; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Font* RiaApplication::defaultSceneFont() +{ + CVF_ASSERT(m_defaultSceneFont.notNull()); + + // The creation of a font is time consuming, so make sure you really need your own font + // instead of using the application font + + return m_defaultSceneFont.p(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Font* RiaApplication::defaultAnnotationFont() +{ + CVF_ASSERT(m_defaultAnnotationFont.notNull()); + + return m_defaultAnnotationFont.p(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Font* RiaApplication::defaultWellLabelFont() +{ + CVF_ASSERT(m_defaultWellLabelFont.notNull()); + + return m_defaultWellLabelFont.p(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaApplication::initialize() +{ + m_preferences = new RiaPreferences; + caf::PdmSettings::readFieldsFromApplicationStore(m_preferences); + + applyPreferences(nullptr); + + // Start with a project + m_project = new RimProject; + m_project->initScriptDirectories(m_preferences->scriptDirectories()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RiaApplication::launchUnitTestsWithConsole() +{ + return launchUnitTests(); } diff --git a/ApplicationCode/Application/RiaApplication.h b/ApplicationCode/Application/RiaApplication.h index 4efbe370d5..7b69dbe5f5 100644 --- a/ApplicationCode/Application/RiaApplication.h +++ b/ApplicationCode/Application/RiaApplication.h @@ -3,34 +3,34 @@ // Copyright (C) 2011- Statoil ASA // Copyright (C) 2013- Ceetron Solutions AS // Copyright (C) 2011-2012 Ceetron AS -// +// // 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 +// +// See the GNU General Public License at // for more details. // -///////////////////////////////////////////////////////////////////////////////// - +////////////////////////////////////////////////////////////////////////////////// #pragma once -#include -#include -#include +#include "RiaDefines.h" -#include "cafPdmObject.h" #include "cafPdmField.h" +#include "cafPdmObject.h" #include "cvfBase.h" -#include "cvfObject.h" #include "cvfFont.h" +#include "cvfObject.h" -#include "RiaFontCache.h" +#include +#include +#include +#include #include #include @@ -66,210 +66,164 @@ class RiaArgumentParser; namespace caf { - class UiProcess; +class UiProcess; +} + +namespace cvf +{ +class ProgramOptions; } //================================================================================================== -// -// -// +/// Base class for all ResInsight applications. I.e. console and GUI +/// //================================================================================================== -class RiaApplication : public QApplication +class RiaApplication { - Q_OBJECT - public: - enum RINavigationPolicy - { - NAVIGATION_POLICY_CEETRON, - NAVIGATION_POLICY_CAD, - NAVIGATION_POLICY_GEOQUEST, - NAVIGATION_POLICY_RMS - }; - enum ProjectLoadAction { - PLA_NONE = 0, + PLA_NONE = 0, PLA_CALCULATE_STATISTICS = 1 }; - typedef RiaFontCache::FontSize FontSize; + enum ApplicationStatus + { + KEEP_GOING = 0, + EXIT_COMPLETED, + EXIT_WITH_ERROR + }; public: - RiaApplication(int& argc, char** argv); - ~RiaApplication() override; + static RiaApplication* instance(); + RiaApplication(); + virtual ~RiaApplication(); + + static const char* getVersionStringApp(bool includeCrtInfo); + static bool enableDevelopmentFeatures(); - static RiaApplication* instance(); + void setActiveReservoirView(Rim3dView*); + Rim3dView* activeReservoirView(); + const Rim3dView* activeReservoirView() const; + RimGridView* activeGridView(); - int parseArgumentsAndRunUnitTestsIfRequested(); - bool parseArguments(); + RimProject* project(); - void setActiveReservoirView(Rim3dView*); - Rim3dView* activeReservoirView(); - const Rim3dView* activeReservoirView() const; - RimGridView* activeGridView(); + void createMockModel(); + void createResultsMockModel(); + void createLargeResultsMockModel(); + void createMockModelCustomized(); + void createInputMockModel(); - RimViewWindow* activePlotWindow() const; + bool openFile(const QString& fileName); - RimProject* project(); + QString currentProjectPath() const; + QString createAbsolutePathFromProjectRelativePath(QString projectRelativePath); + bool loadProject(const QString& projectFileName); + bool loadProject(const QString& projectFileName, ProjectLoadAction loadAction, RiaProjectModifier* projectModifier); + bool saveProjectAs(const QString& fileName, QString* errorMessage); + static bool hasValidProjectFileExtension(const QString& fileName); + void closeProject(); - void createMockModel(); - void createResultsMockModel(); - void createLargeResultsMockModel(); - void createMockModelCustomized(); - void createInputMockModel(); + QString lastUsedDialogDirectory(const QString& dialogName); + QString lastUsedDialogDirectoryWithFallbackToProjectFolder(const QString& dialogName); + QString lastUsedDialogDirectoryWithFallback(const QString& dialogName, const QString& fallbackDirectory); + void setLastUsedDialogDirectory(const QString& dialogName, const QString& directory); - QString lastUsedDialogDirectory(const QString& dialogName); - QString lastUsedDialogDirectoryWithFallbackToProjectFolder(const QString& dialogName); - QString lastUsedDialogDirectoryWithFallback(const QString& dialogName, const QString& fallbackDirectory); - void setLastUsedDialogDirectory(const QString& dialogName, const QString& directory); + bool openOdbCaseFromFile(const QString& fileName, bool applyTimeStepFilter = false); - bool openFile(const QString& fileName); + void addWellPathsToModel(QList wellPathFilePaths); + void addWellPathFormationsToModel(QList wellPathFilePaths); + void addWellLogsToModel(const QList& wellLogFilePaths); - bool openOdbCaseFromFile(const QString& fileName, bool applyTimeStepFilter = false); + QString scriptDirectories() const; + QString scriptEditorPath() const; - QString currentProjectPath() const; - QString createAbsolutePathFromProjectRelativePath(QString projectRelativePath); - bool loadProject(const QString& projectFileName); - bool loadProject(const QString& projectFileName, ProjectLoadAction loadAction, RiaProjectModifier* projectModifier); - bool saveProject(); - bool saveProjectAs(const QString& fileName); - bool saveProjectPromptForFileName(); - static bool hasValidProjectFileExtension(const QString& fileName); - - bool askUserToSaveModifiedProject(); - void closeProject(); - - void addWellPathsToModel(QList wellPathFilePaths); - void addWellPathFormationsToModel(QList wellPathFilePaths); - void addWellLogsToModel(const QList& wellLogFilePaths); + QString octavePath() const; + QStringList octaveArguments() const; - void runMultiCaseSnapshots(const QString& templateProjectFileName, std::vector gridFileNames, const QString& snapshotFolderName); + bool launchProcess(const QString& program, const QStringList& arguments); + bool launchProcessForMultipleCases(const QString& program, const QStringList& arguments, const std::vector& caseIds); + void terminateProcess(); + void waitForProcess() const; - void processNonGuiEvents(); + RiaPreferences* preferences(); + void applyPreferences(const RiaPreferences* oldPreferences = nullptr); - static const char* getVersionStringApp(bool includeCrtInfo); + static QString commandLineParameterHelp(); - bool useShaders() const; + void setCacheDataObject(const QString& key, const QVariant& dataObject); + QVariant cacheDataObject(const QString& key) const; - bool showPerformanceInfo() const; + void executeCommandFile(const QString& commandFile); + void addCommandObject(RimCommandObject* commandObject); + void executeCommandObjects(); + void waitUntilCommandObjectsHasBeenProcessed(); - RINavigationPolicy navigationPolicy() const; - QString scriptDirectories() const; - QString scriptEditorPath() const; - - QString octavePath() const; - QStringList octaveArguments() const; + int launchUnitTests(); - bool launchProcess(const QString& program, const QStringList& arguments); - bool launchProcessForMultipleCases(const QString& program, const QStringList& arguments, const std::vector& caseIds); - void terminateProcess(); - void waitForProcess() const; - - RiaPreferences* preferences(); - void applyPreferences(const RiaPreferences* oldPreferences = nullptr); - - cvf::Font* defaultSceneFont(); - cvf::Font* defaultAnnotationFont(); - cvf::Font* defaultWellLabelFont(); - - QString commandLineParameterHelp() const; - void showFormattedTextInMessageBox(const QString& text); - - void setCacheDataObject(const QString& key, const QVariant& dataObject); - QVariant cacheDataObject(const QString& key) const; - - void addCommandObject(RimCommandObject* commandObject); - void executeCommandObjects(); - - int launchUnitTests(); - int launchUnitTestsWithConsole(); - - RiuMainWindow* getOrCreateAndShowMainWindow(); - RiuMainWindow* mainWindow(); - - RiuPlotMainWindow* getOrCreateMainPlotWindow(); - RiuPlotMainWindow* getOrCreateAndShowMainPlotWindow(); - RiuPlotMainWindow* mainPlotWindow(); - RiuMainWindowBase* mainWindowByID(int mainWindowID); - - static RimViewWindow* activeViewWindow(); - - bool isMain3dWindowVisible() const; - bool isMainPlotWindowVisible() const; - - void closeMainWindowIfOpenButHidden(); - void closeMainPlotWindowIfOpenButHidden(); - - void addToRecentFiles(const QString& fileName); - std::vector recentFileActions() const; - - void setStartDir(const QString& startDir); + const QString startDir() const; + void setStartDir(const QString& startDir); static std::vector readFileListFromTextFile(QString listFileName); - void waitUntilCommandObjectsHasBeenProcessed(); - void saveMainWinGeoAndDockToolBarLayout(); - void savePlotWinGeoAndDockToolBarLayout(); + cvf::Font* defaultSceneFont(); + cvf::Font* defaultAnnotationFont(); + cvf::Font* defaultWellLabelFont(); - static bool enableDevelopmentFeatures(); - static void clearAllSelections(); + // Public implementation specific overrides + virtual void initialize(); + virtual ApplicationStatus handleArguments(cvf::ProgramOptions* progOpt) = 0; + virtual int launchUnitTestsWithConsole(); + virtual void addToRecentFiles(const QString& fileName) {} + virtual void showInformationMessage(const QString& infoText) = 0; + virtual void showErrorMessage(const QString& errMsg) = 0; + virtual void cleanupBeforeProgramExit() {} -private: - void onProjectOpenedOrClosed(); - void setWindowCaptionFromAppState(); +protected: + // Protected implementation specific overrides + virtual void handleEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) = 0; + virtual void onChangedActiveReservoirView() {} + virtual void onFileSuccessfullyLoaded(const QString& fileName, RiaDefines::ImportFileType fileType) {} + virtual void onProjectBeingOpened() {} + virtual void onProjectOpened() = 0; + virtual void onProjectOpeningError(const QString& errMsg) = 0; + virtual void onProjectBeingClosed() {} + virtual void onProjectClosed() = 0; + virtual void startMonitoringWorkProgress(caf::UiProcess* uiProcess) {} + virtual void stopMonitoringWorkProgress() {} - void createMainWindow(); - void deleteMainWindow(); +protected: + cvf::ref m_defaultSceneFont; + cvf::ref m_defaultAnnotationFont; + cvf::ref m_defaultWellLabelFont; - void createMainPlotWindow(); - void deleteMainPlotWindow(); - - void loadAndUpdatePlotData(); - - void storeTreeViewState(); + caf::PdmPointer m_activeReservoirView; + caf::PdmPointer m_project; - friend RiaArgumentParser; - void setHelpText(const QString& helpText); - - bool notify(QObject *, QEvent *) override; - -private slots: - void slotWorkerProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); - -private: - caf::PdmPointer m_activeReservoirView; - caf::PdmPointer m_project; - - RiaSocketServer* m_socketServer; - - caf::UiProcess* m_workerProcess; + RiaSocketServer* m_socketServer; + caf::UiProcess* m_workerProcess; // Execute for all settings - std::list m_currentCaseIds; - QString m_currentProgram; - QStringList m_currentArguments; + std::list m_currentCaseIds; + QString m_currentProgram; + QStringList m_currentArguments; - RiaPreferences* m_preferences; + RiaPreferences* m_preferences; - std::map m_fileDialogDefaultDirectories; - QString m_startupDefaultDirectory; + std::map m_fileDialogDefaultDirectories; + QString m_startupDefaultDirectory; - cvf::ref m_defaultSceneFont; - cvf::ref m_defaultAnnotationFont; - cvf::ref m_defaultWellLabelFont; + QMap m_sessionCache; // Session cache used to store username/passwords per session - QMap m_sessionCache; // Session cache used to store username/passwords per session + std::list m_commandQueue; + QMutex m_commandQueueLock; - std::list m_commandQueue; - QMutex m_commandQueueLock; + bool m_runningWorkerProcess; - QString m_helpText; - - bool m_runningWorkerProcess; - - RiuMainWindow* m_mainWindow; - RiuPlotMainWindow* m_mainPlotWindow; - - std::unique_ptr m_recentFileActionProvider; +private: + static RiaApplication* s_riaApplication; }; + + + diff --git a/ApplicationCode/Application/RiaConsoleApplication.cpp b/ApplicationCode/Application/RiaConsoleApplication.cpp new file mode 100644 index 0000000000..aa52cba81a --- /dev/null +++ b/ApplicationCode/Application/RiaConsoleApplication.cpp @@ -0,0 +1,366 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RiaConsoleApplication.h" + +#include "RiaArgumentParser.h" +#include "RiaLogging.h" +#include "RiaPreferences.h" +#include "RiaProjectModifier.h" +#include "RiaSocketServer.h" + +#include "RicImportGeneralDataFeature.h" + +#include "cvfProgramOptions.h" +#include "cvfqtUtils.h" + +#include + +#ifdef WIN32 +#include +#endif + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaConsoleApplication* RiaConsoleApplication::instance() +{ + RiaConsoleApplication* currentConsoleApp = dynamic_cast(RiaApplication::instance()); + CAF_ASSERT(currentConsoleApp && "Should never be called from a method that isn't within the Console context"); + return currentConsoleApp; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaConsoleApplication::RiaConsoleApplication(int& argc, char** argv) + : QCoreApplication(argc, argv) + , RiaApplication() +{ + installEventFilter(this); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaConsoleApplication::~RiaConsoleApplication() +{ + RiaLogging::deleteLoggerInstance(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::initialize() +{ +#ifdef _WIN32 +#pragma warning(push) // Saves the current warning state. +#pragma warning(disable : 4996) // Temporarily disables warning 4996. + if (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) + { + freopen("CONOUT$", "w", stdout); + freopen("CONOUT$", "w", stderr); + } +#pragma warning(pop) +#endif + + RiaApplication::initialize(); + + RiaLogging::setLoggerInstance(new RiaStdOutLogger); + RiaLogging::loggerInstance()->setLevel(RI_LL_DEBUG); + + m_socketServer = new RiaSocketServer(this); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaApplication::ApplicationStatus RiaConsoleApplication::handleArguments(cvf::ProgramOptions* progOpt) +{ + CVF_ASSERT(progOpt); + + // Handling of the actual command line options + // -------------------------------------------------------- + if (cvf::Option o = progOpt->option("ignoreArgs")) + { + return KEEP_GOING; + } + + // Unit testing + // -------------------------------------------------------- + if (cvf::Option o = progOpt->option("unittest")) + { + int testReturnValue = launchUnitTestsWithConsole(); + + return testReturnValue == 0 ? RiaApplication::EXIT_COMPLETED : RiaApplication::EXIT_WITH_ERROR; + } + + if (cvf::Option o = progOpt->option("startdir")) + { + CVF_ASSERT(o.valueCount() == 1); + setStartDir(cvfqt::Utils::toQString(o.value(0))); + } + + QString projectFileName; + + if (progOpt->hasOption("last")) + { + projectFileName = preferences()->lastUsedProjectFileName; + } + + if (cvf::Option o = progOpt->option("project")) + { + CVF_ASSERT(o.valueCount() == 1); + projectFileName = cvfqt::Utils::toQString(o.value(0)); + } + + if (!projectFileName.isEmpty()) + { + cvf::ref projectModifier; + RiaApplication::ProjectLoadAction projectLoadAction = RiaApplication::PLA_NONE; + + if (cvf::Option o = progOpt->option("replaceCase")) + { + if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; + + if (o.valueCount() == 1) + { + // One argument is available, use replace case for first occurrence in the project + + QString gridFileName = cvfqt::Utils::toQString(o.safeValue(0)); + projectModifier->setReplaceCaseFirstOccurrence(gridFileName); + } + else + { + size_t optionIdx = 0; + while (optionIdx < o.valueCount()) + { + const int caseId = o.safeValue(optionIdx++).toInt(-1); + QString gridFileName = cvfqt::Utils::toQString(o.safeValue(optionIdx++)); + + if (caseId != -1 && !gridFileName.isEmpty()) + { + projectModifier->setReplaceCase(caseId, gridFileName); + } + } + } + } + + if (cvf::Option o = progOpt->option("replaceSourceCases")) + { + if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; + + if (o.valueCount() == 1) + { + // One argument is available, use replace case for first occurrence in the project + + std::vector gridFileNames = readFileListFromTextFile(cvfqt::Utils::toQString(o.safeValue(0))); + projectModifier->setReplaceSourceCasesFirstOccurrence(gridFileNames); + } + else + { + size_t optionIdx = 0; + while (optionIdx < o.valueCount()) + { + const int groupId = o.safeValue(optionIdx++).toInt(-1); + std::vector gridFileNames = + readFileListFromTextFile(cvfqt::Utils::toQString(o.safeValue(optionIdx++))); + + if (groupId != -1 && !gridFileNames.empty()) + { + projectModifier->setReplaceSourceCasesById(groupId, gridFileNames); + } + } + } + + projectLoadAction = RiaApplication::PLA_CALCULATE_STATISTICS; + } + + if (cvf::Option o = progOpt->option("replacePropertiesFolder")) + { + if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; + + if (o.valueCount() == 1) + { + QString propertiesFolder = cvfqt::Utils::toQString(o.safeValue(0)); + projectModifier->setReplacePropertiesFolderFirstOccurrence(propertiesFolder); + } + else + { + size_t optionIdx = 0; + while (optionIdx < o.valueCount()) + { + const int caseId = o.safeValue(optionIdx++).toInt(-1); + QString propertiesFolder = cvfqt::Utils::toQString(o.safeValue(optionIdx++)); + + if (caseId != -1 && !propertiesFolder.isEmpty()) + { + projectModifier->setReplacePropertiesFolder(caseId, propertiesFolder); + } + } + } + } + + loadProject(projectFileName, projectLoadAction, projectModifier.p()); + } + + if (cvf::Option o = progOpt->option("case")) + { + QStringList caseNames = cvfqt::Utils::toQStringList(o.values()); + RicImportGeneralDataFeature::OpenCaseResults results = + RicImportGeneralDataFeature::openEclipseFilesFromFileNames(caseNames); + } + + if (cvf::Option o = progOpt->option("commandFile")) + { + QString commandFile = cvfqt::Utils::toQString(o.safeValue(0)); + if (!progOpt->hasOption("startdir")) + { + QFileInfo commandFileInfo(commandFile); + QString commandDir = commandFileInfo.absolutePath(); + setStartDir(commandDir); + } + + cvf::Option projectOption = progOpt->option("commandFileProject"); + cvf::Option caseOption = progOpt->option("commandFileReplaceCases"); + if (projectOption && caseOption) + { + projectFileName = cvfqt::Utils::toQString(projectOption.value(0)); + + std::vector caseIds; + std::vector caseListFiles; + + if (caseOption.valueCount() == 1) + { + caseListFiles.push_back(cvfqt::Utils::toQString(caseOption.safeValue(0))); + } + else + { + size_t optionIdx = 0; + while (optionIdx < caseOption.valueCount()) + { + const int caseId = caseOption.safeValue(optionIdx++).toInt(-1); + QString caseListFile = cvfqt::Utils::toQString(caseOption.safeValue(optionIdx++)); + + if (caseId != -1 && !caseListFile.isEmpty()) + { + caseIds.push_back(caseId); + caseListFiles.push_back(caseListFile); + } + } + } + + if (caseIds.empty() && !caseListFiles.empty()) + { + QString caseListFile = caseListFiles[0]; + std::vector caseFiles = readFileListFromTextFile(caseListFile); + for (const QString& caseFile : caseFiles) + { + RiaProjectModifier projectModifier; + projectModifier.setReplaceCaseFirstOccurrence(caseFile); + loadProject(projectFileName, RiaApplication::PLA_NONE, &projectModifier); + executeCommandFile(commandFile); + } + } + else + { + CVF_ASSERT(caseIds.size() == caseListFiles.size()); + + std::vector> allCaseFiles; + size_t maxFiles = 0; + + for (size_t i = 0; i < caseIds.size(); ++i) + { + std::vector caseFiles = readFileListFromTextFile(caseListFiles[i]); + allCaseFiles.push_back(caseFiles); + maxFiles = std::max(caseFiles.size(), maxFiles); + } + + for (size_t i = 0; i < caseIds.size(); ++i) + { + RiaProjectModifier projectModifier; + for (size_t j = 0; j < maxFiles; ++j) + { + if (allCaseFiles[i].size() > j) + { + projectModifier.setReplaceCase(caseIds[i], allCaseFiles[i][j]); + } + } + + loadProject(projectFileName, RiaApplication::PLA_NONE, &projectModifier); + executeCommandFile(commandFile); + } + } + } + else + { + executeCommandFile(commandFile); + } + return EXIT_COMPLETED; + } + + return KEEP_GOING; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::showInformationMessage(const QString& text) +{ + RiaLogging::info(text); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::showErrorMessage(const QString& errMsg) +{ + RiaLogging::error(errMsg); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::handleEvents(QEventLoop::ProcessEventsFlags flags /*= QEventLoop::AllEvents*/) +{ + processEvents(flags); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::onProjectOpeningError(const QString& errMsg) +{ + showErrorMessage(errMsg); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::onProjectOpened() +{ + processEvents(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaConsoleApplication::onProjectClosed() +{ + processEvents(); +} + diff --git a/ApplicationCode/Application/RiaConsoleApplication.h b/ApplicationCode/Application/RiaConsoleApplication.h new file mode 100644 index 0000000000..ab7cf5565f --- /dev/null +++ b/ApplicationCode/Application/RiaConsoleApplication.h @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "RiaApplication.h" + +#include + +namespace cvf +{ +class ProgramOptions; +} + +class RiaConsoleApplication : public QCoreApplication, public RiaApplication +{ + Q_OBJECT + +public: + static RiaConsoleApplication* instance(); + + RiaConsoleApplication(int& argc, char** argv); + ~RiaConsoleApplication() override; + + // Public RiaApplication overrides + void initialize() override; + ApplicationStatus handleArguments(cvf::ProgramOptions* progOpt) override; + void showInformationMessage(const QString& text) override; + void showErrorMessage(const QString& errMsg) override; + +protected: + // Protected implementation specific overrides + void handleEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) override; + void onProjectOpeningError(const QString& errMsg) override; + void onProjectOpened(); + void onProjectClosed(); +}; + diff --git a/ApplicationCode/Application/RiaFontCache.h b/ApplicationCode/Application/RiaFontCache.h index 2ee45ba949..dbd0b7e5fe 100644 --- a/ApplicationCode/Application/RiaFontCache.h +++ b/ApplicationCode/Application/RiaFontCache.h @@ -18,6 +18,7 @@ #pragma once +#include "cafFixedAtlasFont.h" #include "cvfBase.h" #include "cvfObject.h" @@ -25,7 +26,6 @@ namespace caf { -class FixedAtlasFont; template class AppEnum; } diff --git a/ApplicationCode/Application/RiaGuiApplication.cpp b/ApplicationCode/Application/RiaGuiApplication.cpp new file mode 100644 index 0000000000..b69a1facb0 --- /dev/null +++ b/ApplicationCode/Application/RiaGuiApplication.cpp @@ -0,0 +1,1708 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2011- Statoil ASA +// Copyright (C) 2013- Ceetron Solutions AS +// Copyright (C) 2011-2012 Ceetron AS +// +// 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaGuiApplication.h" + +#include "RiaArgumentParser.h" +#include "RiaBaseDefs.h" +#include "RiaColorTables.h" +#include "RiaFilePathTools.h" +#include "RiaFontCache.h" +#include "RiaImportEclipseCaseTools.h" +#include "RiaLogging.h" +#include "RiaPreferences.h" +#include "RiaProjectModifier.h" +#include "RiaRegressionTestRunner.h" +#include "RiaSocketServer.h" +#include "RiaVersionInfo.h" +#include "RiaViewRedrawScheduler.h" + +#include "ExportCommands/RicSnapshotAllPlotsToFileFeature.h" +#include "ExportCommands/RicSnapshotAllViewsToFileFeature.h" +#include "ExportCommands/RicSnapshotViewToFileFeature.h" +#include "HoloLensCommands/RicHoloLensSessionManager.h" +#include "RicImportGeneralDataFeature.h" + +#include "Rim2dIntersectionViewCollection.h" +#include "RimAnnotationCollection.h" +#include "RimAnnotationInViewCollection.h" +#include "RimAnnotationTextAppearance.h" +#include "RimCellRangeFilterCollection.h" +#include "RimCommandObject.h" +#include "RimEclipseCaseCollection.h" +#include "RimEclipseView.h" +#include "RimFlowPlotCollection.h" +#include "RimFormationNamesCollection.h" +#include "RimFractureTemplateCollection.h" +#include "RimGeoMechCase.h" +#include "RimGeoMechCellColors.h" +#include "RimGeoMechModels.h" +#include "RimGeoMechView.h" +#include "RimGridCrossPlot.h" +#include "RimGridCrossPlotCollection.h" +#include "RimIdenticalGridCaseGroup.h" +#include "RimMainPlotCollection.h" +#include "RimObservedData.h" +#include "RimObservedDataCollection.h" +#include "RimOilField.h" +#include "RimPltPlotCollection.h" +#include "RimProject.h" +#include "RimRftPlotCollection.h" +#include "RimSaturationPressurePlot.h" +#include "RimSaturationPressurePlotCollection.h" +#include "RimSimWellInViewCollection.h" +#include "RimStimPlanColors.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" +#include "RimSummaryCaseMainCollection.h" +#include "RimSummaryCrossPlotCollection.h" +#include "RimSummaryPlot.h" +#include "RimSummaryPlotCollection.h" +#include "RimTextAnnotation.h" +#include "RimTextAnnotationInView.h" +#include "RimViewLinker.h" +#include "RimViewLinkerCollection.h" +#include "RimWellLogFile.h" +#include "RimWellLogPlot.h" +#include "RimWellLogPlotCollection.h" +#include "RimWellPathCollection.h" +#include "RimWellPathFracture.h" +#include "RimWellPltPlot.h" +#include "RimWellRftPlot.h" + +#include "Riu3dSelectionManager.h" +#include "RiuDockWidgetTools.h" +#include "RiuMainWindow.h" +#include "RiuMdiMaximizeWindowGuard.h" +#include "RiuMessagePanel.h" +#include "RiuPlotMainWindow.h" +#include "RiuProcessMonitor.h" +#include "RiuRecentFileActionProvider.h" +#include "RiuViewer.h" + +#include "cafAppEnum.h" +#include "cafEffectGenerator.h" +#include "cafFixedAtlasFont.h" +#include "cafPdmSettings.h" +#include "cafPdmUiModelChangeDetector.h" +#include "cafPdmUiTreeView.h" +#include "cafProgressInfo.h" +#include "cafQTreeViewStateSerializer.h" +#include "cafSelectionManager.h" +#include "cafUiProcess.h" +#include "cafUtils.h" + +#include "cvfProgramOptions.h" +#include "cvfqtUtils.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifndef WIN32 +#include // for usleep +#endif // WIN32 + +#ifdef USE_UNIT_TESTS +#include "gtest/gtest.h" +#endif // USE_UNIT_TESTS + +namespace caf +{ +template<> +void AppEnum::setUp() +{ + addItem(RiaGuiApplication::NAVIGATION_POLICY_CEETRON, "NAVIGATION_POLICY_CEETRON", "Ceetron"); + addItem(RiaGuiApplication::NAVIGATION_POLICY_CAD, "NAVIGATION_POLICY_CAD", "CAD"); + addItem(RiaGuiApplication::NAVIGATION_POLICY_GEOQUEST, "NAVIGATION_POLICY_GEOQUEST", "GEOQUEST"); + addItem(RiaGuiApplication::NAVIGATION_POLICY_RMS, "NAVIGATION_POLICY_RMS", "RMS"); + setDefault(RiaGuiApplication::NAVIGATION_POLICY_RMS); +} +} // namespace caf + +//================================================================================================== +/// +/// \class RiaGuiApplication +/// +/// Application class +/// +//================================================================================================== + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::isRunning() +{ + return dynamic_cast(RiaApplication::instance()) != nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaGuiApplication* RiaGuiApplication::instance() +{ + RiaGuiApplication* currentGuiApp = dynamic_cast(RiaApplication::instance()); + CAF_ASSERT(currentGuiApp && "Should never be called from a method that isn't within the GUI context"); + return currentGuiApp; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaGuiApplication::RiaGuiApplication(int& argc, char** argv) + : QApplication(argc, argv) + , RiaApplication() + , m_mainWindow(nullptr) + , m_mainPlotWindow(nullptr) +{ + // For idle processing + // m_idleTimerStarted = false; + installEventFilter(this); + + setWindowIcon(QIcon(":/AppLogo48x48.png")); + + m_recentFileActionProvider = std::unique_ptr(new RiuRecentFileActionProvider); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaGuiApplication::~RiaGuiApplication() +{ + RiuDockWidgetTools::instance()->saveDockWidgetsState(); + + deleteMainPlotWindow(); + deleteMainWindow(); + + RiaLogging::deleteLoggerInstance(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::saveProject() +{ + CVF_ASSERT(m_project.notNull()); + + if (!caf::Utils::fileExists(m_project->fileName())) + { + return saveProjectPromptForFileName(); + } + else + { + return saveProjectAs(m_project->fileName()); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::saveProjectPromptForFileName() +{ + // if (m_project.isNull()) return true; + + RiaGuiApplication* app = RiaGuiApplication::instance(); + + QString startPath; + if (!m_project->fileName().isEmpty()) + { + startPath = m_project->fileName(); + } + else + { + startPath = app->lastUsedDialogDirectory("BINARY_GRID"); + startPath += "/ResInsightProject.rsp"; + } + + QString fileName = + QFileDialog::getSaveFileName(nullptr, tr("Save File"), startPath, tr("Project Files (*.rsp);;All files(*.*)")); + if (fileName.isEmpty()) + { + return false; + } + + // Remember the directory to next time + app->setLastUsedDialogDirectory("BINARY_GRID", QFileInfo(fileName).absolutePath()); + + bool bSaveOk = saveProjectAs(fileName); + + setWindowCaptionFromAppState(); + + return bSaveOk; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::askUserToSaveModifiedProject() +{ + if (m_preferences->showProjectChangedDialog() && caf::PdmUiModelChangeDetector::instance()->isModelChanged()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + + QString questionText; + questionText = QString("The current project is modified.\n\nDo you want to save the changes?"); + + msgBox.setText(questionText); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + + int ret = msgBox.exec(); + if (ret == QMessageBox::Cancel) + { + return false; + } + else if (ret == QMessageBox::Yes) + { + if (!saveProject()) + { + return false; + } + } + else + { + caf::PdmUiModelChangeDetector::instance()->reset(); + } + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::saveProjectAs(const QString& fileName) +{ + storeTreeViewState(); + QString errMsg; + if (!RiaApplication::saveProjectAs(fileName, &errMsg)) + { + QMessageBox::warning(nullptr, "Error when saving project file", errMsg); + return false; + } + + m_recentFileActionProvider->addFileName(fileName); + caf::PdmUiModelChangeDetector::instance()->reset(); + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::loadAndUpdatePlotData() +{ + RimWellLogPlotCollection* wlpColl = nullptr; + RimSummaryPlotCollection* spColl = nullptr; + RimSummaryCrossPlotCollection* scpColl = nullptr; + RimFlowPlotCollection* flowColl = nullptr; + RimRftPlotCollection* rftColl = nullptr; + RimPltPlotCollection* pltColl = nullptr; + RimGridCrossPlotCollection* gcpColl = nullptr; + RimSaturationPressurePlotCollection* sppColl = nullptr; + + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->wellLogPlotCollection()) + { + wlpColl = m_project->mainPlotCollection()->wellLogPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->summaryPlotCollection()) + { + spColl = m_project->mainPlotCollection()->summaryPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->summaryCrossPlotCollection()) + { + scpColl = m_project->mainPlotCollection()->summaryCrossPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->flowPlotCollection()) + { + flowColl = m_project->mainPlotCollection()->flowPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->rftPlotCollection()) + { + rftColl = m_project->mainPlotCollection()->rftPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->pltPlotCollection()) + { + pltColl = m_project->mainPlotCollection()->pltPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->gridCrossPlotCollection()) + { + gcpColl = m_project->mainPlotCollection()->gridCrossPlotCollection(); + } + if (m_project->mainPlotCollection() && m_project->mainPlotCollection()->saturationPressurePlotCollection()) + { + sppColl = m_project->mainPlotCollection()->saturationPressurePlotCollection(); + } + + size_t plotCount = 0; + plotCount += wlpColl ? wlpColl->wellLogPlots().size() : 0; + plotCount += spColl ? spColl->summaryPlots().size() : 0; + plotCount += scpColl ? scpColl->summaryPlots().size() : 0; + plotCount += flowColl ? flowColl->plotCount() : 0; + plotCount += rftColl ? rftColl->rftPlots().size() : 0; + plotCount += pltColl ? pltColl->pltPlots().size() : 0; + plotCount += gcpColl ? gcpColl->gridCrossPlots().size() : 0; + plotCount += sppColl ? sppColl->plots().size() : 0; + + if (plotCount > 0) + { + caf::ProgressInfo plotProgress(plotCount, "Loading Plot Data"); + if (wlpColl) + { + for (size_t wlpIdx = 0; wlpIdx < wlpColl->wellLogPlots().size(); ++wlpIdx) + { + wlpColl->wellLogPlots[wlpIdx]->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + + if (spColl) + { + for (size_t wlpIdx = 0; wlpIdx < spColl->summaryPlots().size(); ++wlpIdx) + { + spColl->summaryPlots[wlpIdx]->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + + if (scpColl) + { + for (auto plot : scpColl->summaryPlots()) + { + plot->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + + if (flowColl) + { + plotProgress.setNextProgressIncrement(flowColl->plotCount()); + flowColl->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + + if (rftColl) + { + for (const auto& rftPlot : rftColl->rftPlots()) + { + rftPlot->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + + if (pltColl) + { + for (const auto& pltPlot : pltColl->pltPlots()) + { + pltPlot->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + + if (gcpColl) + { + for (const auto& gcpPlot : gcpColl->gridCrossPlots()) + { + gcpPlot->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + + if (sppColl) + { + for (const auto& sppPlot : sppColl->plots()) + { + sppPlot->loadDataAndUpdate(); + plotProgress.incrementProgress(); + } + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::storeTreeViewState() +{ + { + if (mainPlotWindow() && mainPlotWindow()->projectTreeView()) + { + caf::PdmUiTreeView* projectTreeView = mainPlotWindow()->projectTreeView(); + + QString treeViewState; + caf::QTreeViewStateSerializer::storeTreeViewStateToString(projectTreeView->treeView(), treeViewState); + + QModelIndex mi = projectTreeView->treeView()->currentIndex(); + + QString encodedModelIndexString; + caf::QTreeViewStateSerializer::encodeStringFromModelIndex(mi, encodedModelIndexString); + + project()->plotWindowTreeViewState = treeViewState; + project()->plotWindowCurrentModelIndexPath = encodedModelIndexString; + } + } + + { + caf::PdmUiTreeView* projectTreeView = m_mainWindow->projectTreeView(); + if (projectTreeView) + { + QString treeViewState; + caf::QTreeViewStateSerializer::storeTreeViewStateToString(projectTreeView->treeView(), treeViewState); + + QModelIndex mi = projectTreeView->treeView()->currentIndex(); + + QString encodedModelIndexString; + caf::QTreeViewStateSerializer::encodeStringFromModelIndex(mi, encodedModelIndexString); + + project()->mainWindowTreeViewState = treeViewState; + project()->mainWindowCurrentModelIndexPath = encodedModelIndexString; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::setWindowCaptionFromAppState() +{ + if (!m_mainWindow) return; + + // The stuff being done here should really be handled by Qt automatically as a result of + // setting applicationName and windowFilePath + // Was unable to make this work in Qt4.4.0! + + QString capt = RI_APPLICATION_NAME; +#ifdef _DEBUG + capt += " ##DEBUG##"; +#endif + + { + QString projFileName = m_project->fileName(); + if (projFileName.isEmpty()) projFileName = "Untitled project"; + + capt = projFileName + QString("[*]") + QString(" - ") + capt; + } + + m_mainWindow->setWindowTitle(capt); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimViewWindow* RiaGuiApplication::activePlotWindow() const +{ + RimViewWindow* viewWindow = nullptr; + + if (m_mainPlotWindow) + { + QList subwindows = m_mainPlotWindow->subWindowList(QMdiArea::StackingOrder); + if (subwindows.size() > 0) + { + viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget(subwindows.back()->widget()); + } + } + + return viewWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::useShaders() const +{ + if (!m_preferences->useShaders) return false; + + bool isShadersSupported = caf::Viewer::isShadersSupported(); + if (!isShadersSupported) return false; + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaGuiApplication::RINavigationPolicy RiaGuiApplication::navigationPolicy() const +{ + return m_preferences->navigationPolicy(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::showPerformanceInfo() const +{ + return m_preferences->showHud; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::initialize() +{ + RiaApplication::initialize(); + + applyGuiPreferences(nullptr); + + // Create main windows + // The plot window is created to be able to set expanded state on created objects, but hidden by default + getOrCreateAndShowMainWindow(); + getOrCreateMainPlotWindow(); + RiaLogging::setLoggerInstance(new RiuMessagePanelLogger(m_mainWindow->messagePanel())); + RiaLogging::loggerInstance()->setLevel(RI_LL_DEBUG); + + m_socketServer = new RiaSocketServer(this); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaApplication::ApplicationStatus RiaGuiApplication::handleArguments(cvf::ProgramOptions* progOpt) +{ + CVF_ASSERT(progOpt); + + // Handling of the actual command line options + // -------------------------------------------------------- + if (cvf::Option o = progOpt->option("ignoreArgs")) + { + return KEEP_GOING; + } + + // Unit testing + // -------------------------------------------------------- + if (cvf::Option o = progOpt->option("unittest")) + { + int testReturnValue = launchUnitTestsWithConsole(); + + return testReturnValue == 0 ? RiaApplication::EXIT_COMPLETED : RiaApplication::EXIT_WITH_ERROR; + } + + if (cvf::Option o = progOpt->option("regressiontest")) + { + CVF_ASSERT(o.valueCount() == 1); + QString regressionTestPath = cvfqt::Utils::toQString(o.value(0)); + + // Use a logger writing to stdout instead of message panel + // This is useful when executing regression tests on a build server, and this is the reason for creating the logger when + // parsing the command line options + auto stdLogger = new RiaStdOutLogger; + stdLogger->setLevel(RI_LL_DEBUG); + + RiaLogging::setLoggerInstance(stdLogger); + + RiaRegressionTestRunner::instance()->executeRegressionTests(regressionTestPath, QStringList()); + return EXIT_COMPLETED; + } + + if (cvf::Option o = progOpt->option("updateregressiontestbase")) + { + CVF_ASSERT(o.valueCount() == 1); + QString regressionTestPath = cvfqt::Utils::toQString(o.value(0)); + RiaRegressionTestRunner::instance()->updateRegressionTest(regressionTestPath); + return EXIT_COMPLETED; + } + + if (cvf::Option o = progOpt->option("startdir")) + { + CVF_ASSERT(o.valueCount() == 1); + setStartDir(cvfqt::Utils::toQString(o.value(0))); + } + + if (cvf::Option o = progOpt->option("size")) + { + RiuMainWindow* mainWnd = RiuMainWindow::instance(); + int width = o.safeValue(0).toInt(-1); + int height = o.safeValue(1).toInt(-1); + if (mainWnd && width > 0 && height > 0) + { + mainWnd->resize(width, height); + } + } + + QString projectFileName; + + if (progOpt->hasOption("last")) + { + projectFileName = preferences()->lastUsedProjectFileName; + } + + if (cvf::Option o = progOpt->option("project")) + { + CVF_ASSERT(o.valueCount() == 1); + projectFileName = cvfqt::Utils::toQString(o.value(0)); + } + + if (!projectFileName.isEmpty()) + { + if (cvf::Option o = progOpt->option("multiCaseSnapshots")) + { + QString gridListFile = cvfqt::Utils::toQString(o.safeValue(0)); + std::vector gridFiles = readFileListFromTextFile(gridListFile); + runMultiCaseSnapshots(projectFileName, gridFiles, "multiCaseSnapshots"); + + return EXIT_COMPLETED; + } + } + + if (!projectFileName.isEmpty()) + { + cvf::ref projectModifier; + RiaApplication::ProjectLoadAction projectLoadAction = RiaApplication::PLA_NONE; + + if (cvf::Option o = progOpt->option("replaceCase")) + { + if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; + + if (o.valueCount() == 1) + { + // One argument is available, use replace case for first occurrence in the project + + QString gridFileName = cvfqt::Utils::toQString(o.safeValue(0)); + projectModifier->setReplaceCaseFirstOccurrence(gridFileName); + } + else + { + size_t optionIdx = 0; + while (optionIdx < o.valueCount()) + { + const int caseId = o.safeValue(optionIdx++).toInt(-1); + QString gridFileName = cvfqt::Utils::toQString(o.safeValue(optionIdx++)); + + if (caseId != -1 && !gridFileName.isEmpty()) + { + projectModifier->setReplaceCase(caseId, gridFileName); + } + } + } + } + + if (cvf::Option o = progOpt->option("replaceSourceCases")) + { + if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; + + if (o.valueCount() == 1) + { + // One argument is available, use replace case for first occurrence in the project + + std::vector gridFileNames = readFileListFromTextFile(cvfqt::Utils::toQString(o.safeValue(0))); + projectModifier->setReplaceSourceCasesFirstOccurrence(gridFileNames); + } + else + { + size_t optionIdx = 0; + while (optionIdx < o.valueCount()) + { + const int groupId = o.safeValue(optionIdx++).toInt(-1); + std::vector gridFileNames = + readFileListFromTextFile(cvfqt::Utils::toQString(o.safeValue(optionIdx++))); + + if (groupId != -1 && !gridFileNames.empty()) + { + projectModifier->setReplaceSourceCasesById(groupId, gridFileNames); + } + } + } + + projectLoadAction = RiaApplication::PLA_CALCULATE_STATISTICS; + } + + if (cvf::Option o = progOpt->option("replacePropertiesFolder")) + { + if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; + + if (o.valueCount() == 1) + { + QString propertiesFolder = cvfqt::Utils::toQString(o.safeValue(0)); + projectModifier->setReplacePropertiesFolderFirstOccurrence(propertiesFolder); + } + else + { + size_t optionIdx = 0; + while (optionIdx < o.valueCount()) + { + const int caseId = o.safeValue(optionIdx++).toInt(-1); + QString propertiesFolder = cvfqt::Utils::toQString(o.safeValue(optionIdx++)); + + if (caseId != -1 && !propertiesFolder.isEmpty()) + { + projectModifier->setReplacePropertiesFolder(caseId, propertiesFolder); + } + } + } + } + + loadProject(projectFileName, projectLoadAction, projectModifier.p()); + } + + if (cvf::Option o = progOpt->option("case")) + { + QStringList caseNames = cvfqt::Utils::toQStringList(o.values()); + RicImportGeneralDataFeature::OpenCaseResults results = + RicImportGeneralDataFeature::openEclipseFilesFromFileNames(caseNames); + if (results && !results.eclipseSummaryFiles.empty()) + { + getOrCreateAndShowMainPlotWindow(); + } + } + + if (cvf::Option o = progOpt->option("savesnapshots")) + { + bool snapshotViews = false; + bool snapshotPlots = false; + + QStringList snapshotItemTexts = cvfqt::Utils::toQStringList(o.values()); + if (snapshotItemTexts.empty()) + { + // No options will keep backwards compatibility before we introduced snapshot of plots + snapshotViews = true; + } + + for (const QString& s : snapshotItemTexts) + { + if (s.toLower() == "all") + { + snapshotViews = true; + snapshotPlots = true; + } + else if (s.toLower() == "views") + { + snapshotViews = true; + } + else if (s.toLower() == "plots") + { + snapshotPlots = true; + } + } + + if (project() != nullptr && !project()->fileName().isEmpty()) + { + if (snapshotViews) + { + RiuMainWindow* mainWnd = RiuMainWindow::instance(); + CVF_ASSERT(mainWnd); + mainWnd->hideAllDockWindows(); + + // 2016-11-09 : Location of snapshot folder was previously located in 'snapshot' folder + // relative to current working folder. Now harmonized to behave as RiuMainWindow::slotSnapshotAllViewsToFile() + QString absolutePathToSnapshotDir = createAbsolutePathFromProjectRelativePath("snapshots"); + RicSnapshotAllViewsToFileFeature::exportSnapshotOfAllViewsIntoFolder(absolutePathToSnapshotDir); + + mainWnd->loadWinGeoAndDockToolBarLayout(); + } + + if (snapshotPlots) + { + if (mainPlotWindow()) + { + mainPlotWindow()->hideAllDockWindows(); + + // Will be saved relative to current directory + RicSnapshotAllPlotsToFileFeature::saveAllPlots(); + + mainPlotWindow()->loadWinGeoAndDockToolBarLayout(); + } + } + } + + return EXIT_COMPLETED; + } + + if (cvf::Option o = progOpt->option("commandFile")) + { + QString commandFile = cvfqt::Utils::toQString(o.safeValue(0)); + + if (!progOpt->hasOption("startdir")) + { + QFileInfo commandFileInfo(commandFile); + QString commandDir = commandFileInfo.absolutePath(); + setStartDir(commandDir); + } + + cvf::Option projectOption = progOpt->option("commandFileProject"); + cvf::Option caseOption = progOpt->option("commandFileReplaceCases"); + if (projectOption && caseOption) + { + projectFileName = cvfqt::Utils::toQString(projectOption.value(0)); + + std::vector caseIds; + std::vector caseListFiles; + + if (caseOption.valueCount() == 1) + { + caseListFiles.push_back(cvfqt::Utils::toQString(caseOption.safeValue(0))); + } + else + { + size_t optionIdx = 0; + while (optionIdx < caseOption.valueCount()) + { + const int caseId = caseOption.safeValue(optionIdx++).toInt(-1); + QString caseListFile = cvfqt::Utils::toQString(caseOption.safeValue(optionIdx++)); + + if (caseId != -1 && !caseListFile.isEmpty()) + { + caseIds.push_back(caseId); + caseListFiles.push_back(caseListFile); + } + } + } + + if (caseIds.empty() && !caseListFiles.empty()) + { + QString caseListFile = caseListFiles[0]; + std::vector caseFiles = readFileListFromTextFile(caseListFile); + for (const QString& caseFile : caseFiles) + { + RiaProjectModifier projectModifier; + projectModifier.setReplaceCaseFirstOccurrence(caseFile); + loadProject(projectFileName, RiaApplication::PLA_NONE, &projectModifier); + executeCommandFile(commandFile); + } + } + else + { + CVF_ASSERT(caseIds.size() == caseListFiles.size()); + + std::vector> allCaseFiles; + size_t maxFiles = 0; + + for (size_t i = 0; i < caseIds.size(); ++i) + { + std::vector caseFiles = readFileListFromTextFile(caseListFiles[i]); + allCaseFiles.push_back(caseFiles); + maxFiles = std::max(caseFiles.size(), maxFiles); + } + + for (size_t i = 0; i < caseIds.size(); ++i) + { + RiaProjectModifier projectModifier; + for (size_t j = 0; j < maxFiles; ++j) + { + if (allCaseFiles[i].size() > j) + { + projectModifier.setReplaceCase(caseIds[i], allCaseFiles[i][j]); + } + } + + loadProject(projectFileName, RiaApplication::PLA_NONE, &projectModifier); + executeCommandFile(commandFile); + } + } + } + else + { + executeCommandFile(commandFile); + } + return EXIT_COMPLETED; + } + + return KEEP_GOING; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RiaGuiApplication::launchUnitTestsWithConsole() +{ + // Following code is taken from cvfAssert.cpp +#ifdef WIN32 + { + // Allocate a new console for this app + // Only one console can be associated with an app, so should fail if a console is already present. + AllocConsole(); + + FILE* consoleFilePointer; + + freopen_s(&consoleFilePointer, "CONOUT$", "w", stdout); + freopen_s(&consoleFilePointer, "CONOUT$", "w", stderr); + + // Make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well + std::ios::sync_with_stdio(); + } +#endif + + return launchUnitTests(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuMainWindow* RiaGuiApplication::getOrCreateAndShowMainWindow() +{ + if (!m_mainWindow) + { + createMainWindow(); + } + return m_mainWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuMainWindow* RiaGuiApplication::mainWindow() +{ + return m_mainWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuPlotMainWindow* RiaGuiApplication::getOrCreateMainPlotWindow() +{ + if (!m_mainPlotWindow) + { + createMainPlotWindow(); + m_mainPlotWindow->initializeGuiNewProjectLoaded(); + loadAndUpdatePlotData(); + } + return m_mainPlotWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::createMainWindow() +{ + CVF_ASSERT(m_mainWindow == nullptr); + m_mainWindow = new RiuMainWindow; + QString platform = cvf::System::is64Bit() ? "(64bit)" : "(32bit)"; + m_mainWindow->setWindowTitle("ResInsight " + platform); + m_mainWindow->setDefaultWindowSize(); + m_mainWindow->setDefaultToolbarVisibility(); + m_mainWindow->loadWinGeoAndDockToolBarLayout(); + m_mainWindow->showWindow(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::deleteMainWindow() +{ + if (m_mainWindow) + { + delete m_mainWindow; + m_mainWindow = nullptr; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::createMainPlotWindow() +{ + CVF_ASSERT(m_mainPlotWindow == nullptr); + + m_mainPlotWindow = new RiuPlotMainWindow; + + m_mainPlotWindow->setWindowTitle("Plots - ResInsight"); + m_mainPlotWindow->setDefaultWindowSize(); + m_mainPlotWindow->loadWinGeoAndDockToolBarLayout(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::deleteMainPlotWindow() +{ + if (m_mainPlotWindow) + { + m_mainPlotWindow->deleteLater(); + m_mainPlotWindow = nullptr; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuPlotMainWindow* RiaGuiApplication::getOrCreateAndShowMainPlotWindow() +{ + if (!m_mainPlotWindow) + { + createMainPlotWindow(); + m_mainPlotWindow->initializeGuiNewProjectLoaded(); + loadAndUpdatePlotData(); + } + + if (m_mainPlotWindow->isMinimized()) + { + m_mainPlotWindow->showNormal(); + m_mainPlotWindow->update(); + } + else + { + m_mainPlotWindow->show(); + } + + m_mainPlotWindow->raise(); + m_mainPlotWindow->activateWindow(); + return m_mainPlotWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuPlotMainWindow* RiaGuiApplication::mainPlotWindow() +{ + return m_mainPlotWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuMainWindowBase* RiaGuiApplication::mainWindowByID(int mainWindowID) +{ + if (mainWindowID == 0) + return m_mainWindow; + else if (mainWindowID == 1) + return m_mainPlotWindow; + else + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimViewWindow* RiaGuiApplication::activeViewWindow() +{ + RimViewWindow* viewWindow = nullptr; + + QWidget* mainWindowWidget = RiaGuiApplication::activeWindow(); + + if (dynamic_cast(mainWindowWidget)) + { + viewWindow = RiaGuiApplication::instance()->activeReservoirView(); + } + else if (dynamic_cast(mainWindowWidget)) + { + RiuPlotMainWindow* mainPlotWindow = dynamic_cast(mainWindowWidget); + + QList subwindows = mainPlotWindow->subWindowList(QMdiArea::StackingOrder); + if (subwindows.size() > 0) + { + viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget(subwindows.back()->widget()); + } + } + + return viewWindow; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::isMain3dWindowVisible() const +{ + return m_mainWindow && m_mainWindow->isVisible(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::isMainPlotWindowVisible() const +{ + return m_mainPlotWindow && m_mainPlotWindow->isVisible(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::closeMainWindowIfOpenButHidden() +{ + if (m_mainWindow && !m_mainWindow->isVisible()) + { + m_mainWindow->close(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::closeMainPlotWindowIfOpenButHidden() +{ + if (m_mainPlotWindow && !m_mainPlotWindow->isVisible()) + { + m_mainPlotWindow->close(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::addToRecentFiles(const QString& fileName) +{ + CVF_ASSERT(m_recentFileActionProvider && + "The provider needs to be created before any attempts to use the recent file actions"); + m_recentFileActionProvider->addFileName(fileName); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiaGuiApplication::recentFileActions() const +{ + CVF_ASSERT(m_recentFileActionProvider && + "The provider needs to be created before any attempts to use the recent file actions"); + return m_recentFileActionProvider->actions(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::saveMainWinGeoAndDockToolBarLayout() +{ + if (isMain3dWindowVisible()) + { + m_mainWindow->saveWinGeoAndDockToolBarLayout(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::savePlotWinGeoAndDockToolBarLayout() +{ + if (isMainPlotWindowVisible()) + { + m_mainPlotWindow->saveWinGeoAndDockToolBarLayout(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::clearAllSelections() +{ + Riu3dSelectionManager::instance()->deleteAllItems(Riu3dSelectionManager::RUI_APPLICATION_GLOBAL); + Riu3dSelectionManager::instance()->deleteAllItems(Riu3dSelectionManager::RUI_TEMPORARY); + caf::SelectionManager::instance()->clearAll(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::showInformationMessage(const QString& text) +{ + QString helpText = text; + + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Information); + msgBox.setWindowTitle("ResInsight"); + + helpText.replace("&", "&"); + helpText.replace("<", "<"); + helpText.replace(">", ">"); + + helpText = QString("
%1
").arg(helpText); + msgBox.setText(helpText); + + msgBox.exec(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::showErrorMessage(const QString& errMsg) +{ + QErrorMessage errDialog(mainWindow()); + errDialog.showMessage(errMsg); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::handleEvents(QEventLoop::ProcessEventsFlags flags) +{ + processEvents(flags); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onChangedActiveReservoirView() +{ + RiuDockWidgetTools::instance()->changeDockWidgetVisibilityBasedOnView(activeReservoirView()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onFileSuccessfullyLoaded(const QString& fileName, RiaDefines::ImportFileType fileType) +{ + if (fileType & RiaDefines::ANY_ECLIPSE_FILE) + { + getOrCreateAndShowMainPlotWindow(); + } + + if (!RiaGuiApplication::hasValidProjectFileExtension(fileName)) + { + caf::PdmUiModelChangeDetector::instance()->setModelChanged(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onProjectBeingOpened() +{ + // When importing a project, do not maximize the first MDI window to be created + m_maximizeWindowGuard.reset(new RiuMdiMaximizeWindowGuard); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onProjectOpeningError(const QString& errMsg) +{ + QMessageBox::warning(nullptr, "Error when opening project file", errMsg); + m_mainWindow->setPdmRoot(nullptr); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onProjectOpened() +{ + if (m_project->show3DWindow()) + { + m_mainWindow->show(); + } + else + { + m_mainWindow->hide(); + } + + if (m_project->showPlotWindow()) + { + if (!m_mainPlotWindow) + { + createMainPlotWindow(); + m_mainPlotWindow->show(); + } + else + { + m_mainPlotWindow->show(); + m_mainPlotWindow->raise(); + } + } + else if (mainPlotWindow()) + { + mainPlotWindow()->hide(); + } + + loadAndUpdatePlotData(); + + if (m_mainWindow) + { + m_mainWindow->initializeGuiNewProjectLoaded(); + } + if (m_mainPlotWindow) + { + m_mainPlotWindow->initializeGuiNewProjectLoaded(); + } + + setWindowCaptionFromAppState(); + + m_maximizeWindowGuard.reset(); + + processEvents(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onProjectBeingClosed() +{ + RicHoloLensSessionManager::instance()->terminateSession(); + RicHoloLensSessionManager::refreshToolbarState(); + + RiaViewRedrawScheduler::instance()->clearViewsScheduledForUpdate(); + + RiaGuiApplication::clearAllSelections(); + + m_mainWindow->cleanupGuiBeforeProjectClose(); + + if (m_mainPlotWindow) + { + m_mainPlotWindow->cleanupGuiBeforeProjectClose(); + } + + caf::EffectGenerator::clearEffectCache(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::onProjectClosed() +{ + if (m_mainWindow) + { + m_mainWindow->initializeGuiNewProjectLoaded(); + } + if (m_mainPlotWindow) + { + m_mainPlotWindow->initializeGuiNewProjectLoaded(); + } + + setWindowCaptionFromAppState(); + + processEvents(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::cleanupBeforeProgramExit() +{ + closeAllWindows(); + handleEvents(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::applyGuiPreferences(const RiaPreferences* oldPreferences) +{ + if (m_activeReservoirView && m_activeReservoirView->viewer()) + { + m_activeReservoirView->viewer()->updateNavigationPolicy(); + m_activeReservoirView->viewer()->enablePerfInfoHud(m_preferences->showHud()); + } + + if (useShaders()) + { + caf::EffectGenerator::setRenderingMode(caf::EffectGenerator::SHADER_BASED); + } + else + { + caf::EffectGenerator::setRenderingMode(caf::EffectGenerator::FIXED_FUNCTION); + } + + if (m_mainWindow && m_mainWindow->projectTreeView()) + { + m_mainWindow->projectTreeView()->enableAppendOfClassNameToUiItemText(m_preferences->appendClassNameToUiText()); + if (mainPlotWindow()) + mainPlotWindow()->projectTreeView()->enableAppendOfClassNameToUiItemText(m_preferences->appendClassNameToUiText()); + } + + std::map fontSizes = m_preferences->defaultFontSizes(); + + if (this->project()) + { + std::vector allViewWindows; + project()->descendantsIncludingThisOfType(allViewWindows); + + RimWellPathCollection* wellPathCollection = this->project()->activeOilField()->wellPathCollection(); + + bool existingViewsWithDifferentMeshLines = false; + bool existingViewsWithCustomColors = false; + bool existingViewsWithCustomZScale = false; + bool existingObjectsWithCustomFonts = false; + if (oldPreferences) + { + for (auto viewWindow : allViewWindows) + { + auto rim3dView = dynamic_cast(viewWindow); + if (rim3dView) + { + if (rim3dView->meshMode() != oldPreferences->defaultMeshModeType()) + { + existingViewsWithDifferentMeshLines = true; + } + if (rim3dView->backgroundColor() != oldPreferences->defaultViewerBackgroundColor()) + { + existingViewsWithCustomColors = true; + } + if (rim3dView->scaleZ() != static_cast(oldPreferences->defaultScaleFactorZ)) + { + existingViewsWithCustomZScale = true; + } + + RimGridView* gridView = dynamic_cast(rim3dView); + if (gridView && gridView->annotationCollection()) + { + RiaFontCache::FontSize oldFontSize = oldPreferences->defaultAnnotationFontSize(); + existingObjectsWithCustomFonts = + gridView->annotationCollection()->hasTextAnnotationsWithCustomFontSize(oldFontSize); + } + RimEclipseView* eclipseView = dynamic_cast(rim3dView); + if (eclipseView) + { + if (eclipseView->wellCollection()->wellLabelColor() != oldPreferences->defaultWellLabelColor()) + { + existingViewsWithCustomColors = true; + } + } + } + + for (auto fontTypeSizePair : fontSizes) + { + RiaFontCache::FontSize oldFontSizeEnum = oldPreferences->defaultFontSizes()[fontTypeSizePair.first]; + if (oldFontSizeEnum != fontTypeSizePair.second) + { + int oldFontSize = RiaFontCache::pointSizeFromFontSizeEnum(oldFontSizeEnum); + if (viewWindow->hasCustomFontSizes(fontTypeSizePair.first, oldFontSize)) + { + existingObjectsWithCustomFonts = true; + } + } + } + } + + if (oldPreferences->defaultWellLabelColor() != wellPathCollection->wellPathLabelColor()) + { + existingViewsWithCustomColors = true; + } + } + + bool applySettingsToAllViews = false; + if (existingViewsWithCustomColors || existingViewsWithCustomZScale || existingViewsWithDifferentMeshLines || + existingObjectsWithCustomFonts) + { + QStringList changedData; + if (existingViewsWithDifferentMeshLines) changedData << "Mesh Visibility"; + if (existingViewsWithCustomColors) changedData << "Colors"; + if (existingViewsWithCustomZScale) changedData << "Z-Scale"; + if (existingObjectsWithCustomFonts) changedData << "Fonts Sizes"; + + QString listString = changedData.takeLast(); + if (!changedData.empty()) + { + listString = changedData.join(", ") + " and " + listString; + } + + QMessageBox::StandardButton reply; + reply = QMessageBox::question( + m_mainWindow, + QString("Apply %1 to Existing Views or Plots?").arg(listString), + QString("You have changed default %1 and have existing views or plots with different settings.\n") + .arg(listString) + + QString("Do you want to apply the new default settings to all existing views?"), + QMessageBox::Ok | QMessageBox::Cancel); + applySettingsToAllViews = (reply == QMessageBox::Ok); + } + + for (auto viewWindow : allViewWindows) + { + for (auto fontTypeSizePair : fontSizes) + { + RiaFontCache::FontSize oldFontSizeEnum = oldPreferences->defaultFontSizes()[fontTypeSizePair.first]; + if (oldFontSizeEnum != fontTypeSizePair.second) + { + int oldFontSize = RiaFontCache::pointSizeFromFontSizeEnum(oldFontSizeEnum); + int newFontSize = RiaFontCache::pointSizeFromFontSizeEnum(fontTypeSizePair.second); + viewWindow->applyFontSize(fontTypeSizePair.first, oldFontSize, newFontSize, applySettingsToAllViews); + } + } + + auto rim3dView = dynamic_cast(viewWindow); + if (rim3dView) + { + if (oldPreferences && (applySettingsToAllViews || rim3dView->meshMode() == oldPreferences->defaultMeshModeType())) + { + rim3dView->meshMode = m_preferences->defaultMeshModeType(); + } + + if (oldPreferences && + (applySettingsToAllViews || rim3dView->backgroundColor() == oldPreferences->defaultViewerBackgroundColor())) + { + rim3dView->setBackgroundColor(m_preferences->defaultViewerBackgroundColor()); + rim3dView->applyBackgroundColorAndFontChanges(); + } + + if (oldPreferences && + (applySettingsToAllViews || rim3dView->scaleZ == static_cast(oldPreferences->defaultScaleFactorZ()))) + { + rim3dView->scaleZ = static_cast(m_preferences->defaultScaleFactorZ()); + rim3dView->updateScaling(); + if (rim3dView == activeViewWindow()) + { + RiuMainWindow::instance()->updateScaleValue(); + } + } + + RimEclipseView* eclipseView = dynamic_cast(rim3dView); + if (eclipseView) + { + if (oldPreferences && (applySettingsToAllViews || eclipseView->wellCollection()->wellLabelColor() == + oldPreferences->defaultWellLabelColor())) + { + eclipseView->wellCollection()->wellLabelColor = m_preferences->defaultWellLabelColor(); + } + eclipseView->scheduleReservoirGridGeometryRegen(); + } + rim3dView->scheduleCreateDisplayModelAndRedraw(); + } + } + + if (oldPreferences) + { + bool matchingColor = wellPathCollection->wellPathLabelColor() == oldPreferences->defaultWellLabelColor(); + if (applySettingsToAllViews || matchingColor) + { + wellPathCollection->wellPathLabelColor = oldPreferences->defaultWellLabelColor(); + } + + if (oldPreferences->defaultPlotFontSize() != m_preferences->defaultPlotFontSize()) + { + m_mainWindow->applyFontSizesToDockedPlots(); + } + } + + std::vector uiEditorsToUpdate; + caf::SelectionManager::instance()->selectedItems(uiEditorsToUpdate); + + for (caf::PdmUiItem* uiItem : uiEditorsToUpdate) + { + uiItem->updateConnectedEditors(); + } + } + caf::PdmUiItem::enableExtraDebugText(m_preferences->appendFieldKeywordToToolTipText()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::startMonitoringWorkProgress(caf::UiProcess* uiProcess) +{ + m_mainWindow->processMonitor()->startMonitorWorkProcess(m_workerProcess); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::stopMonitoringWorkProgress() +{ + m_mainWindow->processMonitor()->stopMonitorWorkProcess(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::slotWorkerProcessFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + m_mainWindow->processMonitor()->stopMonitorWorkProcess(); + + // Execute delete later so that other slots that are hooked up + // get a chance to run before we delete the object + if (m_workerProcess) + { + m_workerProcess->close(); + } + m_workerProcess = nullptr; + + // Either the work process crashed or was aborted by the user + if (exitStatus == QProcess::CrashExit) + { + // MFLog::error("Simulation execution crashed or was aborted."); + m_runningWorkerProcess = false; + return; + } + + executeCommandObjects(); + + // Exit code != 0 means we have an error + if (exitCode != 0) + { + // MFLog::error(QString("Simulation execution failed (exit code %1).").arg(exitCode)); + m_runningWorkerProcess = false; + return; + } + + // If multiple cases are present, invoke launchProcess() which will set next current case, and run script on this case + if (!m_currentCaseIds.empty()) + { + launchProcess(m_currentProgram, m_currentArguments); + } + else + { + // Disable concept of current case + m_socketServer->setCurrentCaseId(-1); + m_runningWorkerProcess = false; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaGuiApplication::runMultiCaseSnapshots(const QString& templateProjectFileName, + std::vector gridFileNames, + const QString& snapshotFolderName) +{ + if (!m_mainWindow) return; + + m_mainWindow->hideAllDockWindows(); + + const size_t numGridFiles = gridFileNames.size(); + for (size_t i = 0; i < numGridFiles; i++) + { + QString gridFn = gridFileNames[i]; + + RiaProjectModifier modifier; + modifier.setReplaceCaseFirstOccurrence(gridFn); + + bool loadOk = loadProject(templateProjectFileName, PLA_NONE, &modifier); + if (loadOk) + { + RicSnapshotAllViewsToFileFeature::exportSnapshotOfAllViewsIntoFolder(snapshotFolderName); + } + } + + m_mainWindow->loadWinGeoAndDockToolBarLayout(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaGuiApplication::notify(QObject* receiver, QEvent* event) +{ + // Pre-allocating a memory exhaustion message + // Doing som e trickery to avoid deadlock, as creating a messagebox actually triggers a call to this notify method. + + static QMessageBox* memoryExhaustedBox = nullptr; + static bool allocatingMessageBox = false; + if (!memoryExhaustedBox && !allocatingMessageBox) + { + allocatingMessageBox = true; + memoryExhaustedBox = new QMessageBox(QMessageBox::Critical, + "ResInsight Exhausted Memory", + "Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now " + "unstable and will probably crash soon."); + } + + bool done = true; + try + { + done = QApplication::notify(receiver, event); + } + catch (const std::bad_alloc&) + { + if (memoryExhaustedBox) memoryExhaustedBox->exec(); + std::cout << "ResInsight: Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now unstable " + "and will probably crash soon." + << std::endl; + // If we really want to crash instead of limping forward: + // throw; + } + + return done; +} diff --git a/ApplicationCode/Application/RiaGuiApplication.h b/ApplicationCode/Application/RiaGuiApplication.h new file mode 100644 index 0000000000..5b1ae44b22 --- /dev/null +++ b/ApplicationCode/Application/RiaGuiApplication.h @@ -0,0 +1,174 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaApplication.h" +#include "RiaDefines.h" + +#include "cafPdmObject.h" +#include "cafPdmField.h" +#include "cvfBase.h" +#include "cvfObject.h" + +#include +#include +#include +#include + +#include +#include + +class QAction; + +class Drawable; + +class RIProcess; + +class RiaPreferences; +class RiaProjectModifier; +class RiaSocketServer; + +class RigEclipseCaseData; + +class RimCommandObject; +class RimEclipseCase; +class RimEclipseView; +class RimGridView; +class RimProject; +class RimSummaryPlot; +class Rim3dView; +class RimViewWindow; +class RimWellLogPlot; +class RimWellAllocationPlot; + +class RiuMainWindow; +class RiuMainWindowBase; +class RiuMdiMaximizeWindowGuard; +class RiuPlotMainWindow; +class RiuRecentFileActionProvider; +class RiaArgumentParser; + +//================================================================================================== +// +// +// +//================================================================================================== +class RiaGuiApplication : public QApplication, public RiaApplication +{ + Q_OBJECT + +public: + enum RINavigationPolicy + { + NAVIGATION_POLICY_CEETRON, + NAVIGATION_POLICY_CAD, + NAVIGATION_POLICY_GEOQUEST, + NAVIGATION_POLICY_RMS + }; + +public: + static bool isRunning(); + static RiaGuiApplication* instance(); + + RiaGuiApplication(int& argc, char** argv); + ~RiaGuiApplication() override; + + bool saveProject(); + bool saveProjectPromptForFileName(); + bool askUserToSaveModifiedProject(); + bool saveProjectAs(const QString& fileName); + + void runMultiCaseSnapshots(const QString& templateProjectFileName, std::vector gridFileNames, const QString& snapshotFolderName); + bool useShaders() const; + bool showPerformanceInfo() const; + + RINavigationPolicy navigationPolicy() const; + + RiuMainWindow* getOrCreateAndShowMainWindow(); + RiuMainWindow* mainWindow(); + RimViewWindow* activePlotWindow() const; + + RiuPlotMainWindow* getOrCreateMainPlotWindow(); + RiuPlotMainWindow* getOrCreateAndShowMainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow(); + RiuMainWindowBase* mainWindowByID(int mainWindowID); + + static RimViewWindow* activeViewWindow(); + + bool isMain3dWindowVisible() const; + bool isMainPlotWindowVisible() const; + + void closeMainWindowIfOpenButHidden(); + void closeMainPlotWindowIfOpenButHidden(); + + std::vector recentFileActions() const; + + void saveMainWinGeoAndDockToolBarLayout(); + void savePlotWinGeoAndDockToolBarLayout(); + + static void clearAllSelections(); + void applyGuiPreferences(const RiaPreferences* oldPreferences = nullptr); + + // Public RiaApplication overrides + void initialize() override; + ApplicationStatus handleArguments(cvf::ProgramOptions* progOpt) override; + int launchUnitTestsWithConsole() override; + void addToRecentFiles(const QString& fileName) override; + void showInformationMessage(const QString& text) override; + void showErrorMessage(const QString& errMsg) override; + void cleanupBeforeProgramExit() override; +protected: + // Protected RiaApplication overrides + void handleEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) override; + void onChangedActiveReservoirView() override; + void onFileSuccessfullyLoaded(const QString& fileName, RiaDefines::ImportFileType fileType) override; + void onProjectBeingOpened() override; + void onProjectOpeningError(const QString& errMsg); + void onProjectOpened() override; + void onProjectBeingClosed() override; + void onProjectClosed() override; + void startMonitoringWorkProgress(caf::UiProcess* uiProcess) override; + void stopMonitoringWorkProgress() override; + +private: + void setWindowCaptionFromAppState(); + + void createMainWindow(); + void deleteMainWindow(); + + void createMainPlotWindow(); + void deleteMainPlotWindow(); + + void loadAndUpdatePlotData(); + + void storeTreeViewState(); + + bool notify(QObject *, QEvent *) override; + +private slots: + void slotWorkerProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); + +private: + RiuMainWindow* m_mainWindow; + RiuPlotMainWindow* m_mainPlotWindow; + + std::unique_ptr m_recentFileActionProvider; + + std::unique_ptr m_maximizeWindowGuard; +}; diff --git a/ApplicationCode/Application/RiaMain.cpp b/ApplicationCode/Application/RiaMain.cpp index 6d1ec7ba41..48234621b0 100644 --- a/ApplicationCode/Application/RiaMain.cpp +++ b/ApplicationCode/Application/RiaMain.cpp @@ -16,30 +16,62 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RiaApplication.h" +#include "RiaArgumentParser.h" +#include "RiaConsoleApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" +#include "cvfProgramOptions.h" +#include "cvfqtUtils.h" + +RiaApplication* createApplication(int &argc, char *argv[]) +{ + for (int i = 1; i < argc; ++i) + { + if (!qstrcmp(argv[i], "--console") || !qstrcmp(argv[i], "--unittest")) + { + return new RiaConsoleApplication(argc, argv); + } + } + return new RiaGuiApplication(argc, argv); +} + int main(int argc, char *argv[]) { RiaLogging::loggerInstance()->setLevel(RI_LL_DEBUG); - RiaApplication app(argc, argv); + std::unique_ptr app (createApplication(argc, argv)); + app->initialize(); + cvf::ProgramOptions progOpt; + + bool result = RiaArgumentParser::parseArguments(&progOpt); + + if (!result) + { + const cvf::String usageText = progOpt.usageText(110, 30); + app->showInformationMessage(RiaApplication::commandLineParameterHelp() + cvfqt::Utils::toQString(usageText)); + app->cleanupBeforeProgramExit(); + } + QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates)); setlocale(LC_NUMERIC,"C"); - int unitTestResult = app.parseArgumentsAndRunUnitTestsIfRequested(); - if (unitTestResult > -1) + RiaApplication::ApplicationStatus status = app->handleArguments(&progOpt); + if (status == RiaApplication::EXIT_COMPLETED) { - return unitTestResult; + return 0; } - - if (app.parseArguments()) + else if (status == RiaApplication::EXIT_WITH_ERROR) + { + return 1; + } + else if (status == RiaApplication::KEEP_GOING) { int exitCode = 0; try { - exitCode = app.exec(); + exitCode = QCoreApplication::instance()->exec(); } catch (std::exception& exep ) { @@ -55,6 +87,7 @@ int main(int argc, char *argv[]) return exitCode; } - return 0; + CVF_ASSERT(false && "Unknown ApplicationStatus"); + return -1; } diff --git a/ApplicationCode/Application/RiaMemoryCleanup.cpp b/ApplicationCode/Application/RiaMemoryCleanup.cpp index 48c3af41ce..f1ef6698c9 100644 --- a/ApplicationCode/Application/RiaMemoryCleanup.cpp +++ b/ApplicationCode/Application/RiaMemoryCleanup.cpp @@ -223,13 +223,13 @@ QList RiaMemoryCleanup::calculateValueOptions(const caf: std::vector eclipseCases = proj->eclipseCases(); for (RimEclipseCase* c : eclipseCases) { - options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIconProvider())); } std::vector geoMechCases = proj->geoMechCases(); for (RimGeoMechCase* c : geoMechCases) { - options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIconProvider())); } } } diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp index 540fa0db56..51048614f3 100644 --- a/ApplicationCode/Application/RiaPreferences.cpp +++ b/ApplicationCode/Application/RiaPreferences.cpp @@ -49,7 +49,7 @@ CAF_PDM_SOURCE_INIT(RiaPreferences, "RiaPreferences"); //-------------------------------------------------------------------------------------------------- RiaPreferences::RiaPreferences(void) { - CAF_PDM_InitField(&navigationPolicy, "navigationPolicy", caf::AppEnum(RiaApplication::NAVIGATION_POLICY_RMS), "Navigation Mode", "", "", ""); + CAF_PDM_InitField(&navigationPolicy, "navigationPolicy", caf::AppEnum(RiaGuiApplication::NAVIGATION_POLICY_RMS), "Navigation Mode", "", "", ""); CAF_PDM_InitFieldNoDefault(&scriptDirectories, "scriptDirectory", "Shared Script Folder(s)", "", "", ""); scriptDirectories.uiCapability()->setUiEditorTypeName(caf::PdmUiFilePathEditor::uiEditorTypeName()); diff --git a/ApplicationCode/Application/RiaPreferences.h b/ApplicationCode/Application/RiaPreferences.h index d7c8139153..3c7fe59dea 100644 --- a/ApplicationCode/Application/RiaPreferences.h +++ b/ApplicationCode/Application/RiaPreferences.h @@ -22,6 +22,7 @@ #pragma once #include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaDefines.h" #include "RiaFontCache.h" @@ -65,7 +66,7 @@ public: std::map defaultFontSizes() const; public: // Pdm Fields - caf::PdmField > navigationPolicy; + caf::PdmField > navigationPolicy; caf::PdmField scriptDirectories; caf::PdmField scriptEditorExecutable; diff --git a/ApplicationCode/Application/Tools/RiaArgumentParser.cpp b/ApplicationCode/Application/Tools/RiaArgumentParser.cpp index 48c4adf2eb..82910e652e 100644 --- a/ApplicationCode/Application/Tools/RiaArgumentParser.cpp +++ b/ApplicationCode/Application/Tools/RiaArgumentParser.cpp @@ -17,7 +17,6 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiaArgumentParser.h" - #include "RiaApplication.h" #include "RiaBaseDefs.h" #include "RiaEclipseFileNameTools.h" @@ -50,489 +49,77 @@ #include #include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaArgumentParser::parseArguments() +bool RiaArgumentParser::parseArguments(cvf::ProgramOptions* progOpt) { - cvf::ProgramOptions progOpt; - progOpt.registerOption("last", "", "Open last used project."); - progOpt.registerOption("project", "", "Open project file .", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("case", + CVF_ASSERT(progOpt); + progOpt->registerOption("console", "", "Run as a console application without Graphics"); + progOpt->registerOption("last", "", "Open last used project."); + progOpt->registerOption("project", "", "Open project file .", cvf::ProgramOptions::SINGLE_VALUE); + progOpt->registerOption("case", "", "If case or grid filename, import simulation grid data. If summary file name, import summary data", cvf::ProgramOptions::MULTI_VALUE); - progOpt.registerOption("startdir", "", "Set startup directory.", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("savesnapshots", + progOpt->registerOption("startdir", "", "Set startup directory.", cvf::ProgramOptions::SINGLE_VALUE); + progOpt->registerOption("savesnapshots", "all|views|plots", "Save snapshot of all views or plots to project file location sub folder 'snapshots'. Option 'all' " "will include both views and plots. Application closes after snapshots have been written.", cvf::ProgramOptions::OPTIONAL_MULTI_VALUE); - progOpt.registerOption( + progOpt->registerOption( "size", " ", "Set size of the main application window.", cvf::ProgramOptions::MULTI_VALUE); - progOpt.registerOption( + progOpt->registerOption( "replaceCase", "[] ", "Replace grid in or first case with . Repeat parameter for multiple replace operations.", cvf::ProgramOptions::MULTI_VALUE, cvf::ProgramOptions::COMBINE_REPEATED); - progOpt.registerOption("replaceSourceCases", + progOpt->registerOption("replaceSourceCases", "[] ", "Replace source cases in or first grid case group with the grid files listed in the " " file. Repeat parameter for multiple replace operations.", cvf::ProgramOptions::MULTI_VALUE, cvf::ProgramOptions::COMBINE_REPEATED); - progOpt.registerOption("replacePropertiesFolder", + progOpt->registerOption("replacePropertiesFolder", "[] ", "Replace the folder containing property files for an eclipse input case.", cvf::ProgramOptions::MULTI_VALUE); - progOpt.registerOption("multiCaseSnapshots", + progOpt->registerOption("multiCaseSnapshots", "", "For each grid file listed in the file, replace the first case in the project and save " "snapshot of all views.", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("commandFile", "", "Execute the command file.", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption( + progOpt->registerOption("commandFile", "", "Execute the command file.", cvf::ProgramOptions::SINGLE_VALUE); + progOpt->registerOption( "commandFileProject", "", "Project to use if performing case looping for command file. Used in conjunction with 'commandFileReplaceCases'.", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("commandFileReplaceCases", + progOpt->registerOption("commandFileReplaceCases", "[] ", "Supply list of cases to replace in project, performing command file for each case.", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("help", "", "Displays help text."); - progOpt.registerOption("?", "", "Displays help text."); - progOpt.registerOption("regressiontest", "", "System command", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("updateregressiontestbase", "", "System command", cvf::ProgramOptions::SINGLE_VALUE); - progOpt.registerOption("unittest", "", "System command"); - progOpt.registerOption("ignoreArgs", "", "Ignore all arguments. Mostly for testing purposes"); + progOpt->registerOption("help", "", "Displays help text."); + progOpt->registerOption("?", "", "Displays help text."); + progOpt->registerOption("regressiontest", "", "System command", cvf::ProgramOptions::SINGLE_VALUE); + progOpt->registerOption("updateregressiontestbase", "", "System command", cvf::ProgramOptions::SINGLE_VALUE); + progOpt->registerOption("unittest", "", "System command"); + progOpt->registerOption("ignoreArgs", "", "Ignore all arguments. Mostly for testing purposes"); - progOpt.setOptionPrefix(cvf::ProgramOptions::DOUBLE_DASH); - - QString helpText = QString("\n%1 v. %2\n").arg(RI_APPLICATION_NAME).arg(RiaApplication::getVersionStringApp(false)); - helpText += "Copyright Equinor ASA, Ceetron Solution AS, Ceetron AS\n\n"; - - const cvf::String usageText = progOpt.usageText(110, 30); - helpText += cvfqt::Utils::toQString(usageText); - - RiaApplication::instance()->setHelpText(helpText); + progOpt->setOptionPrefix(cvf::ProgramOptions::DOUBLE_DASH); QStringList arguments = QCoreApplication::arguments(); - - bool parseOk = progOpt.parse(cvfqt::Utils::toStringVector(arguments)); + + bool parseOk = progOpt->parse(cvfqt::Utils::toStringVector(arguments)); // If positional parameter functionality is to be supported, the test for existence of positionalParameters must be removed // This is based on a pull request by @andlaus https://github.com/OPM/ResInsight/pull/162 - if (!parseOk || progOpt.hasOption("help") || progOpt.hasOption("?") || !progOpt.positionalParameters().empty()) + if (!parseOk || progOpt->hasOption("help") || progOpt->hasOption("?") || !progOpt->positionalParameters().empty()) { -#if defined(_MSC_VER) && defined(_WIN32) - RiaApplication::instance()->showFormattedTextInMessageBox(helpText); -#else - fprintf(stdout, "%s\n", helpText.toLatin1().data()); - fflush(stdout); -#endif return false; } - - // Handling of the actual command line options - // -------------------------------------------------------- - - if (cvf::Option o = progOpt.option("ignoreArgs")) - { - return true; - } - - if (cvf::Option o = progOpt.option("regressiontest")) - { - CVF_ASSERT(o.valueCount() == 1); - QString regressionTestPath = cvfqt::Utils::toQString(o.value(0)); - - // Use a logger writing to stdout instead of message panel - // This is useful when executing regression tests on a build server, and this is the reason for creating the logger when - // parsing the command line options - auto stdLogger = new RiaStdOutLogger; - stdLogger->setLevel(RI_LL_DEBUG); - - RiaLogging::setLoggerInstance(stdLogger); - - RiaRegressionTestRunner::instance()->executeRegressionTests(regressionTestPath, QStringList()); - return false; - } - - if (cvf::Option o = progOpt.option("updateregressiontestbase")) - { - CVF_ASSERT(o.valueCount() == 1); - QString regressionTestPath = cvfqt::Utils::toQString(o.value(0)); - RiaRegressionTestRunner::instance()->updateRegressionTest(regressionTestPath); - return false; - } - - if (cvf::Option o = progOpt.option("startdir")) - { - CVF_ASSERT(o.valueCount() == 1); - RiaApplication::instance()->setStartDir(cvfqt::Utils::toQString(o.value(0))); - } - - if (cvf::Option o = progOpt.option("size")) - { - RiuMainWindow* mainWnd = RiuMainWindow::instance(); - int width = o.safeValue(0).toInt(-1); - int height = o.safeValue(1).toInt(-1); - if (mainWnd && width > 0 && height > 0) - { - mainWnd->resize(width, height); - } - } - - QString projectFileName; - - if (progOpt.hasOption("last")) - { - projectFileName = RiaApplication::instance()->preferences()->lastUsedProjectFileName; - } - - if (cvf::Option o = progOpt.option("project")) - { - CVF_ASSERT(o.valueCount() == 1); - projectFileName = cvfqt::Utils::toQString(o.value(0)); - } - - if (!projectFileName.isEmpty()) - { - if (cvf::Option o = progOpt.option("multiCaseSnapshots")) - { - QString gridListFile = cvfqt::Utils::toQString(o.safeValue(0)); - std::vector gridFiles = RiaApplication::readFileListFromTextFile(gridListFile); - RiaApplication::instance()->runMultiCaseSnapshots(projectFileName, gridFiles, "multiCaseSnapshots"); - - return false; - } - } - - if (!projectFileName.isEmpty()) - { - cvf::ref projectModifier; - RiaApplication::ProjectLoadAction projectLoadAction = RiaApplication::PLA_NONE; - - if (cvf::Option o = progOpt.option("replaceCase")) - { - if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; - - if (o.valueCount() == 1) - { - // One argument is available, use replace case for first occurrence in the project - - QString gridFileName = cvfqt::Utils::toQString(o.safeValue(0)); - projectModifier->setReplaceCaseFirstOccurrence(gridFileName); - } - else - { - size_t optionIdx = 0; - while (optionIdx < o.valueCount()) - { - const int caseId = o.safeValue(optionIdx++).toInt(-1); - QString gridFileName = cvfqt::Utils::toQString(o.safeValue(optionIdx++)); - - if (caseId != -1 && !gridFileName.isEmpty()) - { - projectModifier->setReplaceCase(caseId, gridFileName); - } - } - } - } - - if (cvf::Option o = progOpt.option("replaceSourceCases")) - { - if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; - - if (o.valueCount() == 1) - { - // One argument is available, use replace case for first occurrence in the project - - std::vector gridFileNames = - RiaApplication::readFileListFromTextFile(cvfqt::Utils::toQString(o.safeValue(0))); - projectModifier->setReplaceSourceCasesFirstOccurrence(gridFileNames); - } - else - { - size_t optionIdx = 0; - while (optionIdx < o.valueCount()) - { - const int groupId = o.safeValue(optionIdx++).toInt(-1); - std::vector gridFileNames = - RiaApplication::readFileListFromTextFile(cvfqt::Utils::toQString(o.safeValue(optionIdx++))); - - if (groupId != -1 && !gridFileNames.empty()) - { - projectModifier->setReplaceSourceCasesById(groupId, gridFileNames); - } - } - } - - projectLoadAction = RiaApplication::PLA_CALCULATE_STATISTICS; - } - - if (cvf::Option o = progOpt.option("replacePropertiesFolder")) - { - if (projectModifier.isNull()) projectModifier = new RiaProjectModifier; - - if (o.valueCount() == 1) - { - QString propertiesFolder = cvfqt::Utils::toQString(o.safeValue(0)); - projectModifier->setReplacePropertiesFolderFirstOccurrence(propertiesFolder); - } - else - { - size_t optionIdx = 0; - while (optionIdx < o.valueCount()) - { - const int caseId = o.safeValue(optionIdx++).toInt(-1); - QString propertiesFolder = cvfqt::Utils::toQString(o.safeValue(optionIdx++)); - - if (caseId != -1 && !propertiesFolder.isEmpty()) - { - projectModifier->setReplacePropertiesFolder(caseId, propertiesFolder); - } - } - } - } - - RiaApplication::instance()->loadProject(projectFileName, projectLoadAction, projectModifier.p()); - } - - if (cvf::Option o = progOpt.option("case")) - { - QStringList caseNames = cvfqt::Utils::toQStringList(o.values()); - for (const QString& caseName : caseNames) - { - openCaseFromCommandLineParameter(caseName); - } - } - - if (cvf::Option o = progOpt.option("savesnapshots")) - { - bool snapshotViews = false; - bool snapshotPlots = false; - - QStringList snapshotItemTexts = cvfqt::Utils::toQStringList(o.values()); - if (snapshotItemTexts.empty()) - { - // No options will keep backwards compatibility before we introduced snapshot of plots - snapshotViews = true; - } - - for (const QString& s : snapshotItemTexts) - { - if (s.toLower() == "all") - { - snapshotViews = true; - snapshotPlots = true; - } - else if (s.toLower() == "views") - { - snapshotViews = true; - } - else if (s.toLower() == "plots") - { - snapshotPlots = true; - } - } - - if (RiaApplication::instance()->project() != nullptr && !RiaApplication::instance()->project()->fileName().isEmpty()) - { - if (snapshotViews) - { - RiuMainWindow* mainWnd = RiuMainWindow::instance(); - CVF_ASSERT(mainWnd); - mainWnd->hideAllDockWindows(); - - // 2016-11-09 : Location of snapshot folder was previously located in 'snapshot' folder - // relative to current working folder. Now harmonized to behave as RiuMainWindow::slotSnapshotAllViewsToFile() - QString absolutePathToSnapshotDir = - RiaApplication::instance()->createAbsolutePathFromProjectRelativePath("snapshots"); - RicSnapshotAllViewsToFileFeature::exportSnapshotOfAllViewsIntoFolder(absolutePathToSnapshotDir); - - mainWnd->loadWinGeoAndDockToolBarLayout(); - } - - if (snapshotPlots) - { - if (RiaApplication::instance()->mainPlotWindow()) - { - RiaApplication::instance()->mainPlotWindow()->hideAllDockWindows(); - - // Will be saved relative to current directory - RicSnapshotAllPlotsToFileFeature::saveAllPlots(); - - RiaApplication::instance()->mainPlotWindow()->loadWinGeoAndDockToolBarLayout(); - } - } - } - - // Returning false will exit the application - return false; - } - - if (cvf::Option o = progOpt.option("commandFile")) - { - QString commandFile = cvfqt::Utils::toQString(o.safeValue(0)); - - cvf::Option projectOption = progOpt.option("commandFileProject"); - cvf::Option caseOption = progOpt.option("commandFileReplaceCases"); - if (projectOption && caseOption) - { - projectFileName = cvfqt::Utils::toQString(projectOption.value(0)); - - std::vector caseIds; - std::vector caseListFiles; - - if (caseOption.valueCount() == 1) - { - caseListFiles.push_back(cvfqt::Utils::toQString(caseOption.safeValue(0))); - } - else - { - size_t optionIdx = 0; - while (optionIdx < caseOption.valueCount()) - { - const int caseId = caseOption.safeValue(optionIdx++).toInt(-1); - QString caseListFile = cvfqt::Utils::toQString(caseOption.safeValue(optionIdx++)); - - if (caseId != -1 && !caseListFile.isEmpty()) - { - caseIds.push_back(caseId); - caseListFiles.push_back(caseListFile); - } - } - } - - if (caseIds.empty() && !caseListFiles.empty()) - { - QString caseListFile = caseListFiles[0]; - std::vector caseFiles = RiaApplication::readFileListFromTextFile(caseListFile); - for (const QString& caseFile : caseFiles) - { - RiaProjectModifier projectModifier; - projectModifier.setReplaceCaseFirstOccurrence(caseFile); - RiaApplication::instance()->loadProject(projectFileName, RiaApplication::PLA_NONE, &projectModifier); - executeCommandFile(commandFile); - } - } - else - { - CVF_ASSERT(caseIds.size() == caseListFiles.size()); - - std::vector> allCaseFiles; - size_t maxFiles = 0; - - for (size_t i = 0; i < caseIds.size(); ++i) - { - std::vector caseFiles = RiaApplication::readFileListFromTextFile(caseListFiles[i]); - allCaseFiles.push_back(caseFiles); - maxFiles = std::max(caseFiles.size(), maxFiles); - } - - for (size_t i = 0; i < caseIds.size(); ++i) - { - RiaProjectModifier projectModifier; - for (size_t j = 0; j < maxFiles; ++j) - { - if (allCaseFiles[i].size() > j) - { - projectModifier.setReplaceCase(caseIds[i], allCaseFiles[i][j]); - } - } - - RiaApplication::instance()->loadProject(projectFileName, RiaApplication::PLA_NONE, &projectModifier); - executeCommandFile(commandFile); - } - } - } - else - { - executeCommandFile(commandFile); - } - return false; - } - return true; } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaArgumentParser::executeCommandFile(const QString& commandFile) -{ - QFile file(commandFile); - RicfMessages messages; - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - // TODO : Error logging? - return; - } - - QTextStream in(&file); - RicfCommandFileExecutor::instance()->executeCommands(in); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaArgumentParser::openCaseFromCommandLineParameter(const QString& parameter) -{ - if (RiaEclipseFileNameTools::isProjectFile(parameter)) - { - return RiaApplication::instance()->loadProject(parameter); - } - - QStringList gridFileNames; - QStringList summarySpecFileNames; - - if (RiaEclipseFileNameTools::isGridFile(parameter)) - { - QFileInfo fi(parameter); - - gridFileNames.push_back(fi.absoluteFilePath()); - } - else if (RiaEclipseFileNameTools::isSummarySpecFile(parameter)) - { - QFileInfo fi(parameter); - - summarySpecFileNames.push_back(fi.absoluteFilePath()); - } - else - { - RiaEclipseFileNameTools fileNameTools(parameter); - - { - QString gridFileName = fileNameTools.findRelatedGridFile(); - if (!gridFileName.isEmpty()) - { - gridFileNames.push_back(gridFileName); - } - } - - QString summarySpecFileName = fileNameTools.findRelatedSummarySpecFile(); - if (!summarySpecFileName.isEmpty()) - { - summarySpecFileNames.push_back(summarySpecFileName); - } - } - - bool openCaseResult = true; - - // Open summary cases first. Then, the open of grid file will not open an already open summary case file - if (!summarySpecFileNames.empty()) - { - openCaseResult &= RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(summarySpecFileNames); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); - } - - for (const auto& f : gridFileNames) - { - openCaseResult &= RiaImportEclipseCaseTools::openEclipseCasesFromFile(QStringList({f}), nullptr, true); - } - - return openCaseResult; -} diff --git a/ApplicationCode/Application/Tools/RiaArgumentParser.h b/ApplicationCode/Application/Tools/RiaArgumentParser.h index 6a0d6dc212..a7e249da44 100644 --- a/ApplicationCode/Application/Tools/RiaArgumentParser.h +++ b/ApplicationCode/Application/Tools/RiaArgumentParser.h @@ -20,6 +20,10 @@ #include +namespace cvf +{ +class ProgramOptions; +} //================================================================================================== // // @@ -28,10 +32,6 @@ class RiaArgumentParser { public: - static bool parseArguments(); - -private: - static void executeCommandFile(const QString& commandFile); - static bool openCaseFromCommandLineParameter(const QString& parameter); + static bool parseArguments(cvf::ProgramOptions* progOpt); }; diff --git a/ApplicationCode/Application/Tools/RiaOptionItemFactory.cpp b/ApplicationCode/Application/Tools/RiaOptionItemFactory.cpp index c8b275cc04..9e7dd835a2 100644 --- a/ApplicationCode/Application/Tools/RiaOptionItemFactory.cpp +++ b/ApplicationCode/Application/Tools/RiaOptionItemFactory.cpp @@ -43,7 +43,7 @@ void RiaOptionItemFactory::appendOptionItemFromViewNameAndCaseName(Rim3dView* vi QString displayName = caseName + " : " + view->name(); - QIcon icon = view->uiCapability()->uiIcon(); + caf::QIconProvider iconProvider = view->uiCapability()->uiIconProvider(); - optionItems->push_back(caf::PdmOptionItemInfo(displayName, view, false, icon)); + optionItems->push_back(caf::PdmOptionItemInfo(displayName, view, false, iconProvider)); } diff --git a/ApplicationCode/Application/Tools/RiaRegressionTestRunner.cpp b/ApplicationCode/Application/Tools/RiaRegressionTestRunner.cpp index 3b8e34ec07..0fcdc3ec02 100644 --- a/ApplicationCode/Application/Tools/RiaRegressionTestRunner.cpp +++ b/ApplicationCode/Application/Tools/RiaRegressionTestRunner.cpp @@ -18,7 +18,7 @@ #include "RiaRegressionTestRunner.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaGitDiff.h" #include "RiaImageCompareReporter.h" #include "RiaImageFileCompare.h" @@ -504,7 +504,7 @@ void RiaRegressionTestRunner::resizeMaximizedPlotWindows() RimProject* proj = RiaApplication::instance()->project(); if (!proj) return; - RiuPlotMainWindow* plotMainWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* plotMainWindow = RiaGuiApplication::instance()->mainPlotWindow(); if (!plotMainWindow) return; std::vector viewWindows; diff --git a/ApplicationCode/CommandFileInterface/RicfCreateSaturationPressurePlots.cpp b/ApplicationCode/CommandFileInterface/RicfCreateSaturationPressurePlots.cpp index 2d2a98c323..622c4272a6 100644 --- a/ApplicationCode/CommandFileInterface/RicfCreateSaturationPressurePlots.cpp +++ b/ApplicationCode/CommandFileInterface/RicfCreateSaturationPressurePlots.cpp @@ -21,7 +21,7 @@ #include "GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RimEclipseResultCase.h" @@ -79,5 +79,5 @@ void RicfCreateSaturationPressurePlots::execute() RimSaturationPressurePlotCollection* collection = project->mainPlotCollection()->saturationPressurePlotCollection(); collection->updateAllRequiredEditors(); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); } diff --git a/ApplicationCode/CommandFileInterface/RicfExportMultiCaseSnapshots.cpp b/ApplicationCode/CommandFileInterface/RicfExportMultiCaseSnapshots.cpp index 55df684399..c56bc5da49 100644 --- a/ApplicationCode/CommandFileInterface/RicfExportMultiCaseSnapshots.cpp +++ b/ApplicationCode/CommandFileInterface/RicfExportMultiCaseSnapshots.cpp @@ -20,7 +20,7 @@ #include "RicfCommandFileExecutor.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RiaProjectModifier.h" @@ -39,6 +39,12 @@ RicfExportMultiCaseSnapshots::RicfExportMultiCaseSnapshots() //-------------------------------------------------------------------------------------------------- void RicfExportMultiCaseSnapshots::execute() { + RiaGuiApplication* app = RiaGuiApplication::instance(); + if (!app) + { + RiaLogging::error("exportMultiCaseSnapshots: Requires GUI Application"); + return; + } if (m_gridListFile().isNull()) { RiaLogging::error("exportMultiCaseSnapshots: Required parameter gridListFile."); @@ -53,5 +59,5 @@ void RicfExportMultiCaseSnapshots::execute() } std::vector listFileNames = RiaApplication::readFileListFromTextFile(m_gridListFile()); - RiaApplication::instance()->runMultiCaseSnapshots(lastProjectPath, listFileNames, RicfCommandFileExecutor::instance()->getExportPath(RicfCommandFileExecutor::SNAPSHOTS)); + app->runMultiCaseSnapshots(lastProjectPath, listFileNames, RicfCommandFileExecutor::instance()->getExportPath(RicfCommandFileExecutor::SNAPSHOTS)); } diff --git a/ApplicationCode/CommandFileInterface/RicfExportSnapshots.cpp b/ApplicationCode/CommandFileInterface/RicfExportSnapshots.cpp index 633bc85a49..bc3f8a6a46 100644 --- a/ApplicationCode/CommandFileInterface/RicfExportSnapshots.cpp +++ b/ApplicationCode/CommandFileInterface/RicfExportSnapshots.cpp @@ -23,7 +23,8 @@ #include "ExportCommands/RicSnapshotAllPlotsToFileFeature.h" #include "ExportCommands/RicSnapshotAllViewsToFileFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" +#include "RiaLogging.h" #include "RiuMainWindow.h" @@ -57,10 +58,16 @@ RicfExportSnapshots::RicfExportSnapshots() //-------------------------------------------------------------------------------------------------- void RicfExportSnapshots::execute() { + if (!RiaGuiApplication::isRunning()) + { + RiaLogging::error(QString("RicfExportSnapshot: Command cannot run without a GUI")); + return; + } + RiuMainWindow* mainWnd = RiuMainWindow::instance(); CVF_ASSERT(mainWnd); mainWnd->hideAllDockWindows(); - RiaApplication::instance()->processEvents(); + RiaGuiApplication::instance()->processEvents(); QString absolutePathToSnapshotDir = RicfCommandFileExecutor::instance()->getExportPath(RicfCommandFileExecutor::SNAPSHOTS); if (absolutePathToSnapshotDir.isNull()) @@ -77,5 +84,5 @@ void RicfExportSnapshots::execute() } mainWnd->loadWinGeoAndDockToolBarLayout(); - RiaApplication::instance()->processEvents(); + RiaGuiApplication::instance()->processEvents(); } diff --git a/ApplicationCode/CommandFileInterface/RicfOpenProject.cpp b/ApplicationCode/CommandFileInterface/RicfOpenProject.cpp index 2a0d3461fe..bffdbff2ab 100644 --- a/ApplicationCode/CommandFileInterface/RicfOpenProject.cpp +++ b/ApplicationCode/CommandFileInterface/RicfOpenProject.cpp @@ -24,6 +24,9 @@ #include "RiaLogging.h" #include "RiaRegressionTestRunner.h" +#include +#include + CAF_PDM_SOURCE_INIT(RicfOpenProject, "openProject"); //-------------------------------------------------------------------------------------------------- @@ -39,7 +42,14 @@ RicfOpenProject::RicfOpenProject() //-------------------------------------------------------------------------------------------------- void RicfOpenProject::execute() { - bool ok = RiaApplication::instance()->loadProject(m_path); + QString projectPath = m_path; + QFileInfo projectPathInfo(projectPath); + if (!projectPathInfo.exists()) + { + QDir startDir(RiaApplication::instance()->startDir()); + projectPath = startDir.absoluteFilePath(m_path); + } + bool ok = RiaApplication::instance()->loadProject(projectPath); if (!ok) { RiaLogging::error(QString("openProject: Unable to open project at %1").arg(m_path())); @@ -51,5 +61,5 @@ void RicfOpenProject::execute() RiaRegressionTestRunner::regressionTestConfigureProject(); } - RicfCommandFileExecutor::instance()->setLastProjectPath(m_path); + RicfCommandFileExecutor::instance()->setLastProjectPath(projectPath); } diff --git a/ApplicationCode/Commands/ApplicationCommands/RicCloseProjectFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicCloseProjectFeature.cpp index 30c1fd1612..00b940fedf 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicCloseProjectFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicCloseProjectFeature.cpp @@ -18,7 +18,7 @@ #include "RicCloseProjectFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include @@ -39,9 +39,8 @@ void RicCloseProjectFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RiaApplication* app = RiaApplication::instance(); - - if (!app->askUserToSaveModifiedProject()) return; + RiaGuiApplication* app = RiaGuiApplication::instance(); + if (!app || !app->askUserToSaveModifiedProject()) return; app->closeProject(); } diff --git a/ApplicationCode/Commands/ApplicationCommands/RicEditPreferencesFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicEditPreferencesFeature.cpp index ff94eeeda4..e3639c0ddb 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicEditPreferencesFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicEditPreferencesFeature.cpp @@ -18,7 +18,7 @@ #include "RicEditPreferencesFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaPreferences.h" #include "RiuPropertyViewTabWidget.h" @@ -44,7 +44,7 @@ void RicEditPreferencesFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); QStringList tabNames = app->preferences()->tabNames(); @@ -57,6 +57,7 @@ void RicEditPreferencesFeature::onActionTriggered(bool isChecked) // Write preferences using QSettings and apply them to the application caf::PdmSettings::writeFieldsToApplicationStore(app->preferences()); app->applyPreferences(oldPreferences.get()); + app->applyGuiPreferences(oldPreferences.get()); } else { diff --git a/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp index 5233b6f6a1..09bc949b34 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp @@ -18,7 +18,7 @@ #include "RicExitApplicationFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuMainWindow.h" #include @@ -41,7 +41,7 @@ void RicExitApplicationFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); if (!app->askUserToSaveModifiedProject()) return; // Hide all windows first to make sure they get closed properly diff --git a/ApplicationCode/Commands/ApplicationCommands/RicHelpFeatures.cpp b/ApplicationCode/Commands/ApplicationCommands/RicHelpFeatures.cpp index 9d3d560719..89c91f7c5e 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicHelpFeatures.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicHelpFeatures.cpp @@ -147,7 +147,7 @@ void RicHelpCommandLineFeature::onActionTriggered(bool isChecked) RiaApplication* app = RiaApplication::instance(); QString text = app->commandLineParameterHelp(); - app->showFormattedTextInMessageBox(text); + app->showInformationMessage(text); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ApplicationCommands/RicOpenLastUsedFileFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicOpenLastUsedFileFeature.cpp index 70c7580d35..82815def1c 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicOpenLastUsedFileFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicOpenLastUsedFileFeature.cpp @@ -40,7 +40,7 @@ bool RicOpenLastUsedFileFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicOpenLastUsedFileFeature::onActionTriggered(bool isChecked) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); if (!app->askUserToSaveModifiedProject()) return; diff --git a/ApplicationCode/Commands/ApplicationCommands/RicOpenProjectFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicOpenProjectFeature.cpp index 6cd939a452..1cba9fc3cd 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicOpenProjectFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicOpenProjectFeature.cpp @@ -18,7 +18,7 @@ #include "RicOpenProjectFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuMainWindow.h" @@ -41,7 +41,7 @@ bool RicOpenProjectFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicOpenProjectFeature::onActionTriggered(bool isChecked) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); if (!app->askUserToSaveModifiedProject()) return; diff --git a/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectAsFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectAsFeature.cpp index a8616fb13e..1b2efee34a 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectAsFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectAsFeature.cpp @@ -20,7 +20,7 @@ #include "RicSaveProjectFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include @@ -42,9 +42,12 @@ void RicSaveProjectAsFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RiaApplication* app = RiaApplication::instance(); - - app->saveProjectPromptForFileName(); + RiaGuiApplication* app = RiaGuiApplication::instance(); + if (app) + { + app->saveProjectPromptForFileName(); + } + } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectFeature.cpp index 8a5c33c660..8690066de4 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicSaveProjectFeature.cpp @@ -18,7 +18,7 @@ #include "RicSaveProjectFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include @@ -39,7 +39,7 @@ void RicSaveProjectFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); app->saveProject(); } diff --git a/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp index 032cb6e252..eafbaca629 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp @@ -18,7 +18,7 @@ #include "RicShowPlotDataFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimGridCrossPlot.h" #include "RimGridCrossPlotCurve.h" @@ -211,7 +211,7 @@ void RicShowPlotDataFeature::onActionTriggered(bool isChecked) return; } - RiuPlotMainWindow* plotwindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* plotwindow = RiaGuiApplication::instance()->mainPlotWindow(); CVF_ASSERT(plotwindow); for (RimSummaryPlot* summaryPlot : selectedSummaryPlots) @@ -248,7 +248,7 @@ void RicShowPlotDataFeature::setupActionLook(QAction* actionToSetup) //-------------------------------------------------------------------------------------------------- void RicShowPlotDataFeature::showTabbedTextWindow(RiuTabbedTextProvider* textProvider) { - RiuPlotMainWindow* plotwindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* plotwindow = RiaGuiApplication::instance()->mainPlotWindow(); CVF_ASSERT(plotwindow); RiuTabbedTextDialog* textWidget = new RiuTabbedTextDialog(textProvider); @@ -263,7 +263,7 @@ void RicShowPlotDataFeature::showTabbedTextWindow(RiuTabbedTextProvider* textPro //-------------------------------------------------------------------------------------------------- void RicShowPlotDataFeature::showTextWindow(const QString& title, const QString& text) { - RiuPlotMainWindow* plotwindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* plotwindow = RiaGuiApplication::instance()->mainPlotWindow(); CVF_ASSERT(plotwindow); RiuTextDialog* textWiget = new RiuTextDialog(); diff --git a/ApplicationCode/Commands/ApplicationCommands/RicShowPlotWindowFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicShowPlotWindowFeature.cpp index 92f6ca31f8..a296d53e20 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicShowPlotWindowFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicShowPlotWindowFeature.cpp @@ -18,7 +18,7 @@ #include "RicShowPlotWindowFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include @@ -39,7 +39,7 @@ void RicShowPlotWindowFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp index fb105f5fb1..a898152d6c 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp @@ -19,12 +19,12 @@ #include "RicTileWindowsFeature.h" +#include "RiaGuiApplication.h" #include "RiuMainWindow.h" #include "RiuPlotMainWindow.h" #include #include -#include "RiaApplication.h" CAF_CMD_SOURCE_INIT(RicTileWindowsFeature, "RicTileWindowsFeature"); @@ -80,9 +80,9 @@ void RicTileWindowsFeature::setupActionLook(QAction* actionToSetup) //-------------------------------------------------------------------------------------------------- bool RicTileWindowsFeature::isCommandChecked() { - if (RiaApplication::instance()->mainWindow()) + if (RiaGuiApplication::instance()->mainWindow()) { - return RiaApplication::instance()->mainWindow()->subWindowsAreTiled(); + return RiaGuiApplication::instance()->mainWindow()->subWindowsAreTiled(); } return false; } @@ -94,7 +94,7 @@ CAF_CMD_SOURCE_INIT(RicTilePlotWindowsFeature, "RicTilePlotWindowsFeature"); //-------------------------------------------------------------------------------------------------- bool RicTilePlotWindowsFeature::isCommandEnabled() { - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); if (mainPlotWindow) { return mainPlotWindow->isAnyMdiSubWindowVisible(); @@ -108,7 +108,7 @@ bool RicTilePlotWindowsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicTilePlotWindowsFeature::onActionTriggered(bool isChecked) { - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); if (mainPlotWindow) { if (!mainPlotWindow->subWindowsAreTiled()) @@ -137,9 +137,9 @@ void RicTilePlotWindowsFeature::setupActionLook(QAction* actionToSetup) //-------------------------------------------------------------------------------------------------- bool RicTilePlotWindowsFeature::isCommandChecked() { - if (RiaApplication::instance()->mainPlotWindow()) + if (RiaGuiApplication::instance()->mainPlotWindow()) { - return RiaApplication::instance()->mainPlotWindow()->subWindowsAreTiled(); + return RiaGuiApplication::instance()->mainPlotWindow()->subWindowsAreTiled(); } return false; } diff --git a/ApplicationCode/Commands/ExportCommands/RicSnapshotAllPlotsToFileFeature.cpp b/ApplicationCode/Commands/ExportCommands/RicSnapshotAllPlotsToFileFeature.cpp index 548cbaccde..cfb961ee61 100644 --- a/ApplicationCode/Commands/ExportCommands/RicSnapshotAllPlotsToFileFeature.cpp +++ b/ApplicationCode/Commands/ExportCommands/RicSnapshotAllPlotsToFileFeature.cpp @@ -18,7 +18,7 @@ #include "RicSnapshotAllPlotsToFileFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RimMainPlotCollection.h" @@ -48,7 +48,7 @@ CAF_CMD_SOURCE_INIT(RicSnapshotAllPlotsToFileFeature, "RicSnapshotAllPlotsToFile //-------------------------------------------------------------------------------------------------- void RicSnapshotAllPlotsToFileFeature::saveAllPlots() { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); RiuPlotMainWindow* mainPlotWindow = app->mainPlotWindow(); if (!mainPlotWindow) return; @@ -119,9 +119,9 @@ bool RicSnapshotAllPlotsToFileFeature::isCommandEnabled() void RicSnapshotAllPlotsToFileFeature::onActionTriggered(bool isChecked) { QWidget* currentActiveWidget = nullptr; - if (RiaApplication::activeViewWindow()) + if (RiaGuiApplication::activeViewWindow()) { - currentActiveWidget = RiaApplication::activeViewWindow()->viewWidget(); + currentActiveWidget = RiaGuiApplication::activeViewWindow()->viewWidget(); } RicSnapshotAllPlotsToFileFeature::saveAllPlots(); diff --git a/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp b/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp index 2d880c5cef..ceac51fa33 100644 --- a/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp +++ b/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp @@ -18,7 +18,7 @@ #include "RicSnapshotAllViewsToFileFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RiaViewRedrawScheduler.h" @@ -151,9 +151,9 @@ bool RicSnapshotAllViewsToFileFeature::isCommandEnabled() void RicSnapshotAllViewsToFileFeature::onActionTriggered(bool isChecked) { QWidget* currentActiveWidget = nullptr; - if (RiaApplication::activeViewWindow()) + if (RiaGuiApplication::activeViewWindow()) { - currentActiveWidget = RiaApplication::activeViewWindow()->viewWidget(); + currentActiveWidget = RiaGuiApplication::activeViewWindow()->viewWidget(); } RicSnapshotAllViewsToFileFeature::saveAllViews(); diff --git a/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToClipboardFeature.cpp b/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToClipboardFeature.cpp index 79e7002aa0..ff5afcbc47 100644 --- a/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToClipboardFeature.cpp +++ b/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToClipboardFeature.cpp @@ -19,7 +19,7 @@ #include "RicSnapshotViewToClipboardFeature.h" #include "RicGridStatisticsDialog.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RimMainPlotCollection.h" @@ -82,7 +82,7 @@ void RicSnapshotViewToClipboardFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - RimViewWindow* viewWindow = RiaApplication::activeViewWindow(); + RimViewWindow* viewWindow = RiaGuiApplication::activeViewWindow(); if (viewWindow) { diff --git a/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToFileFeature.cpp b/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToFileFeature.cpp index c0e8520031..4faa429f7e 100644 --- a/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToFileFeature.cpp +++ b/ApplicationCode/Commands/ExportCommands/RicSnapshotViewToFileFeature.cpp @@ -18,7 +18,7 @@ #include "RicSnapshotViewToFileFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RimMainPlotCollection.h" @@ -135,7 +135,7 @@ void RicSnapshotViewToFileFeature::onActionTriggered(bool isChecked) // If this is done after the file save dialog is displayed (and closed) // app->activeViewWindow() returns nullptr on Linux - RimViewWindow* viewWindow = RiaApplication::activeViewWindow(); + RimViewWindow* viewWindow = RiaGuiApplication::activeViewWindow(); if (!viewWindow) { RiaLogging::error("No view window is available, nothing to do"); diff --git a/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp index a0d32c9007..8b9d0aa85a 100644 --- a/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp +++ b/ApplicationCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp @@ -18,7 +18,7 @@ #include "RicPlotProductionRateFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaPreferences.h" #include "RifEclipseSummaryAddress.h" @@ -184,7 +184,7 @@ void RicPlotProductionRateFeature::onActionTriggered(bool isChecked) if (summaryPlotToSelect) { - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); if (mainPlotWindow) { mainPlotWindow->selectAsCurrentItem(summaryPlotToSelect); diff --git a/ApplicationCode/Commands/FlowCommands/RicSelectViewUI.cpp b/ApplicationCode/Commands/FlowCommands/RicSelectViewUI.cpp index e5c54e2a43..19ff6609ab 100644 --- a/ApplicationCode/Commands/FlowCommands/RicSelectViewUI.cpp +++ b/ApplicationCode/Commands/FlowCommands/RicSelectViewUI.cpp @@ -104,10 +104,10 @@ QList RicSelectViewUI::calculateValueOptions(const caf:: { for (Rim3dView* v : m_currentCase->views()) { - QIcon icon = v->uiCapability()->uiIcon(); + caf::QIconProvider iconProvider = v->uiCapability()->uiIconProvider(); QString displayName = v->name(); - options.push_back(caf::PdmOptionItemInfo(displayName, v, false, icon)); + options.push_back(caf::PdmOptionItemInfo(displayName, v, false, iconProvider)); } } } diff --git a/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFromPlotFeature.cpp b/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFromPlotFeature.cpp index dc275d9442..e19fdbf96c 100644 --- a/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFromPlotFeature.cpp +++ b/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFromPlotFeature.cpp @@ -18,7 +18,7 @@ #include "RicShowContributingWellsFromPlotFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RicShowContributingWellsFeatureImpl.h" @@ -36,7 +36,7 @@ CAF_CMD_SOURCE_INIT(RicShowContributingWellsFromPlotFeature, "RicShowContributin bool RicShowContributingWellsFromPlotFeature::isCommandEnabled() { RimWellAllocationPlot* wellAllocationPlot = - dynamic_cast(RiaApplication::instance()->activePlotWindow()); + dynamic_cast(RiaGuiApplication::instance()->activePlotWindow()); if (wellAllocationPlot) return true; @@ -49,7 +49,7 @@ bool RicShowContributingWellsFromPlotFeature::isCommandEnabled() void RicShowContributingWellsFromPlotFeature::onActionTriggered(bool isChecked) { RimWellAllocationPlot* wellAllocationPlot = - dynamic_cast(RiaApplication::instance()->activePlotWindow()); + dynamic_cast(RiaGuiApplication::instance()->activePlotWindow()); if (!wellAllocationPlot) return; diff --git a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotDataSetFeature.cpp b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotDataSetFeature.cpp index dd64da706d..e5bda407be 100644 --- a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotDataSetFeature.cpp +++ b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotDataSetFeature.cpp @@ -17,7 +17,7 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RicCreateGridCrossPlotDataSetFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimGridCrossPlot.h" #include "RimGridCrossPlotDataSet.h" @@ -49,7 +49,7 @@ void RicCreateGridCrossPlotDataSetFeature::onActionTriggered(bool isChecked) RimGridCrossPlotDataSet* dataSet = crossPlot->createDataSet(); dataSet->loadDataAndUpdate(true); - RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RiuPlotMainWindowTools::selectAsCurrentItem(dataSet); } diff --git a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotFeature.cpp b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotFeature.cpp index b25e39c465..b0702b4986 100644 --- a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotFeature.cpp +++ b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateGridCrossPlotFeature.cpp @@ -17,7 +17,7 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RicCreateGridCrossPlotFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimEclipseView.h" #include "RimGridCrossPlot.h" @@ -71,7 +71,7 @@ void RicCreateGridCrossPlotFeature::onActionTriggered(bool isChecked) plot->updateConnectedEditors(); collection->updateAllRequiredEditors(); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); RiuPlotMainWindowTools::selectAsCurrentItem(dataSet); } diff --git a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp index a290bccfe6..3018c39ee9 100644 --- a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp +++ b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp @@ -19,7 +19,7 @@ #include "RicCreateSaturationPressurePlotsFeature.h" #include "RicSaturationPressureUi.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RiaPorosityModel.h" @@ -147,7 +147,7 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked) RicSaturationPressureUi saturationPressureUi; saturationPressureUi.setSelectedCase(eclipseCases[0]); - RiuPlotMainWindow* plotwindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* plotwindow = RiaGuiApplication::instance()->mainPlotWindow(); caf::PdmUiPropertyViewDialog propertyDialog( plotwindow, &saturationPressureUi, "Select Case to create Pressure Saturation plots", ""); @@ -182,7 +182,7 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked) } collection->updateAllRequiredEditors(); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); if (objectToSelect) { diff --git a/ApplicationCode/Commands/GridCrossPlotCommands/RicPasteGridCrossPlotDataSetFeature.cpp b/ApplicationCode/Commands/GridCrossPlotCommands/RicPasteGridCrossPlotDataSetFeature.cpp index 999937fab3..ff6d4339f6 100644 --- a/ApplicationCode/Commands/GridCrossPlotCommands/RicPasteGridCrossPlotDataSetFeature.cpp +++ b/ApplicationCode/Commands/GridCrossPlotCommands/RicPasteGridCrossPlotDataSetFeature.cpp @@ -18,7 +18,7 @@ #include "RicPasteGridCrossPlotDataSetFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimGridCrossPlot.h" #include "RimGridCrossPlotDataSet.h" #include "RiuPlotMainWindowTools.h" @@ -70,7 +70,7 @@ void RicPasteGridCrossPlotDataSetFeature::onActionTriggered(bool isChecked) } - RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); crossPlot->updateAllRequiredEditors(); crossPlot->loadDataAndUpdate(); diff --git a/ApplicationCode/Commands/MeasurementCommands/RicToggleMeasurementModeFeature.cpp b/ApplicationCode/Commands/MeasurementCommands/RicToggleMeasurementModeFeature.cpp index 07074bc241..a4e426d3e7 100644 --- a/ApplicationCode/Commands/MeasurementCommands/RicToggleMeasurementModeFeature.cpp +++ b/ApplicationCode/Commands/MeasurementCommands/RicToggleMeasurementModeFeature.cpp @@ -18,7 +18,7 @@ #include "RicToggleMeasurementModeFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "Rim3dView.h" #include "RimMeasurement.h" @@ -110,7 +110,10 @@ bool RicToggleMeasurementModeFeature::isCommandChecked() //-------------------------------------------------------------------------------------------------- RimMeasurement* RicToggleMeasurementModeFeature::measurement() const { - return RiaApplication::instance()->project()->measurement(); + RiaGuiApplication* app = RiaGuiApplication::instance(); + CAF_ASSERT(app && app->project()); + + return app->project()->measurement(); } //-------------------------------------------------------------------------------------------------- @@ -118,7 +121,9 @@ RimMeasurement* RicToggleMeasurementModeFeature::measurement() const //-------------------------------------------------------------------------------------------------- Rim3dView* RicToggleMeasurementModeFeature::activeView() const { - auto view = RiaApplication::instance()->activeReservoirView(); + RiaApplication* app = RiaApplication::instance(); + CAF_ASSERT(app); + auto view = app->activeReservoirView(); return view; } diff --git a/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp index 9766037dd6..17ad88711d 100644 --- a/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicCloseSummaryCaseFeature.cpp @@ -18,7 +18,7 @@ #include "RicCloseSummaryCaseFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaSummaryTools.h" #include "RimMainPlotCollection.h" @@ -70,7 +70,7 @@ void RicCloseSummaryCaseFeature::deleteSummaryCases(std::vector summaryCaseMainCollection->updateAllRequiredEditors(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); caf::AsyncPdmObjectVectorDeleter summaryCaseDeleter(cases); diff --git a/ApplicationCode/Commands/RicCloseSummaryCaseInCollectionFeature.cpp b/ApplicationCode/Commands/RicCloseSummaryCaseInCollectionFeature.cpp index 7a6429ee31..9d83e2adb4 100644 --- a/ApplicationCode/Commands/RicCloseSummaryCaseInCollectionFeature.cpp +++ b/ApplicationCode/Commands/RicCloseSummaryCaseInCollectionFeature.cpp @@ -18,7 +18,7 @@ #include "RicCloseSummaryCaseInCollectionFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RicCloseSummaryCaseFeature.h" @@ -94,7 +94,7 @@ void RicCloseSummaryCaseInCollectionFeature::onActionTriggered(bool isChecked) RicCloseSummaryCaseFeature::deleteSummaryCases(collectionSummaryCases); } - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } diff --git a/ApplicationCode/Commands/RicCreateTemporaryLgrFeature.cpp b/ApplicationCode/Commands/RicCreateTemporaryLgrFeature.cpp index d13090c4f7..6a429bf347 100644 --- a/ApplicationCode/Commands/RicCreateTemporaryLgrFeature.cpp +++ b/ApplicationCode/Commands/RicCreateTemporaryLgrFeature.cpp @@ -18,7 +18,7 @@ #include "RicCreateTemporaryLgrFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaCellDividingTools.h" #include "RiaCompletionTypeCalculationScheduler.h" #include "RiaLogging.h" @@ -110,7 +110,9 @@ void RicCreateTemporaryLgrFeature::createLgrsForWellPaths(std::vectorclearAllSelections(); deleteAllCachedData(eclipseCase); RiaApplication::instance()->project()->mainPlotCollection()->deleteAllCachedData(); diff --git a/ApplicationCode/Commands/RicDeleteItemExec.cpp b/ApplicationCode/Commands/RicDeleteItemExec.cpp index a4f10ee4bb..a5d12b5883 100644 --- a/ApplicationCode/Commands/RicDeleteItemExec.cpp +++ b/ApplicationCode/Commands/RicDeleteItemExec.cpp @@ -21,7 +21,7 @@ #include "RicDeleteItemExec.h" #include "RicDeleteItemExecData.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "Rim3dView.h" #include "RimAnnotationCollection.h" @@ -204,7 +204,7 @@ void RicDeleteItemExec::redo() { wellLogPlot->calculateAvailableDepthRange(); wellLogPlot->updateDepthZoom(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateWellLogPlotToolBar(); } @@ -213,7 +213,7 @@ void RicDeleteItemExec::redo() if (wellLogPlotTrack) { wellLogPlotTrack->calculateXZoomRangeAndUpdateQwt(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateWellLogPlotToolBar(); } @@ -232,7 +232,7 @@ void RicDeleteItemExec::redo() project->updateConnectedEditors(); } } - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateWellLogPlotToolBar(); } @@ -273,7 +273,7 @@ void RicDeleteItemExec::redo() if (summaryPlotCollection) { summaryPlotCollection->updateSummaryNameHasChanged(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } @@ -281,7 +281,7 @@ void RicDeleteItemExec::redo() parentObj->firstAncestorOrThisOfType(summaryCrossPlotCollection); if (summaryCrossPlotCollection) { - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } diff --git a/ApplicationCode/Commands/RicDeleteTemporaryLgrsFeature.cpp b/ApplicationCode/Commands/RicDeleteTemporaryLgrsFeature.cpp index 14630fe89f..55c3332ada 100644 --- a/ApplicationCode/Commands/RicDeleteTemporaryLgrsFeature.cpp +++ b/ApplicationCode/Commands/RicDeleteTemporaryLgrsFeature.cpp @@ -19,7 +19,7 @@ #include "RicDeleteTemporaryLgrsFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimEclipseCase.h" #include "RimGridCollection.h" @@ -37,7 +37,7 @@ CAF_CMD_SOURCE_INIT(RicDeleteTemporaryLgrsFeature, "RicDeleteTemporaryLgrsFeatur //-------------------------------------------------------------------------------------------------- void RicDeleteTemporaryLgrsFeature::deleteAllTemporaryLgrs(RimEclipseCase* eclipseCase) { - RiaApplication::clearAllSelections(); + RiaGuiApplication::clearAllSelections(); if (eclipseCase) { diff --git a/ApplicationCode/Commands/RicImportGeneralDataFeature.cpp b/ApplicationCode/Commands/RicImportGeneralDataFeature.cpp index 2e1a485996..d84ee40e6d 100644 --- a/ApplicationCode/Commands/RicImportGeneralDataFeature.cpp +++ b/ApplicationCode/Commands/RicImportGeneralDataFeature.cpp @@ -40,7 +40,7 @@ CAF_CMD_SOURCE_INIT(RicImportGeneralDataFeature, "RicImportGeneralDataFeature"); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RicImportGeneralDataFeature::openEclipseFilesFromFileNames(const QStringList& fileNames) +RicImportGeneralDataFeature::OpenCaseResults RicImportGeneralDataFeature::openEclipseFilesFromFileNames(const QStringList& fileNames) { CVF_ASSERT(!fileNames.empty()); @@ -66,23 +66,35 @@ bool RicImportGeneralDataFeature::openEclipseFilesFromFileNames(const QStringLis } } - bool allSucceeded = true; + OpenCaseResults results; if (!eclipseCaseFiles.empty()) { - allSucceeded = allSucceeded && openEclipseCaseFromFileNames(eclipseCaseFiles); - RiaApplication::instance()->setLastUsedDialogDirectory(defaultDirectoryLabel(ECLIPSE_EGRID_FILE), defaultDir); + if (!openEclipseCaseFromFileNames(eclipseCaseFiles)) + { + return OpenCaseResults(); + } + results.eclipseCaseFiles = eclipseCaseFiles; + RiaApplication::instance()->setLastUsedDialogDirectory(defaultDirectoryLabel(ECLIPSE_EGRID_FILE), defaultDir); } if (!eclipseInputFiles.empty()) { - allSucceeded = allSucceeded && openInputEclipseCaseFromFileNames(eclipseInputFiles); - RiaApplication::instance()->setLastUsedDialogDirectory(defaultDirectoryLabel(ECLIPSE_INPUT_FILE), defaultDir); + if (!openInputEclipseCaseFromFileNames(eclipseInputFiles)) + { + return OpenCaseResults(); + } + results.eclipseInputFiles = eclipseInputFiles; + RiaApplication::instance()->setLastUsedDialogDirectory(defaultDirectoryLabel(ECLIPSE_INPUT_FILE), defaultDir); } if (!eclipseSummaryFiles.empty()) { - allSucceeded = allSucceeded && openSummaryCaseFromFileNames(eclipseSummaryFiles); + if (!openSummaryCaseFromFileNames(eclipseSummaryFiles)) + { + return OpenCaseResults(); + } + results.eclipseSummaryFiles = eclipseSummaryFiles; RiaApplication::instance()->setLastUsedDialogDirectory(defaultDirectoryLabel(ECLIPSE_SUMMARY_FILE), defaultDir); } - return allSucceeded; + return results; } diff --git a/ApplicationCode/Commands/RicImportGeneralDataFeature.h b/ApplicationCode/Commands/RicImportGeneralDataFeature.h index 3cfc15a085..5211b60ceb 100644 --- a/ApplicationCode/Commands/RicImportGeneralDataFeature.h +++ b/ApplicationCode/Commands/RicImportGeneralDataFeature.h @@ -22,6 +22,8 @@ #include "cafCmdFeature.h" +#include + #include //================================================================================================== @@ -32,7 +34,19 @@ class RicImportGeneralDataFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; public: - static bool openEclipseFilesFromFileNames(const QStringList& fileNames); + struct OpenCaseResults + { + QStringList eclipseCaseFiles; + QStringList eclipseInputFiles; + QStringList eclipseSummaryFiles; + + operator bool() const + { + return !(eclipseCaseFiles.empty() && eclipseInputFiles.empty() && eclipseSummaryFiles.empty()); + } + }; + + static OpenCaseResults openEclipseFilesFromFileNames(const QStringList& fileNames); protected: diff --git a/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp b/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp index f7ea9c8141..64877e509c 100644 --- a/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp +++ b/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp @@ -20,7 +20,7 @@ #include "SummaryPlotCommands/RicNewSummaryCurveFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RiaPreferences.h" @@ -73,7 +73,7 @@ bool RicImportSummaryCasesFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); QString pathCacheName = "INPUT_FILES"; QStringList fileNames = runRecursiveSummaryCaseFileSearchDialog("Import Summary Cases", pathCacheName); @@ -89,7 +89,7 @@ void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked) addCasesToGroupIfRelevant(cases); for (const auto& rimCase : cases) - RiaApplication::instance()->addToRecentFiles(rimCase->summaryHeaderFilename()); + app->addToRecentFiles(rimCase->summaryHeaderFilename()); RiuPlotMainWindow* mainPlotWindow = app->getOrCreateAndShowMainPlotWindow(); if (mainPlotWindow && !cases.empty()) @@ -123,7 +123,7 @@ void RicImportSummaryCasesFeature::setupActionLook(QAction* actionToSetup) bool RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(const QStringList& fileNames, std::vector* newCases) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); std::vector temp; std::vector* cases = newCases ? newCases : &temp; diff --git a/ApplicationCode/Commands/RicImportSummaryGroupFeature.cpp b/ApplicationCode/Commands/RicImportSummaryGroupFeature.cpp index 0f98bf2eec..f204d66164 100644 --- a/ApplicationCode/Commands/RicImportSummaryGroupFeature.cpp +++ b/ApplicationCode/Commands/RicImportSummaryGroupFeature.cpp @@ -18,7 +18,7 @@ #include "RicImportSummaryGroupFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaPreferences.h" #include "RicImportSummaryCasesFeature.h" @@ -60,7 +60,7 @@ bool RicImportSummaryGroupFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicImportSummaryGroupFeature::onActionTriggered(bool isChecked) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); QString pathCacheName = "INPUT_FILES"; QStringList fileNames = RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialog("Import Summary Case Group", pathCacheName); diff --git a/ApplicationCode/Commands/RicReloadCaseFeature.cpp b/ApplicationCode/Commands/RicReloadCaseFeature.cpp index 42d5afaaba..ec1a37da94 100644 --- a/ApplicationCode/Commands/RicReloadCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReloadCaseFeature.cpp @@ -19,7 +19,7 @@ #include "RicReloadCaseFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimEclipseCase.h" #include "RimReloadCaseTools.h" @@ -60,7 +60,7 @@ void RicReloadCaseFeature::onActionTriggered(bool isChecked) std::vector selectedEclipseCases; caf::SelectionManager::instance()->objectsByType(&selectedEclipseCases); - RiaApplication::clearAllSelections(); + RiaGuiApplication::clearAllSelections(); for (RimEclipseCase* selectedCase : selectedEclipseCases) { diff --git a/ApplicationCode/Commands/RicSummaryCaseRestartDialog.cpp b/ApplicationCode/Commands/RicSummaryCaseRestartDialog.cpp index 8d71986717..c3fb449eb6 100644 --- a/ApplicationCode/Commands/RicSummaryCaseRestartDialog.cpp +++ b/ApplicationCode/Commands/RicSummaryCaseRestartDialog.cpp @@ -21,7 +21,7 @@ #include "ExportCommands/RicSnapshotViewToFileFeature.h" #include "ExportCommands/RicSnapshotFilenameGenerator.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaFilePathTools.h" #include "RiaLogging.h" #include "RiaQDateTimeTools.h" @@ -611,7 +611,7 @@ void RicSummaryCaseRestartDialog::slotCopyFileNameToClipboard() { QAction* a = dynamic_cast(sender()); - QClipboard* cb = RiaApplication::clipboard(); + QClipboard* cb = RiaGuiApplication::clipboard(); if (cb) { QString fullFileName = a->data().toString(); diff --git a/ApplicationCode/Commands/RicWellLogTools.cpp b/ApplicationCode/Commands/RicWellLogTools.cpp index 007303aa6d..948f7d9e18 100644 --- a/ApplicationCode/Commands/RicWellLogTools.cpp +++ b/ApplicationCode/Commands/RicWellLogTools.cpp @@ -18,7 +18,7 @@ #include "RicWellLogTools.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimCase.h" #include "RimEclipseResultCase.h" @@ -205,7 +205,7 @@ RimWellLogExtractionCurve* RicWellLogTools::addExtractionCurve(RimWellLogTrack* plotTrack->updateConnectedEditors(); RiaApplication::instance()->project()->updateConnectedEditors(); - RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RiuPlotMainWindowTools::selectAsCurrentItem(curve); if (showPlotWindow) @@ -257,7 +257,7 @@ RimWellLogRftCurve* RicWellLogTools::addRftCurve(RimWellLogTrack* plotTrack, con plotTrack->updateConnectedEditors(); RiaApplication::instance()->project()->updateConnectedEditors(); - RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RiuPlotMainWindowTools::selectAsCurrentItem(curve); if (showPlotWindow) @@ -286,7 +286,7 @@ RimWellLogFileCurve* RicWellLogTools::addFileCurve(RimWellLogTrack* plotTrack, b plotTrack->updateConnectedEditors(); RiaApplication::instance()->project()->updateConnectedEditors(); - RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RiuPlotMainWindowTools::selectAsCurrentItem(curve); if (showPlotWindow) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp index 605c2ce330..7cff27f7a5 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicNewGridTimeHistoryCurveFeature.cpp @@ -18,7 +18,7 @@ #include "RicNewGridTimeHistoryCurveFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaSummaryTools.h" #include "RigFemResultAddress.h" @@ -82,14 +82,16 @@ void RicNewGridTimeHistoryCurveFeature::createCurveFromSelectionItem(const RiuSe //-------------------------------------------------------------------------------------------------- RimSummaryPlot* RicNewGridTimeHistoryCurveFeature::userSelectedSummaryPlot() { + RiaGuiApplication* app = RiaGuiApplication::instance(); + const QString lastUsedSummaryPlotKey("lastUsedSummaryPlotKey"); RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); RimSummaryPlot* defaultSelectedPlot = nullptr; { - QString lastUsedPlotRef = RiaApplication::instance()->cacheDataObject(lastUsedSummaryPlotKey).toString(); - RimSummaryPlot* lastUsedPlot = dynamic_cast(caf::PdmReferenceHelper::objectFromReference(RiaApplication::instance()->project(), lastUsedPlotRef)); + QString lastUsedPlotRef = app->cacheDataObject(lastUsedSummaryPlotKey).toString(); + RimSummaryPlot* lastUsedPlot = dynamic_cast(caf::PdmReferenceHelper::objectFromReference(app->project(), lastUsedPlotRef)); if (lastUsedPlot) { defaultSelectedPlot = lastUsedPlot; @@ -97,7 +99,7 @@ RimSummaryPlot* RicNewGridTimeHistoryCurveFeature::userSelectedSummaryPlot() if (!defaultSelectedPlot) { - defaultSelectedPlot = dynamic_cast( RiaApplication::instance()->activePlotWindow() ); + defaultSelectedPlot = dynamic_cast( app->activePlotWindow() ); } if (!defaultSelectedPlot && summaryPlotColl->summaryPlots().size() > 0) @@ -136,8 +138,8 @@ RimSummaryPlot* RicNewGridTimeHistoryCurveFeature::userSelectedSummaryPlot() summaryPlot = featureUi.selectedSummaryPlot(); } - QString refFromProjectToView = caf::PdmReferenceHelper::referenceFromRootToObject(RiaApplication::instance()->project(), summaryPlot); - RiaApplication::instance()->setCacheDataObject(lastUsedSummaryPlotKey, refFromProjectToView); + QString refFromProjectToView = caf::PdmReferenceHelper::referenceFromRootToObject(app->project(), summaryPlot); + app->setCacheDataObject(lastUsedSummaryPlotKey, refFromProjectToView); return summaryPlot; } @@ -147,7 +149,6 @@ RimSummaryPlot* RicNewGridTimeHistoryCurveFeature::userSelectedSummaryPlot() //-------------------------------------------------------------------------------------------------- QString RicNewGridTimeHistoryCurveFeature::suggestedNewPlotName() { - QString resultName; { Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotCurveFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotCurveFeature.cpp index e61d1e9961..b6d1fda69a 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotCurveFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCrossPlotCurveFeature.cpp @@ -18,7 +18,7 @@ #include "RicNewSummaryCrossPlotCurveFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaSummaryTools.h" #include "RimMainPlotCollection.h" @@ -76,9 +76,9 @@ void RicNewSummaryCrossPlotCurveFeature::onActionTriggered(bool isChecked) plot->updateConnectedEditors(); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow()->selectAsCurrentItem(newCurve); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow()->selectAsCurrentItem(newCurve); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCurveFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCurveFeature.cpp index 5f418670d1..9f82c5683b 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCurveFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryCurveFeature.cpp @@ -18,7 +18,7 @@ #include "RicNewSummaryCurveFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTables.h" #include "RiaSummaryTools.h" @@ -117,7 +117,8 @@ bool RicNewSummaryCurveFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicNewSummaryCurveFeature::onActionTriggered(bool isChecked) { - RimProject* project = RiaApplication::instance()->project(); + RiaGuiApplication* app = RiaGuiApplication::instance(); + RimProject* project = app->project(); CVF_ASSERT(project); RimSummaryPlot* plot = selectedSummaryPlot(); @@ -133,9 +134,9 @@ void RicNewSummaryCurveFeature::onActionTriggered(bool isChecked) plot->updateConnectedEditors(); - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow()->selectAsCurrentItem(newCurve); + app->getOrCreateAndShowMainPlotWindow()->selectAsCurrentItem(newCurve); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = app->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp index 503fbc9a30..e9c3a40001 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp @@ -18,7 +18,7 @@ #include "RicNewSummaryEnsembleCurveSetFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTables.h" #include "RiaSummaryTools.h" @@ -77,7 +77,7 @@ RimEnsembleCurveSet* RicNewSummaryEnsembleCurveSetFeature::addDefaultCurveSet(Ri //-------------------------------------------------------------------------------------------------- void RicNewSummaryEnsembleCurveSetFeature::createPlotForCurveSetAndUpdate(RimSummaryCaseCollection* ensemble) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); RimProject* proj = app->project(); RimSummaryPlotCollection* summaryPlotCollection = proj->mainPlotCollection->summaryPlotCollection(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp index c587144e89..c703834067 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreator.cpp @@ -18,7 +18,7 @@ #include "RicSummaryCurveCreator.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTables.h" #include "RiaCurveSetDefinition.h" #include "RiaSummaryCurveDefinition.h" @@ -231,7 +231,7 @@ void RicSummaryCurveCreator::fieldChangedByUi(const caf::PdmFieldHandle* changed caf::PdmField* field = dynamic_cast*>(m_targetPlot->uiCapability()->objectToggleField()); field->setValueWithFieldChanged(true); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } else if (changedField == &m_useAutoAppearanceAssignment && m_useAutoAppearanceAssignment) @@ -912,7 +912,7 @@ void RicSummaryCurveCreator::createNewPlot() m_targetPlot = newSummaryPlot; updateTargetPlot(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp index e15fd2c1ff..ec796b262d 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp @@ -18,7 +18,7 @@ #include "RicSummaryCurveCreatorDialog.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RicSummaryCurveCreator.h" #include "RicSummaryCurveCreatorSplitterUi.h" @@ -81,7 +81,7 @@ void RicSummaryCurveCreatorDialog::updateFromDefaultCases(const std::vectormainPlotWindow(); + RiuPlotMainWindow* plotwindow = RiaGuiApplication::instance()->mainPlotWindow(); if (plotwindow) { plotwindow->cleanUpTemporaryWidgets(); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicViewZoomAllFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicViewZoomAllFeature.cpp index eb04c5f3f1..b28fadff96 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicViewZoomAllFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicViewZoomAllFeature.cpp @@ -18,7 +18,7 @@ #include "RicViewZoomAllFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "Rim3dView.h" #include "RimViewWindow.h" @@ -47,11 +47,11 @@ void RicViewZoomAllFeature::onActionTriggered(bool isChecked) { this->disableModelChangeContribution(); - QWidget* topLevelWidget = RiaApplication::activeWindow(); + QWidget* topLevelWidget = RiaGuiApplication::activeWindow(); if (dynamic_cast(topLevelWidget)) { - RimViewWindow* viewWindow = RiaApplication::instance()->activeReservoirView(); + RimViewWindow* viewWindow = RiaGuiApplication::instance()->activeReservoirView(); if (viewWindow) { viewWindow->zoomAll(); diff --git a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp index 5b5ec4b58e..f6fe0062b9 100644 --- a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp +++ b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp @@ -21,7 +21,7 @@ #include "RiuMainWindow.h" #include "RiuPlotMainWindow.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "cafPdmUiFieldHandle.h" #include "cafPdmUiItem.h" @@ -161,7 +161,7 @@ caf::PdmUiTreeOrdering* RicToggleItemsFeatureImpl::findTreeItemFromSelectedUiIte QModelIndex modIndex = RiuMainWindow::instance()->projectTreeView()->findModelIndex(uiItem); if(!modIndex.isValid()) { - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); if(mainPlotWindow) { modIndex = mainPlotWindow->projectTreeView()->findModelIndex(uiItem); diff --git a/ApplicationCode/Commands/WellLogCommands/RicDeleteWellLogPlotTrackFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicDeleteWellLogPlotTrackFeature.cpp index a93e145ed1..62b9cc6969 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicDeleteWellLogPlotTrackFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicDeleteWellLogPlotTrackFeature.cpp @@ -20,7 +20,7 @@ #include "RicDeleteWellLogPlotTrackFeature.h" #include "RicWellLogPlotCurveFeatureImpl.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuPlotMainWindow.h" #include "RiuWellLogPlot.h" #include "RiuWellLogTrack.h" @@ -67,7 +67,7 @@ void RicDeleteWellLogPlotTrackFeature::onActionTriggered(bool isChecked) std::vector selection; caf::SelectionManager::instance()->objectsByType(&selection); - RiuPlotMainWindow* plotWindow = RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiuPlotMainWindow* plotWindow = RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); std::set alteredWellLogPlots; for (size_t i = 0; i < selection.size(); i++) diff --git a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp index 09e7ce1e6c..fd07356a46 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp @@ -25,7 +25,7 @@ #include "RimWellLogPlotCollection.h" #include "RimWellLogTrack.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "cvfAssert.h" @@ -40,7 +40,7 @@ RimWellLogPlot* RicNewWellLogPlotFeatureImpl::createWellLogPlot(bool showAfterCr CVF_ASSERT(wellLogPlotColl); // Make sure the summary plot window is created - RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RimWellLogPlot* plot = new RimWellLogPlot(); plot->setAsPlotMdiWindow(); @@ -58,7 +58,7 @@ RimWellLogPlot* RicNewWellLogPlotFeatureImpl::createWellLogPlot(bool showAfterCr if (showAfterCreation) { - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); } return plot; diff --git a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotTrackFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotTrackFeature.cpp index 8ff17fb6d4..4ba04fe539 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotTrackFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogPlotTrackFeature.cpp @@ -19,7 +19,7 @@ #include "RicNewWellLogPlotTrackFeature.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuPlotMainWindow.h" #include "RiuWellLogPlot.h" #include "RiuWellLogTrack.h" @@ -66,7 +66,7 @@ void RicNewWellLogPlotTrackFeature::onActionTriggered(bool isChecked) RimWellLogTrack* plotTrack = new RimWellLogTrack; wellLogPlot->addTrack(plotTrack); plotTrack->setDescription(QString("Track %1").arg(wellLogPlot->trackCount())); - RiuPlotMainWindow* plotWindow = RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiuPlotMainWindow* plotWindow = RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RiuWellLogPlot* viewWidget = dynamic_cast(wellLogPlot->viewWidget()); RicWellLogTools::addExtractionCurve(plotTrack, nullptr, nullptr, nullptr, -1, true); diff --git a/ApplicationCode/Commands/WellLogCommands/RicWellLogPlotTrackFeatureImpl.cpp b/ApplicationCode/Commands/WellLogCommands/RicWellLogPlotTrackFeatureImpl.cpp index 8494551d41..1d1531d784 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicWellLogPlotTrackFeatureImpl.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicWellLogPlotTrackFeatureImpl.cpp @@ -19,7 +19,7 @@ #include "RicWellLogPlotTrackFeatureImpl.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuPlotMainWindow.h" #include "RiuWellLogPlot.h" #include "RiuWellLogTrack.h" @@ -94,7 +94,7 @@ void RicWellLogPlotTrackFeatureImpl::moveTracksToWellLogPlot(RimWellLogPlot* dst { CVF_ASSERT(dstWellLogPlot); - RiuPlotMainWindow* plotWindow = RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiuPlotMainWindow* plotWindow = RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); std::set srcPlots; diff --git a/ApplicationCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp b/ApplicationCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp index 6fe26379df..0e1db7957d 100644 --- a/ApplicationCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp +++ b/ApplicationCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp @@ -18,7 +18,7 @@ #include "RicCreateWellTargetsPickEventHandler.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaOffshoreSphericalCoords.h" #include "RigFemPart.h" @@ -70,7 +70,7 @@ RicCreateWellTargetsPickEventHandler::~RicCreateWellTargetsPickEventHandler() {} //-------------------------------------------------------------------------------------------------- void RicCreateWellTargetsPickEventHandler::registerAsPickEventHandler() { - RiaApplication::instance()->setOverrideCursor(Qt::CrossCursor); + RiaGuiApplication::instance()->setOverrideCursor(Qt::CrossCursor); Ric3dViewPickEventHandler::registerAsPickEventHandler(); } @@ -79,7 +79,7 @@ void RicCreateWellTargetsPickEventHandler::registerAsPickEventHandler() //-------------------------------------------------------------------------------------------------- void RicCreateWellTargetsPickEventHandler::notifyUnregistered() { - RiaApplication::instance()->restoreOverrideCursor(); + RiaGuiApplication::instance()->restoreOverrideCursor(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ModelVisualization/GridBox/RivGridBoxGenerator.cpp b/ApplicationCode/ModelVisualization/GridBox/RivGridBoxGenerator.cpp index 4f90045efd..7ef170c384 100644 --- a/ApplicationCode/ModelVisualization/GridBox/RivGridBoxGenerator.cpp +++ b/ApplicationCode/ModelVisualization/GridBox/RivGridBoxGenerator.cpp @@ -20,7 +20,7 @@ #include "RivGridBoxGenerator.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTools.h" #include "RivPartPriority.h" @@ -639,7 +639,7 @@ void RivGridBoxGenerator::createLegend(EdgeType edge, cvf::Collection cvf::ref geo = new cvf::DrawableText; - cvf::Font* standardFont = RiaApplication::instance()->defaultSceneFont(); + cvf::Font* standardFont = RiaGuiApplication::instance()->defaultSceneFont(); geo->setFont(standardFont); geo->setTextColor(m_gridLegendColor); diff --git a/ApplicationCode/ModelVisualization/Intersections/RivIntersectionPartMgr.cpp b/ApplicationCode/ModelVisualization/Intersections/RivIntersectionPartMgr.cpp index e639ce69de..cfbc8ba406 100644 --- a/ApplicationCode/ModelVisualization/Intersections/RivIntersectionPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/Intersections/RivIntersectionPartMgr.cpp @@ -19,7 +19,7 @@ #include "RivIntersectionPartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaOffshoreSphericalCoords.h" #include "RiaPreferences.h" @@ -607,7 +607,7 @@ void RivIntersectionPartMgr::createFaultLabelParts(const std::vectorshowFaultLabel())) return; cvf::Color3f faultLabelColor = faultInViewColl->faultLabelColor(); - cvf::Font* font = RiaApplication::instance()->defaultSceneFont(); + cvf::Font* font = RiaGuiApplication::instance()->defaultSceneFont(); std::vector lineVertices; diff --git a/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp b/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp index 0a35d826a5..43d74a1ca3 100644 --- a/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp +++ b/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp @@ -18,7 +18,7 @@ #include "Riv3dWellLogPlanePartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "Rim3dView.h" #include "Rim3dWellLogCurveCollection.h" @@ -258,7 +258,7 @@ void Riv3dWellLogPlanePartMgr::appendDrawSurfaceToModel(cvf::ModelBasicList* if (normals.notNull()) { normals->setSingleColor(borderColor); - if (RiaApplication::instance()->useShaders()) + if (RiaGuiApplication::instance()->useShaders()) { normals->setUniformNames("u_transformationMatrix", "u_color"); } diff --git a/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp b/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp index c165a4badd..e807dca51b 100644 --- a/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp @@ -19,7 +19,7 @@ #include "RivFaultPartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaPreferences.h" #include "RigCaseCellResultsData.h" @@ -482,7 +482,9 @@ void RivFaultPartMgr::createLabelWithAnchorLine(const cvf::Part* part) // Fault label if (!m_rimFault->name().isEmpty()) { - cvf::Font* font = RiaApplication::instance()->defaultWellLabelFont(); + RiaGuiApplication* app = RiaGuiApplication::instance(); + + cvf::Font* font = app->defaultWellLabelFont(); cvf::ref drawableText = new cvf::DrawableText; drawableText->setFont(font); @@ -491,7 +493,7 @@ void RivFaultPartMgr::createLabelWithAnchorLine(const cvf::Part* part) drawableText->setDrawBackground(false); drawableText->setVerticalAlignment(cvf::TextDrawer::CENTER); - cvf::Color3f defWellLabelColor = RiaApplication::instance()->preferences()->defaultWellLabelColor(); + cvf::Color3f defWellLabelColor = app->preferences()->defaultWellLabelColor(); { { RimFaultInViewCollection* parentObject; diff --git a/ApplicationCode/ModelVisualization/RivMeasurementPartMgr.cpp b/ApplicationCode/ModelVisualization/RivMeasurementPartMgr.cpp index 968d25c131..7cd159337c 100644 --- a/ApplicationCode/ModelVisualization/RivMeasurementPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivMeasurementPartMgr.cpp @@ -186,11 +186,13 @@ void RivMeasurementPartMgr::buildPolyLineParts(const cvf::Camera* camera, negativeXDir = true; } - auto backgroundColor = RiaApplication::instance()->preferences()->defaultViewerBackgroundColor; + RiaGuiApplication* app = RiaGuiApplication::instance(); + + auto backgroundColor = app->preferences()->defaultViewerBackgroundColor; auto fontColor = cvf::Color3f::BLACK; QString text = m_measurement->label(); auto labelPosition = pointsInDisplay.back(); - auto font = RiaApplication::instance()->defaultWellLabelFont(); + auto font = app->defaultWellLabelFont(); cvf::ref drawableText = new cvf::DrawableText; drawableText->setFont(font); diff --git a/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp b/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp index b23c0ba61e..c71f46c251 100644 --- a/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp @@ -18,7 +18,7 @@ #include "RivPolylineAnnotationPartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaBoundingBoxTools.h" #include "Rim3dView.h" @@ -134,7 +134,7 @@ void RivPolylineAnnotationPartMgr::buildPolylineAnnotationParts(const caf::Displ } cvf::ref vectorDrawable; - if (RiaApplication::instance()->useShaders()) + if (RiaGuiApplication::instance()->useShaders()) { // NOTE: Drawable vectors must be rendered using shaders when the rest of the application is rendered using // shaders Drawing vectors using fixed function when rest of the application uses shaders causes visual artifacts diff --git a/ApplicationCode/ModelVisualization/RivWellHeadPartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellHeadPartMgr.cpp index 5e5572c7bf..b5bea8e798 100644 --- a/ApplicationCode/ModelVisualization/RivWellHeadPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellHeadPartMgr.cpp @@ -22,7 +22,7 @@ #include "RivWellHeadPartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RigActiveCellInfo.h" #include "RigCell.h" @@ -297,7 +297,7 @@ void RivWellHeadPartMgr::buildWellHeadParts(size_t frameIndex, if (well->showWellLabel() && !well->name().isEmpty()) { - cvf::Font* font = RiaApplication::instance()->defaultWellLabelFont(); + cvf::Font* font = RiaGuiApplication::instance()->defaultWellLabelFont(); cvf::ref drawableText = new cvf::DrawableText; drawableText->setFont(font); diff --git a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp index dafe176eca..5fa0838605 100644 --- a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp @@ -21,7 +21,7 @@ #include "RivWellPathPartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RigEclipseCaseData.h" #include "RigMainGrid.h" @@ -612,7 +612,7 @@ void RivWellPathPartMgr::buildWellPathParts(const caf::DisplayCoordTransform* di if (wellPathCollection->showWellPathLabel() && m_rimWellPath->showWellPathLabel() && !m_rimWellPath->name().isEmpty()) { - cvf::Font* font = RiaApplication::instance()->defaultWellLabelFont(); + cvf::Font* font = RiaGuiApplication::instance()->defaultWellLabelFont(); cvf::ref drawableText = new cvf::DrawableText; drawableText->setFont(font); diff --git a/ApplicationCode/ModelVisualization/RivWellSpheresPartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellSpheresPartMgr.cpp index 112c4a2e09..70de4f30a6 100644 --- a/ApplicationCode/ModelVisualization/RivWellSpheresPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellSpheresPartMgr.cpp @@ -18,7 +18,7 @@ #include "RivWellSpheresPartMgr.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RigMainGrid.h" #include "RigSimWellData.h" @@ -137,7 +137,7 @@ cvf::ref RivWellSpheresPartMgr::createPart(std::vector vectorDrawable; - if (RiaApplication::instance()->useShaders()) + if (RiaGuiApplication::instance()->useShaders()) { // NOTE: Drawable vectors must be rendered using shaders when the rest of the application is rendered using shaders // Drawing vectors using fixed function when rest of the application uses shaders causes visual artifacts @@ -169,7 +169,7 @@ cvf::ref RivWellSpheresPartMgr::createPart(std::vectorsetDrawable(vectorDrawable.p()); cvf::ref eff = new cvf::Effect; - if (RiaApplication::instance()->useShaders()) + if (RiaGuiApplication::instance()->useShaders()) { if (m_rimReservoirView->viewer()) { diff --git a/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp b/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp index 539ef7056f..157c094638 100644 --- a/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp @@ -62,9 +62,9 @@ RimAnnotationCollection::RimAnnotationCollection() m_userDefinedPolylineAnnotations->uiCapability()->setUiName(RimAnnotationGroupCollection::USED_DEFINED_POLYLINE_ANNOTATION_UI_NAME); m_polylineFromFileAnnotations->uiCapability()->setUiName(RimAnnotationGroupCollection::POLYLINE_FROM_FILE_ANNOTATION_UI_NAME); - m_reachCircleAnnotations->uiCapability()->setUiIcon(QIcon(":/ReachCircle16x16.png")); - m_userDefinedPolylineAnnotations->uiCapability()->setUiIcon(QIcon(":/PolylinesFromFile16x16.png")); - m_polylineFromFileAnnotations->uiCapability()->setUiIcon(QIcon(":/PolylinesFromFile16x16.png")); + m_reachCircleAnnotations->uiCapability()->setUiIcon(":/ReachCircle16x16.png"); + m_userDefinedPolylineAnnotations->uiCapability()->setUiIcon(":/PolylinesFromFile16x16.png"); + m_polylineFromFileAnnotations->uiCapability()->setUiIcon(":/PolylinesFromFile16x16.png"); } diff --git a/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp b/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp index b97bfeb79f..427c15b55c 100644 --- a/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp +++ b/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp @@ -51,7 +51,7 @@ RimAnnotationCollectionBase::RimAnnotationCollectionBase() m_textAnnotations.uiCapability()->setUiHidden(true); m_textAnnotations = new RimAnnotationGroupCollection(); m_textAnnotations->uiCapability()->setUiName(RimAnnotationGroupCollection::TEXT_ANNOTATION_UI_NAME); - m_textAnnotations->uiCapability()->setUiIcon(QIcon(":/TextAnnotation16x16.png")); + m_textAnnotations->uiCapability()->setUiIcon(":/TextAnnotation16x16.png"); } diff --git a/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp b/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp index 25749f21f6..c121b77cb9 100644 --- a/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp @@ -105,10 +105,10 @@ RimAnnotationInViewCollection::RimAnnotationInViewCollection() m_globalUserDefinedPolylineAnnotations->uiCapability()->setUiName("Global User Defined Polylines Annotations"); m_globalPolylineFromFileAnnotations->uiCapability()->setUiName("Global Polylines From File Annotations"); - m_globalTextAnnotations->uiCapability()->setUiIcon(QIcon(":/TextAnnotation16x16.png")); - m_globalReachCircleAnnotations->uiCapability()->setUiIcon(QIcon(":/ReachCircle16x16.png")); - m_globalUserDefinedPolylineAnnotations->uiCapability()->setUiIcon(QIcon(":/PolylinesFromFile16x16.png")); - m_globalPolylineFromFileAnnotations->uiCapability()->setUiIcon(QIcon(":/PolylinesFromFile16x16.png")); + m_globalTextAnnotations->uiCapability()->setUiIcon(":/TextAnnotation16x16.png"); + m_globalReachCircleAnnotations->uiCapability()->setUiIcon(":/ReachCircle16x16.png"); + m_globalUserDefinedPolylineAnnotations->uiCapability()->setUiIcon(":/PolylinesFromFile16x16.png"); + m_globalPolylineFromFileAnnotations->uiCapability()->setUiIcon(":/PolylinesFromFile16x16.png"); } //-------------------------------------------------------------------------------------------------- @@ -296,6 +296,10 @@ void RimAnnotationInViewCollection::defineUiOrdering(QString uiConfigName, caf:: //-------------------------------------------------------------------------------------------------- void RimAnnotationInViewCollection::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { + if (changedField == &m_isActive) + { + updateUiIconFromToggleField(); + } scheduleRedrawOfRelevantViews(); } diff --git a/ApplicationCode/ProjectDataModel/Completions/RimValveTemplate.cpp b/ApplicationCode/ProjectDataModel/Completions/RimValveTemplate.cpp index a258489f66..7b9eafb093 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimValveTemplate.cpp +++ b/ApplicationCode/ProjectDataModel/Completions/RimValveTemplate.cpp @@ -256,15 +256,15 @@ void RimValveTemplate::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrderi this->setName(fullLabel()); if (m_type() == RiaDefines::ICV) { - this->setUiIcon(QIcon(":/ICVValve16x16.png")); + this->setUiIcon(":/ICVValve16x16.png"); } else if (m_type() == RiaDefines::ICD) { - this->setUiIcon(QIcon(":/ICDValve16x16.png")); + this->setUiIcon(":/ICDValve16x16.png"); } else if (m_type() == RiaDefines::AICD) { - this->setUiIcon(QIcon(":/AICDValve16x16.png")); + this->setUiIcon(":/AICDValve16x16.png"); } } diff --git a/ApplicationCode/ProjectDataModel/Completions/RimWellPathValve.cpp b/ApplicationCode/ProjectDataModel/Completions/RimWellPathValve.cpp index 395f587b36..38362dda41 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimWellPathValve.cpp +++ b/ApplicationCode/ProjectDataModel/Completions/RimWellPathValve.cpp @@ -184,13 +184,13 @@ void RimWellPathValve::applyValveLabelAndIcon() { if (componentType() == RiaDefines::ICV) { - this->setUiIcon(QIcon(":/ICVValve16x16.png")); + this->setUiIcon(":/ICVValve16x16.png"); QString fullName = QString("%1: %2").arg(componentLabel()).arg(m_measuredDepth()); this->setName(fullName); } else if (componentType() == RiaDefines::ICD) { - this->setUiIcon(QIcon(":/ICDValve16x16.png")); + this->setUiIcon(":/ICDValve16x16.png"); QString fullName = QString("%1 %2: %3 - %4") .arg(m_multipleValveLocations->valveLocations().size()) .arg(componentLabel()) @@ -200,7 +200,7 @@ void RimWellPathValve::applyValveLabelAndIcon() } else if (componentType() == RiaDefines::AICD) { - this->setUiIcon(QIcon(":/AICDValve16x16.png")); + this->setUiIcon(":/AICDValve16x16.png"); QString fullName = QString("%1 %2: %3 - %4") .arg(m_multipleValveLocations->valveLocations().size()) .arg(componentLabel()) diff --git a/ApplicationCode/ProjectDataModel/Flow/RimFlowCharacteristicsPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimFlowCharacteristicsPlot.cpp index af080c629a..2d0cb446e4 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimFlowCharacteristicsPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimFlowCharacteristicsPlot.cpp @@ -188,7 +188,7 @@ QList RimFlowCharacteristicsPlot::calculateValueOptions( { if (c->defaultFlowDiagSolution()) { - options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIconProvider())); } } } @@ -199,7 +199,7 @@ QList RimFlowCharacteristicsPlot::calculateValueOptions( { for (RimEclipseView* view : m_case()->reservoirViews()) { - options.push_back(caf::PdmOptionItemInfo(view->name(), view, false, view->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(view->name(), view, false, view->uiIconProvider())); } } } @@ -212,7 +212,7 @@ QList RimFlowCharacteristicsPlot::calculateValueOptions( options.push_back(caf::PdmOptionItemInfo("None", nullptr)); for (RimFlowDiagSolution* flowSol : flowSols) { - options.push_back(caf::PdmOptionItemInfo(flowSol->userDescription(), flowSol, false, flowSol->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(flowSol->userDescription(), flowSol, false, flowSol->uiIconProvider())); } } } diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp index fae3b985bb..9adf531010 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp @@ -98,7 +98,7 @@ RimWellAllocationPlot::RimWellAllocationPlot() m_accumulatedWellFlowPlot->setDepthUnit(RiaDefines::UNIT_NONE); m_accumulatedWellFlowPlot->setDepthType(RimWellLogPlot::CONNECTION_NUMBER); m_accumulatedWellFlowPlot->setTrackLegendsVisible(false); - m_accumulatedWellFlowPlot->uiCapability()->setUiIcon(QIcon(":/WellFlowPlot16x16.png")); + m_accumulatedWellFlowPlot->uiCapability()->setUiIcon(":/WellFlowPlot16x16.png"); CAF_PDM_InitFieldNoDefault(&m_totalWellAllocationPlot, "TotalWellFlowPlot", "Total Well Flow", "", "", ""); m_totalWellAllocationPlot.uiCapability()->setUiHidden(true); @@ -594,7 +594,7 @@ QList RimWellAllocationPlot::calculateValueOptions(const { std::set sortedWellNames = this->findSortedWellNames(); - QIcon simWellIcon(":/Well.png"); + caf::QIconProvider simWellIcon(":/Well.png"); for ( const QString& wname: sortedWellNames ) { options.push_back(caf::PdmOptionItemInfo(wname, wname, false, simWellIcon)); @@ -630,7 +630,7 @@ QList RimWellAllocationPlot::calculateValueOptions(const for (RimEclipseResultCase* c : cases) { - options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIconProvider())); } } } diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp index b491074dae..f9a800902b 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp @@ -927,7 +927,7 @@ QList RimGridCrossPlotDataSet::calculateValueOptions(con for (RimEclipseView* view : eclipseCase->reservoirViews.childObjects()) { CVF_ASSERT(view && "Really always should have a valid view pointer in ReservoirViews"); - options.push_back(caf::PdmOptionItemInfo(view->name(), view, false, view->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(view->name(), view, false, view->uiIconProvider())); } } } diff --git a/ApplicationCode/ProjectDataModel/Measurement/RiuMeasurementEventFilter.cpp b/ApplicationCode/ProjectDataModel/Measurement/RiuMeasurementEventFilter.cpp index 18badfd7be..51ddd7c61f 100644 --- a/ApplicationCode/ProjectDataModel/Measurement/RiuMeasurementEventFilter.cpp +++ b/ApplicationCode/ProjectDataModel/Measurement/RiuMeasurementEventFilter.cpp @@ -18,7 +18,7 @@ #include "RiuMeasurementEventFilter.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimMeasurement.h" @@ -39,7 +39,7 @@ RiuMeasurementEventFilter::RiuMeasurementEventFilter(RimMeasurement* parent) //-------------------------------------------------------------------------------------------------- void RiuMeasurementEventFilter::registerFilter() { - RiaApplication::instance()->installEventFilter(this); + RiaGuiApplication::instance()->installEventFilter(this); } //-------------------------------------------------------------------------------------------------- @@ -47,7 +47,7 @@ void RiuMeasurementEventFilter::registerFilter() //-------------------------------------------------------------------------------------------------- void RiuMeasurementEventFilter::unregisterFilter() { - RiaApplication::instance()->removeEventFilter(this); + RiaGuiApplication::instance()->removeEventFilter(this); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp b/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp index b9d8221bf8..e5874c4ddd 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp @@ -116,7 +116,6 @@ Rim3dOverlayInfoConfig::Rim3dOverlayInfoConfig() m_isVisCellStatUpToDate = false; - m_gridStatisticsDialog = std::unique_ptr(new RicGridStatisticsDialog(nullptr)); } //-------------------------------------------------------------------------------------------------- @@ -228,14 +227,27 @@ QString Rim3dOverlayInfoConfig::resultInfoText(const HistogramData& histData) return ""; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicGridStatisticsDialog* Rim3dOverlayInfoConfig::getOrCreateGridStatisticsDialog() +{ + if (!m_gridStatisticsDialog) + { + m_gridStatisticsDialog.reset(new RicGridStatisticsDialog(nullptr)); + } + CVF_ASSERT(m_gridStatisticsDialog); + return m_gridStatisticsDialog.get(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QImage Rim3dOverlayInfoConfig::statisticsDialogScreenShotImage() { - if (m_gridStatisticsDialog->isVisible()) + if (getOrCreateGridStatisticsDialog()->isVisible()) { - return m_gridStatisticsDialog->screenShotImage(); + return getOrCreateGridStatisticsDialog()->screenShotImage(); } return QImage(); } @@ -862,16 +874,17 @@ void Rim3dOverlayInfoConfig::showStatisticsInfoDialog(bool raise) { if (m_viewDef) { + RicGridStatisticsDialog* dialog = getOrCreateGridStatisticsDialog(); // Show dialog before setting data due to text edit auto height setting - m_gridStatisticsDialog->resize(600, 800); - m_gridStatisticsDialog->show(); + dialog->resize(600, 800); + dialog->show(); - m_gridStatisticsDialog->setLabel("Grid statistics"); - m_gridStatisticsDialog->updateFromRimView(m_viewDef); + dialog->setLabel("Grid statistics"); + dialog->updateFromRimView(m_viewDef); if (raise) { - m_gridStatisticsDialog->raise(); + dialog->raise(); } } } @@ -916,7 +929,7 @@ void Rim3dOverlayInfoConfig::update3DInfo() updateEclipse3DInfo(reservoirView); // Update statistics dialog - m_gridStatisticsDialog->updateFromRimView(reservoirView); + getOrCreateGridStatisticsDialog()->updateFromRimView(reservoirView); } RimGeoMechView* geoMechView = dynamic_cast(m_viewDef.p()); @@ -927,7 +940,7 @@ void Rim3dOverlayInfoConfig::update3DInfo() updateGeoMech3DInfo(geoMechView); // Update statistics dialog - m_gridStatisticsDialog->updateFromRimView(geoMechView); + getOrCreateGridStatisticsDialog()->updateFromRimView(geoMechView); } update3DInfoIn2dViews(); diff --git a/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.h b/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.h index 5097e378b9..5ca19d68b1 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.h +++ b/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.h @@ -80,6 +80,7 @@ public: QString caseInfoText(); QString resultInfoText(const HistogramData& histData); + RicGridStatisticsDialog* getOrCreateGridStatisticsDialog(); void showStatisticsInfoDialog(bool raise = true); QImage statisticsDialogScreenShotImage(); @@ -101,7 +102,7 @@ public: ALL_CELLS, VISIBLE_CELLS }; - + private: void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; caf::PdmFieldHandle* objectToggleField() override; diff --git a/ApplicationCode/ProjectDataModel/Rim3dView.cpp b/ApplicationCode/ProjectDataModel/Rim3dView.cpp index 1d957e811f..4caf61695b 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dView.cpp @@ -19,7 +19,7 @@ #include "Rim3dView.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaFieldHandleTools.h" #include "RiaPreferences.h" #include "RiaViewRedrawScheduler.h" @@ -181,7 +181,7 @@ QString Rim3dView::name() const QWidget* Rim3dView::createViewWidget(QWidget* mainWindowParent) { QGLFormat glFormat; - glFormat.setDirectRendering(RiaApplication::instance()->useShaders()); + glFormat.setDirectRendering(RiaGuiApplication::instance()->useShaders()); m_viewer = new RiuViewer(glFormat, mainWindowParent); m_viewer->setOwnerReservoirView(this); @@ -207,7 +207,7 @@ void Rim3dView::updateViewWidgetAfterCreation() this->resetLegendsInViewer(); m_viewer->updateNavigationPolicy(); - m_viewer->enablePerfInfoHud(RiaApplication::instance()->showPerformanceInfo()); + m_viewer->enablePerfInfoHud(RiaGuiApplication::instance()->showPerformanceInfo()); m_viewer->mainCamera()->setViewMatrix(m_cameraPosition); m_viewer->setPointOfInterest(m_cameraPointOfInterest()); @@ -409,7 +409,10 @@ void Rim3dView::createDisplayModelAndRedraw() } } - RiuMainWindow::instance()->refreshAnimationActions(); + if (RiuMainWindow::instance()) + { + RiuMainWindow::instance()->refreshAnimationActions(); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimCase.cpp b/ApplicationCode/ProjectDataModel/RimCase.cpp index c0f221c39b..6ef3cd59fa 100644 --- a/ApplicationCode/ProjectDataModel/RimCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimCase.cpp @@ -153,7 +153,7 @@ QList RimCase::calculateValueOptions(const caf::PdmField { for(RimFormationNames* fnames : proj->activeOilField()->formationNamesCollection()->formationNamesList()) { - options.push_back(caf::PdmOptionItemInfo(fnames->fileNameWoPath(), fnames, false, fnames->uiCapability()->uiIcon())); + options.push_back(caf::PdmOptionItemInfo(fnames->fileNameWoPath(), fnames, false, fnames->uiCapability()->uiIconProvider())); } } diff --git a/ApplicationCode/ProjectDataModel/RimCellFilter.cpp b/ApplicationCode/ProjectDataModel/RimCellFilter.cpp index 746c0f25b8..ad940b7a02 100644 --- a/ApplicationCode/ProjectDataModel/RimCellFilter.cpp +++ b/ApplicationCode/ProjectDataModel/RimCellFilter.cpp @@ -18,6 +18,8 @@ #include "RimCellFilter.h" +#include "RiaGuiApplication.h" + #include namespace caf @@ -69,9 +71,13 @@ caf::PdmFieldHandle* RimCellFilter::userDescriptionField() void RimCellFilter::updateIconState() { // Reset dynamic icon - this->setUiIcon(QIcon()); + this->setUiIcon(caf::QIconProvider()); // Get static one - QIcon icon = this->uiIcon(); + caf::QIconProvider iconProvider = this->uiIconProvider(); + + if (iconProvider.isNull()) return; + + QIcon icon = iconProvider.icon(); // Get a pixmap, and modify it @@ -93,14 +99,9 @@ void RimCellFilter::updateIconState() painter.drawPixmap(0,0, sign); } - if (!isActive || isActive.uiCapability()->isUiReadOnly()) - { - QIcon temp(icPixmap); - icPixmap = temp.pixmap(16, 16, QIcon::Disabled); - } - - QIcon newIcon(icPixmap); - this->setUiIcon(newIcon); + iconProvider.setPixmap(icPixmap); + iconProvider.setActive(isActive && !isActive.uiCapability()->isUiReadOnly()); + this->setUiIcon(iconProvider); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp index 9945b71931..de8ff5b5f8 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilter.cpp @@ -22,6 +22,7 @@ #include "RiaDefines.h" #include "RiaFieldHandleTools.h" +#include "RiaGuiApplication.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" @@ -90,7 +91,11 @@ RimEclipsePropertyFilter::RimEclipsePropertyFilter() CAF_PDM_InitField(&m_useCategorySelection, "CategorySelection", false, "Category Selection", "", "", ""); m_upperBound.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); - updateIconState(); + // HEADLESS HACK + if (RiaGuiApplication::isRunning()) + { + updateIconState(); + } m_minimumResultValue = cvf::UNDEFINED_DOUBLE; m_maximumResultValue = cvf::UNDEFINED_DOUBLE; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp index 08cf81b8a7..898003a450 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -684,7 +684,7 @@ QList RimEclipseResultDefinition::calculateValueOptions( QString("%1 (#%2)").arg(otherCase->caseUserDescription()).arg(otherCase->caseId()), otherCase, false, - otherCase->uiIcon())); + otherCase->uiIconProvider())); } } } diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp b/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp index 1ee043ed2a..9d1bde616e 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp @@ -814,7 +814,7 @@ QList RimGeoMechCase::calculateValueOptions(const caf::P { for (size_t i = 0; i < m_elementPropertyFileNames.v().size(); i++) { - options.push_back(caf::PdmOptionItemInfo(m_elementPropertyFileNames.v().at(i).path(), (int)i, true, QIcon())); + options.push_back(caf::PdmOptionItemInfo(m_elementPropertyFileNames.v().at(i).path(), (int)i, true)); } } diff --git a/ApplicationCode/ProjectDataModel/RimGridCollection.cpp b/ApplicationCode/ProjectDataModel/RimGridCollection.cpp index b8643e1593..c0ddf91a37 100644 --- a/ApplicationCode/ProjectDataModel/RimGridCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimGridCollection.cpp @@ -260,18 +260,18 @@ RimGridCollection::RimGridCollection() m_mainGrid = new RimGridInfo(); m_mainGrid->setUiName("Main Grid"); m_mainGrid->uiCapability()->setUiTreeHidden(true); - m_mainGrid->setUiIcon(QIcon(":/MainGrid16x16.png")); + m_mainGrid->setUiIcon(":/MainGrid16x16.png"); CAF_PDM_InitFieldNoDefault(&m_persistentLgrs, "PersistentLgrs", "Persistent LGRs", "", "", ""); m_persistentLgrs = new RimGridInfoCollection(); m_persistentLgrs->setUiName(persistentGridUiName()); - m_persistentLgrs->setUiIcon(QIcon(":/LGR16x16.png")); + m_persistentLgrs->setUiIcon(":/LGR16x16.png"); CAF_PDM_InitFieldNoDefault(&m_temporaryLgrs, "TemporaryLgrs", "Temporary LGRs", "", "", ""); m_temporaryLgrs.xmlCapability()->disableIO(); m_temporaryLgrs = new RimGridInfoCollection(); m_temporaryLgrs->setUiName(temporaryGridUiName()); - m_temporaryLgrs->setUiIcon(QIcon(":/TempLGR16x16.png")); + m_temporaryLgrs->setUiIcon(":/TempLGR16x16.png"); } //-------------------------------------------------------------------------------------------------- @@ -390,7 +390,7 @@ void RimGridCollection::syncFromMainEclipseGrid() auto gridInfo = new RimGridInfo(); gridInfo->setName(gridName); gridInfo->setEclipseGridIndex((int)gridIndex); - gridInfo->setUiIcon(QIcon(":/TempLGR16x16.png")); + gridInfo->setUiIcon(":/TempLGR16x16.png"); m_temporaryLgrs->addGridInfo(gridInfo); } } @@ -405,7 +405,7 @@ void RimGridCollection::syncFromMainEclipseGrid() auto gridInfo = new RimGridInfo(); gridInfo->setName(gridName); gridInfo->setEclipseGridIndex((int)gridIndex); - gridInfo->setUiIcon(QIcon(":/LGR16x16.png")); + gridInfo->setUiIcon(":/LGR16x16.png"); m_persistentLgrs->addGridInfo(gridInfo); } } diff --git a/ApplicationCode/ProjectDataModel/RimGridView.cpp b/ApplicationCode/ProjectDataModel/RimGridView.cpp index 8d860691f1..39b930891c 100644 --- a/ApplicationCode/ProjectDataModel/RimGridView.cpp +++ b/ApplicationCode/ProjectDataModel/RimGridView.cpp @@ -295,7 +295,7 @@ bool RimGridView::hasCustomFontSizes(RiaDefines::FontSettingType fontSettingType bool hasCustomFonts = Rim3dView::hasCustomFontSizes(fontSettingType, defaultFontSize); if (fontSettingType == RiaDefines::ANNOTATION_FONT) { - auto annotations = annotationCollection(); + auto annotations = annotationCollection(); if (annotations) { RiaFontCache::FontSize defaultFontSizeEnum = RiaFontCache::fontSizeEnumFromPointSize(defaultFontSize); @@ -316,7 +316,7 @@ bool RimGridView::applyFontSize(RiaDefines::FontSettingType fontSettingType, bool anyChange = Rim3dView::applyFontSize(fontSettingType, oldFontSize, fontSize, forceChange); if (fontSettingType == RiaDefines::ANNOTATION_FONT) { - auto annotations = annotationCollection(); + auto annotations = annotationCollection(); if (annotations) { RiaFontCache::FontSize oldFontSizeEnum = RiaFontCache::fontSizeEnumFromPointSize(oldFontSize); @@ -325,8 +325,7 @@ bool RimGridView::applyFontSize(RiaDefines::FontSettingType fontSettingType, if (applyFontSizes) { - anyChange = - annotations->applyFontSizeToAllTextAnnotations(oldFontSizeEnum, newFontSizeEnum, forceChange) || anyChange; + anyChange = annotations->applyFontSizeToAllTextAnnotations(oldFontSizeEnum, newFontSizeEnum, forceChange) || anyChange; } } } diff --git a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp index 2686fcca33..304c011c0c 100644 --- a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp +++ b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp @@ -64,11 +64,11 @@ RimIdenticalGridCaseGroup::RimIdenticalGridCaseGroup() caseCollection = new RimCaseCollection; caseCollection->uiCapability()->setUiName("Source Cases"); - caseCollection->uiCapability()->setUiIcon(QIcon(":/Cases16x16.png")); + caseCollection->uiCapability()->setUiIcon(":/Cases16x16.png"); statisticsCaseCollection = new RimCaseCollection; statisticsCaseCollection->uiCapability()->setUiName("Derived Statistics"); - statisticsCaseCollection->uiCapability()->setUiIcon(QIcon(":/Histograms16x16.png")); + statisticsCaseCollection->uiCapability()->setUiIcon(":/Histograms16x16.png"); m_mainGrid = nullptr; diff --git a/ApplicationCode/ProjectDataModel/RimIntersection.cpp b/ApplicationCode/ProjectDataModel/RimIntersection.cpp index 71b23f6ce3..d96febc8bc 100644 --- a/ApplicationCode/ProjectDataModel/RimIntersection.cpp +++ b/ApplicationCode/ProjectDataModel/RimIntersection.cpp @@ -316,7 +316,7 @@ QList RimIntersection::calculateValueOptions(const caf:: { caf::PdmChildArrayField& simWells = coll->wells; - QIcon simWellIcon(":/Well.png"); + caf::QIconProvider simWellIcon(":/Well.png"); for (RimSimWellInView* eclWell : simWells) { options.push_back(caf::PdmOptionItemInfo(eclWell->name(), eclWell, false, simWellIcon)); diff --git a/ApplicationCode/ProjectDataModel/RimIntersectionBox.cpp b/ApplicationCode/ProjectDataModel/RimIntersectionBox.cpp index c4e5e061ac..0154fda7ac 100644 --- a/ApplicationCode/ProjectDataModel/RimIntersectionBox.cpp +++ b/ApplicationCode/ProjectDataModel/RimIntersectionBox.cpp @@ -543,21 +543,21 @@ void RimIntersectionBox::updateVisibility() if (m_singlePlaneState == PLANE_STATE_X) { m_maxXCoord.uiCapability()->setUiReadOnly(true); - this->setUiIcon(QIcon(QString(":/IntersectionXPlane16x16.png"))); + this->setUiIcon(QString(":/IntersectionXPlane16x16.png")); } else if (m_singlePlaneState == PLANE_STATE_Y) { m_maxYCoord.uiCapability()->setUiReadOnly(true); - this->setUiIcon(QIcon(QString(":/IntersectionYPlane16x16.png"))); + this->setUiIcon(QString(":/IntersectionYPlane16x16.png")); } else if (m_singlePlaneState == PLANE_STATE_Z) { m_maxDepth.uiCapability()->setUiReadOnly(true); - this->setUiIcon(QIcon(QString(":/IntersectionZPlane16x16.png"))); + this->setUiIcon(QString(":/IntersectionZPlane16x16.png")); } else { - this->setUiIcon(QIcon(QString(":/IntersectionBox16x16.png"))); + this->setUiIcon(QString(":/IntersectionBox16x16.png")); } } diff --git a/ApplicationCode/ProjectDataModel/RimIntersectionCollection.cpp b/ApplicationCode/ProjectDataModel/RimIntersectionCollection.cpp index 0739e526dc..5df6fc282e 100644 --- a/ApplicationCode/ProjectDataModel/RimIntersectionCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimIntersectionCollection.cpp @@ -279,6 +279,8 @@ void RimIntersectionCollection::fieldChangedByUi(const caf::PdmFieldHandle* chan { if (changedField == &isActive) { + updateUiIconFromToggleField(); + Rim3dView* rimView = nullptr; firstAncestorOrThisOfType(rimView); if (rimView) diff --git a/ApplicationCode/ProjectDataModel/RimMdiWindowController.cpp b/ApplicationCode/ProjectDataModel/RimMdiWindowController.cpp index 84f9fb340a..1eda8128c5 100644 --- a/ApplicationCode/ProjectDataModel/RimMdiWindowController.cpp +++ b/ApplicationCode/ProjectDataModel/RimMdiWindowController.cpp @@ -18,7 +18,7 @@ #include "RimMdiWindowController.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimProject.h" #include "RimViewWindow.h" #include "RiuMainWindowBase.h" @@ -122,7 +122,11 @@ QWidget* RimMdiWindowController::viewWidget() //-------------------------------------------------------------------------------------------------- RiuMainWindowBase* RimMdiWindowController::getMainWindow() { - return RiaApplication::instance()->mainWindowByID(m_mainWindowID); + if (RiaGuiApplication::isRunning()) + { + return RiaGuiApplication::instance()->mainWindowByID(m_mainWindowID); + } + return nullptr; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp index a0bedafe20..8af080fb59 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp @@ -218,8 +218,8 @@ void RimPlotAxisProperties::setNameAndAxis(const QString& name, QwtPlot::Axis ax m_name = name; m_axis = axis; - if (axis == QwtPlot::yRight) this->setUiIcon(QIcon(":/RightAxis16x16.png")); - if (axis == QwtPlot::xBottom) this->setUiIcon(QIcon(":/BottomAxis16x16.png")); + if (axis == QwtPlot::yRight) this->setUiIcon(":/RightAxis16x16.png"); + if (axis == QwtPlot::xBottom) this->setUiIcon(":/BottomAxis16x16.png"); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp index 321bb7022e..ac53bc2d33 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp @@ -18,6 +18,7 @@ #include "RimPlotCurve.h" +#include "RiaGuiApplication.h" #include "RimEnsembleCurveSet.h" #include "RimEnsembleCurveSetCollection.h" #include "RimNameConfig.h" @@ -494,12 +495,13 @@ void RimPlotCurve::updateUiIconFromPlotSymbol() { if (m_pointSymbol() != RiuQwtSymbol::NoSymbol) { + CVF_ASSERT(RiaGuiApplication::isRunning()); QColor curveColor(m_curveColor.value().rByte(), m_curveColor.value().gByte(), m_curveColor.value().bByte()); QSizeF iconSize(24, 24); QwtGraphic graphic = m_qwtPlotCurve->legendIcon(0, iconSize); QPixmap pixmap = graphic.toPixmap(); - setUiIcon(QIcon(pixmap)); + setUiIcon(caf::QIconProvider(pixmap)); } } diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 7cf0922fd1..7319f60e6e 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -20,7 +20,7 @@ #include "RimProject.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaCompletionTypeCalculationScheduler.h" #include "RiaFieldHandleTools.h" #include "RiaFilePathTools.h" @@ -89,6 +89,7 @@ #include "cafPdmUiTreeOrdering.h" #include "cvfBoundingBox.h" +#include #include #include @@ -173,15 +174,13 @@ RimProject::RimProject(void) scriptCollection = new RimScriptCollection(); scriptCollection->directory.uiCapability()->setUiHidden(true); scriptCollection->uiCapability()->setUiName("Scripts"); - scriptCollection->uiCapability()->setUiIcon(QIcon(":/octave.png")); + scriptCollection->uiCapability()->setUiIcon(":/octave.png"); mainPlotCollection = new RimMainPlotCollection(); // For now, create a default first oilfield that contains the rest of the project oilFields.push_back(new RimOilField); - initScriptDirectories(); - this->setUiHidden(true); } @@ -238,14 +237,11 @@ void RimProject::close() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProject::initScriptDirectories() +void RimProject::initScriptDirectories(const QString& scriptDirectories) { // // TODO : Must store content of scripts in project file and notify user if stored content is different from disk on execute and edit // - RiaApplication* app = RiaApplication::instance(); - QString scriptDirectories = app->scriptDirectories(); - this->setScriptDirectories(scriptDirectories); // Find largest used caseId read from file and make sure all cases have a valid caseId @@ -318,8 +314,6 @@ void RimProject::initScriptDirectories() //-------------------------------------------------------------------------------------------------- void RimProject::initAfterRead() { - initScriptDirectories(); - // Create an empty oil field in case the project did not contain one if (oilFields.size() < 1) { @@ -384,16 +378,12 @@ void RimProject::initAfterRead() //-------------------------------------------------------------------------------------------------- void RimProject::setupBeforeSave() { - m_show3DWindow = RiuMainWindow::instance()->isVisible(); + RiaGuiApplication* guiApp = RiaGuiApplication::instance(); - if (RiaApplication::instance()->mainPlotWindow() && - RiaApplication::instance()->mainPlotWindow()->isVisible()) + if (guiApp) { - m_showPlotWindow = true; - } - else - { - m_showPlotWindow = false; + m_show3DWindow = guiApp->mainWindow()->isVisible(); + m_showPlotWindow = guiApp->mainPlotWindow() && guiApp->mainPlotWindow()->isVisible(); } m_projectFileVersionString = STRPRODUCTVER; diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index 244185af1c..16d4c4fbb7 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -105,6 +105,8 @@ public: caf::PdmField plotWindowCurrentModelIndexPath; void setScriptDirectories(const QString& scriptDirectories); + void initScriptDirectories(const QString& scriptDirectories); + QString projectFileVersionString() const; bool isProjectFileVersionEqualOrOlderThan(const QString& otherProjectFileVersion) const; void close(); @@ -173,7 +175,6 @@ public: protected: // Overridden methods - void initScriptDirectories(); void initAfterRead() override; void setupBeforeSave() override; diff --git a/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.cpp b/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.cpp index 75de5fa02f..a7e20afe76 100644 --- a/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.cpp @@ -20,7 +20,7 @@ #include "RimRegularLegendConfig.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTables.h" #include "RiaPreferences.h" diff --git a/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.h b/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.h index 9dd94da5f2..3183bddcbc 100644 --- a/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.h +++ b/ApplicationCode/ProjectDataModel/RimRegularLegendConfig.h @@ -146,6 +146,9 @@ private: static cvf::Color3ubArray colorArrayFromColorType(ColorRangesType colorType); + caf::OverlayScalarMapperLegend* getOrCreateScalarMapperLegend(); + caf::CategoryLegend* getOrCreateCategoryLegend(); + private: cvf::ref m_linDiscreteScalarMapper; cvf::ref m_logDiscreteScalarMapper; diff --git a/ApplicationCode/ProjectDataModel/RimStimPlanColors.cpp b/ApplicationCode/ProjectDataModel/RimStimPlanColors.cpp index 66be397e33..e1fc02609d 100644 --- a/ApplicationCode/ProjectDataModel/RimStimPlanColors.cpp +++ b/ApplicationCode/ProjectDataModel/RimStimPlanColors.cpp @@ -197,6 +197,11 @@ void RimStimPlanColors::fieldChangedByUi(const caf::PdmFieldHandle* changedField sourceView->scheduleCreateDisplayModelAndRedraw(); } + if (changedField == objectToggleField()) + { + updateUiIconFromToggleField(); + } + if (changedField == &m_resultNameAndUnit) { updateStimPlanTemplates(); diff --git a/ApplicationCode/ProjectDataModel/RimTernaryLegendConfig.cpp b/ApplicationCode/ProjectDataModel/RimTernaryLegendConfig.cpp index 28af25dd0b..ae974cca5b 100644 --- a/ApplicationCode/ProjectDataModel/RimTernaryLegendConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimTernaryLegendConfig.cpp @@ -19,7 +19,7 @@ #include "RimTernaryLegendConfig.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTables.h" #include "RiaPreferences.h" diff --git a/ApplicationCode/ProjectDataModel/RimTools.cpp b/ApplicationCode/ProjectDataModel/RimTools.cpp index 3ea9fe7429..c460076770 100644 --- a/ApplicationCode/ProjectDataModel/RimTools.cpp +++ b/ApplicationCode/ProjectDataModel/RimTools.cpp @@ -238,7 +238,7 @@ void RimTools::wellPathOptionItems(QList* options) { caf::PdmChildArrayField& wellPaths = wellPathColl->wellPaths; - QIcon wellIcon(":/Well.png"); + caf::QIconProvider wellIcon(":/Well.png"); for (RimWellPath* wellPath : wellPaths) { options->push_back(caf::PdmOptionItemInfo(wellPath->name(), wellPath, false, wellIcon)); @@ -257,7 +257,7 @@ void RimTools::wellPathWithFormationsOptionItems(QList* std::vector wellPaths; RimTools::wellPathWithFormations(&wellPaths); - QIcon wellIcon(":/Well.png"); + caf::QIconProvider wellIcon(":/Well.png"); for (RimWellPath* wellPath : wellPaths) { options->push_back(caf::PdmOptionItemInfo(wellPath->name(), wellPath, false, wellIcon)); @@ -300,7 +300,7 @@ void RimTools::caseOptionItems(QList* options) for (RimCase* c : cases) { - options->push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon())); + options->push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIconProvider())); } } } @@ -324,7 +324,7 @@ void RimTools::eclipseCaseOptionItems(QList* options) RimEclipseCase* eclipseCase = dynamic_cast(c); if (eclipseCase) { - options->push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon())); + options->push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIconProvider())); } } } diff --git a/ApplicationCode/ProjectDataModel/RimViewController.cpp b/ApplicationCode/ProjectDataModel/RimViewController.cpp index 8cce4e56e8..d79eb0e380 100644 --- a/ApplicationCode/ProjectDataModel/RimViewController.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewController.cpp @@ -506,8 +506,10 @@ void RimViewController::defineUiOrdering(QString uiConfigName, caf::PdmUiOrderin //-------------------------------------------------------------------------------------------------- void RimViewController::updateDisplayNameAndIcon() { - RimViewLinker::findNameAndIconFromView(&m_name.v(), &m_originalIcon, managedView()); - RimViewLinker::applyIconEnabledState(this, m_originalIcon, !m_isActive()); + caf::QIconProvider iconProvider; + RimViewLinker::findNameAndIconFromView(&m_name.v(), &iconProvider, managedView()); + iconProvider.setActive(m_isActive()); + setUiIcon(iconProvider); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimViewController.h b/ApplicationCode/ProjectDataModel/RimViewController.h index a254b14939..c4cd5ba54b 100644 --- a/ApplicationCode/ProjectDataModel/RimViewController.h +++ b/ApplicationCode/ProjectDataModel/RimViewController.h @@ -22,6 +22,7 @@ #include "cafPdmField.h" #include "cafPdmObject.h" #include "cafPdmPtrField.h" +#include "cafQIconProvider.h" #include "cvfBase.h" #include "cvfObject.h" @@ -130,6 +131,5 @@ private: caf::PdmField m_syncVisibleCells; caf::PdmField m_syncPropertyFilters; - QIcon m_originalIcon; cvf::ref m_caseToCaseCellMapper; }; diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index 13f59b9ca7..90ee7d3f1a 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -46,6 +46,7 @@ #include "RiuViewer.h" #include "cafPdmUiTreeOrdering.h" +#include "cafQIconProvider.h" #include "cvfCamera.h" #include "cvfMatrix4.h" #include "cvfScene.h" @@ -396,31 +397,14 @@ bool RimViewLinker::isActive() const return viewLinkerCollection->isActive(); } -//-------------------------------------------------------------------------------------------------- -/// Hande icon update locally as PdmUiItem::updateUiIconFromState works only for static icons -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::applyIconEnabledState(caf::PdmObject* obj, const QIcon& icon, bool disable) -{ - QPixmap icPixmap; - icPixmap = icon.pixmap(16, 16, QIcon::Normal); - - if (disable) - { - QIcon temp(icPixmap); - icPixmap = temp.pixmap(16, 16, QIcon::Disabled); - } - - QIcon newIcon(icPixmap); - obj->setUiIcon(newIcon); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimViewLinker::updateUiNameAndIcon() { - RimViewLinker::findNameAndIconFromView(&m_name.v(), &m_originalIcon, m_masterView); - RimViewLinker::applyIconEnabledState(this, m_originalIcon, false); + caf::QIconProvider iconProvider; + RimViewLinker::findNameAndIconFromView(&m_name.v(), &iconProvider, m_masterView); + setUiIcon(iconProvider); } //-------------------------------------------------------------------------------------------------- @@ -448,7 +432,7 @@ void RimViewLinker::scheduleCreateDisplayModelAndRedrawForDependentViews() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::findNameAndIconFromView(QString* name, QIcon* icon, RimGridView* view) +void RimViewLinker::findNameAndIconFromView(QString* name, caf::QIconProvider* icon, RimGridView* view) { CVF_ASSERT(name && icon); @@ -461,20 +445,20 @@ void RimViewLinker::findNameAndIconFromView(QString* name, QIcon* icon, RimGridV if (dynamic_cast(rimCase)) { - *icon = QIcon(":/GeoMechCase48x48.png"); + *icon = caf::QIconProvider(":/GeoMechCase48x48.png"); } else if (dynamic_cast(rimCase)) { - *icon = QIcon(":/Case48x48.png"); + *icon = caf::QIconProvider(":/Case48x48.png"); } else if (dynamic_cast(rimCase)) { - *icon = QIcon(":/EclipseInput48x48.png"); + *icon = caf::QIconProvider(":/EclipseInput48x48.png"); } } else { - *icon = QIcon(); + *icon = caf::QIconProvider(); } } diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.h b/ApplicationCode/ProjectDataModel/RimViewLinker.h index a63002c683..4592ce844c 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.h +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.h @@ -29,9 +29,14 @@ #include "cvfBase.h" #include "cvfVector3.h" +namespace caf +{ +class QIconProvider; +} + namespace cvf { - class BoundingBox; +class BoundingBox; } class RimViewController; @@ -83,8 +88,7 @@ public: void addViewControllers(caf::PdmUiTreeOrdering& uiTreeOrdering) const; - static void applyIconEnabledState(caf::PdmObject* obj, const QIcon& icon, bool disable); - static void findNameAndIconFromView(QString* name, QIcon* icon, RimGridView* view); + static void findNameAndIconFromView(QString* name, caf::QIconProvider* icon, RimGridView* view); void updateCursorPosition(const RimGridView* sourceView, const cvf::Vec3d& domainCoord); @@ -103,5 +107,4 @@ private: caf::PdmChildArrayField m_viewControllers; caf::PdmPtrField m_masterView; caf::PdmField m_name; - QIcon m_originalIcon; }; diff --git a/ApplicationCode/ProjectDataModel/RimViewWindow.cpp b/ApplicationCode/ProjectDataModel/RimViewWindow.cpp index afe9046da0..4f4b9511b7 100644 --- a/ApplicationCode/ProjectDataModel/RimViewWindow.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewWindow.cpp @@ -19,6 +19,7 @@ #include "RimViewWindow.h" #include "RiaFieldHandleTools.h" +#include "RiaGuiApplication.h" #include "RimMdiWindowController.h" @@ -99,6 +100,8 @@ void RimViewWindow::handleMdiWindowClosed() //-------------------------------------------------------------------------------------------------- void RimViewWindow::updateMdiWindowVisibility() { + if (!RiaGuiApplication::isRunning()) return; + if (m_windowController()) { m_windowController->updateViewerWidget(); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp b/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp index e93eccd56d..a1028d32b9 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp @@ -603,7 +603,7 @@ QList RimWellLogCurveCommonDataSource::calculateValueOpt { std::set sortedWellNames = eclipseCase->sortedSimWellNames(); - QIcon simWellIcon(":/Well.png"); + caf::QIconProvider simWellIcon(":/Well.png"); for (const QString& wname : sortedWellNames) { options.push_back(caf::PdmOptionItemInfo(wname, wname, false, simWellIcon)); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp index ad45826220..dd9bd3ae34 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp @@ -582,7 +582,7 @@ QList RimWellLogExtractionCurve::calculateValueOptions(c { std::set sortedWellNames = this->sortedSimWellNames(); - QIcon simWellIcon(":/Well.png"); + caf::QIconProvider simWellIcon(":/Well.png"); for ( const QString& wname: sortedWellNames ) { options.push_back(caf::PdmOptionItemInfo(wname, wname, false, simWellIcon)); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp index c114e6301b..d13b486e66 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp @@ -403,7 +403,7 @@ QList RimWellLogRftCurve::calculateValueOptions(const ca std::set wellNames = reader->wellNames(); for (const QString& name : wellNames) { - options.push_back(caf::PdmOptionItemInfo(name, name, false, QIcon(":/Well.png"))); + options.push_back(caf::PdmOptionItemInfo(name, name, false, caf::QIconProvider(":/Well.png"))); } } } diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp index 13d8347f29..007fe1257e 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp @@ -240,7 +240,7 @@ void RimWellLogTrack::simWellOptionItems(QList* options, sortedWellNames = eclipseCase->eclipseCaseData()->findSortedWellNames(); } - QIcon simWellIcon(":/Well.png"); + caf::QIconProvider simWellIcon(":/Well.png"); for (const QString& wname : sortedWellNames) { options->push_back(caf::PdmOptionItemInfo(wname, wname, false, simWellIcon)); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 8f1995599a..3e67f0314c 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -18,7 +18,7 @@ #include "RimEnsembleCurveSet.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaColorTables.h" #include "RiaStatisticsTools.h" @@ -597,7 +597,7 @@ void RimEnsembleCurveSet::fieldChangedByUi(const caf::PdmFieldHandle* changedFie plot->updatePlotTitle(); plot->updateConnectedEditors(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } } @@ -686,9 +686,13 @@ void RimEnsembleCurveSet::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrd uiTreeOrdering.skipRemainingChildren(true); // Reset dynamic icon - this->setUiIcon(QIcon()); + this->setUiIcon(caf::QIconProvider()); // Get static one - QIcon icon = this->uiIcon(); + caf::QIconProvider iconProvider = this->uiIconProvider(); + + if (iconProvider.isNull()) return; + + QIcon icon = iconProvider.icon(); RimEnsembleCurveSetCollection* coll = nullptr; this->firstAncestorOrThisOfType(coll); @@ -698,11 +702,10 @@ void RimEnsembleCurveSet::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrd QPainter painter(&combined); QPixmap updownpixmap(":/StepUpDownCorner16x16.png"); painter.drawPixmap(0,0,updownpixmap); - - icon = QIcon(combined); + iconProvider.setPixmap(combined); } - this->setUiIcon(icon); + this->setUiIcon(iconProvider); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp index 7e09a7401e..d5f51a5b76 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp @@ -19,7 +19,7 @@ #include "RimObservedDataCollection.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.h" @@ -108,7 +108,7 @@ void updateNewSummaryObjectCreated(caf::PdmObject* object) caf::PdmUiObjectEditorHandle::updateUiAllObjectEditors(); - RiuPlotMainWindow* mpw = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mpw = RiaGuiApplication::instance()->mainPlotWindow(); if (mpw) mpw->updateSummaryPlotToolBar(); } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index 10a6d23a92..61f6f1c795 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -576,8 +576,8 @@ QString RimSummaryCaseCollection::nameAndItemCount() const //-------------------------------------------------------------------------------------------------- void RimSummaryCaseCollection::updateIcon() { - if (m_isEnsemble) setUiIcon(QIcon(":/SummaryEnsemble16x16.png")); - else setUiIcon(QIcon(":/SummaryGroup16x16.png")); + if (m_isEnsemble) setUiIcon(":/SummaryEnsemble16x16.png"); + else setUiIcon(":/SummaryGroup16x16.png"); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp index b1a519cdfc..8efab09409 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp @@ -76,7 +76,7 @@ void RimSummaryCrossPlotCollection::summaryPlotItemInfos(QListuiCapability()->uiIcon(); + caf::QIconProvider icon = plot->uiCapability()->uiIconProvider(); QString displayName = plot->description(); optionInfos->push_back(caf::PdmOptionItemInfo(displayName, plot, false, icon)); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index b946580ce7..9b07f1e12b 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -18,7 +18,7 @@ #include "RimSummaryCurve.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaDefines.h" #include "RifReaderEclipseSummary.h" @@ -584,9 +584,12 @@ void RimSummaryCurve::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrderin RimPlotCurve::defineUiTreeOrdering(uiTreeOrdering, uiConfigName); // Reset dynamic icon - this->setUiIcon(QIcon()); + this->setUiIcon(caf::QIconProvider()); // Get static one - QIcon icon = this->uiIcon(); + caf::QIconProvider iconProvider = this->uiIconProvider(); + if (iconProvider.isNull()) return; + + QIcon icon = iconProvider.icon(); RimSummaryCurveCollection* coll = nullptr; this->firstAncestorOrThisOfType(coll); @@ -596,11 +599,9 @@ void RimSummaryCurve::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrderin QPainter painter(&combined); QPixmap updownpixmap(":/StepUpDownCorner16x16.png"); painter.drawPixmap(0,0,updownpixmap); - - icon = QIcon(combined); + iconProvider.setPixmap(combined); + setUiIcon(iconProvider); } - - this->setUiIcon(icon); } //-------------------------------------------------------------------------------------------------- @@ -872,7 +873,7 @@ void RimSummaryCurve::fieldChangedByUi(const caf::PdmFieldHandle* changedField, plot->updatePlotTitle(); plot->updateConnectedEditors(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); if (m_showCurve() == true) @@ -1030,7 +1031,7 @@ void RimSummaryCurve::fieldChangedByUi(const caf::PdmFieldHandle* changedField, plot->updatePlotTitle(); plot->updateConnectedEditors(); - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp index 44fad92fd8..d646c7826d 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp @@ -88,10 +88,8 @@ void RimSummaryPlotCollection::summaryPlotItemInfos(QListuiCapability()->uiIcon(); QString displayName = plot->description(); - - optionInfos->push_back(caf::PdmOptionItemInfo(displayName, plot, false, icon)); + optionInfos->push_back(caf::PdmOptionItemInfo(displayName, plot, false, plot->uiCapability()->uiIconProvider())); } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index bef4ebd249..0712440fcb 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -18,7 +18,7 @@ #include "RimSummaryPlotSourceStepping.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaSummaryCurveAnalyzer.h" #include "RiaSummaryCurveDefinition.h" @@ -364,7 +364,7 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c ensembleCurveColl->updateConnectedEditors(); } - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->getOrCreateMainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); bool forceUpdateOfFieldsInToolbar = true; mainPlotWindow->updateSummaryPlotToolBar(forceUpdateOfFieldsInToolbar); @@ -580,7 +580,7 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi(const caf::PdmFieldHandle* c curveCollection->updateConnectedEditors(); } - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateSummaryPlotToolBar(); } } diff --git a/ApplicationCode/SocketInterface/RiaSocketTools.cpp b/ApplicationCode/SocketInterface/RiaSocketTools.cpp index 54fec4968d..26ac13f5f6 100644 --- a/ApplicationCode/SocketInterface/RiaSocketTools.cpp +++ b/ApplicationCode/SocketInterface/RiaSocketTools.cpp @@ -130,13 +130,13 @@ bool RiaSocketTools::writeBlockData(RiaSocketServer* server, QTcpSocket* socket, { for (int i = 0; i < errorMessages.size(); i++) { - server->showErrorMessage(errorMessages[i]); + RiaApplication::instance()->showErrorMessage(errorMessages[i]); } // double totalTimeMS = timer.time() * 1000.0; // QString resultInfo = QString("Total time '%1 ms'").arg(totalTimeMS); // -// server->showMessage(resultInfo); +// RiaApplication::instance()->showErrorMessage(resultInfo); } return writeSucceded; diff --git a/ApplicationCode/UserInterface/CMakeLists_files.cmake b/ApplicationCode/UserInterface/CMakeLists_files.cmake index c56cbeb05d..7e4b0ae1b7 100644 --- a/ApplicationCode/UserInterface/CMakeLists_files.cmake +++ b/ApplicationCode/UserInterface/CMakeLists_files.cmake @@ -83,6 +83,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotTools.h ${CMAKE_CURRENT_LIST_DIR}/RiuWellPathComponentPlotItem.h ${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementViewEventFilter.h ${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.h +${CMAKE_CURRENT_LIST_DIR}/RiuMdiMaximizeWindowGuard.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -165,6 +166,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotItemGroup.cpp ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RiuWellPathComponentPlotItem.cpp ${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.cpp +${CMAKE_CURRENT_LIST_DIR}/RiuMdiMaximizeWindowGuard.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/UserInterface/RiuCvfOverlayItemWidget.cpp b/ApplicationCode/UserInterface/RiuCvfOverlayItemWidget.cpp index 03ef42752b..35f0bc0ad9 100644 --- a/ApplicationCode/UserInterface/RiuCvfOverlayItemWidget.cpp +++ b/ApplicationCode/UserInterface/RiuCvfOverlayItemWidget.cpp @@ -18,7 +18,7 @@ #include "RiuCvfOverlayItemWidget.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "cafTitledOverlayFrame.h" #include "cafViewer.h" @@ -66,7 +66,7 @@ void RiuCvfOverlayItemWidget::updateFromOverlayItem( caf::TitledOverlayFrame * i unsigned int height = item->renderSize().y(); QGLFormat glFormat; - glFormat.setDirectRendering(RiaApplication::instance()->useShaders()); + glFormat.setDirectRendering(RiaGuiApplication::instance()->useShaders()); // Enforce no border to avoid item->setBackgroundFrameColor(cvf::Color4f(0, 0, 0, 0)); @@ -88,7 +88,7 @@ void RiuCvfOverlayItemWidget::updateFromOverlayItem( caf::TitledOverlayFrame * i cvf::ref renderingSequence = new cvf::RenderSequence; renderingSequence->addRendering(rendering.p()); - if (RiaApplication::instance()->useShaders()) + if (RiaGuiApplication::instance()->useShaders()) { // Set up frame and render buffers diff --git a/ApplicationCode/UserInterface/RiuMainWindow.cpp b/ApplicationCode/UserInterface/RiuMainWindow.cpp index 2d70a0a69d..26d94e4cf8 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainWindow.cpp @@ -20,7 +20,7 @@ #include "RiuMainWindow.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaBaseDefs.h" #include "RiaPreferences.h" #include "RiaRegressionTest.h" @@ -159,7 +159,11 @@ RiuMainWindow::RiuMainWindow() //-------------------------------------------------------------------------------------------------- RiuMainWindow* RiuMainWindow::instance() { - return RiaApplication::instance()->mainWindow(); + if (RiaGuiApplication::isRunning()) + { + return RiaGuiApplication::instance()->mainWindow(); + } + return nullptr; } //-------------------------------------------------------------------------------------------------- @@ -266,7 +270,7 @@ void RiuMainWindow::cleanupGuiBeforeProjectClose() //-------------------------------------------------------------------------------------------------- void RiuMainWindow::closeEvent(QCloseEvent* event) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); app->saveMainWinGeoAndDockToolBarLayout(); @@ -461,7 +465,7 @@ void RiuMainWindow::createMenus() fileMenu->addAction(cmdFeatureMgr->action("RicSaveProjectFeature")); fileMenu->addAction(cmdFeatureMgr->action("RicSaveProjectAsFeature")); - std::vector recentFileActions = RiaApplication::instance()->recentFileActions(); + std::vector recentFileActions = RiaGuiApplication::instance()->recentFileActions(); for (auto act : recentFileActions) { fileMenu->addAction(act); diff --git a/ApplicationCode/UserInterface/RiuMdiMaximizeWindowGuard.cpp b/ApplicationCode/UserInterface/RiuMdiMaximizeWindowGuard.cpp new file mode 100644 index 0000000000..a1e89eddf8 --- /dev/null +++ b/ApplicationCode/UserInterface/RiuMdiMaximizeWindowGuard.cpp @@ -0,0 +1,49 @@ +#include "RiuMdiMaximizeWindowGuard.h" + +#include "RiaGuiApplication.h" +#include "RiuMainWindow.h" +#include "RiuPlotMainWindow.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuMdiMaximizeWindowGuard::RiuMdiMaximizeWindowGuard() +{ + { + RiuMainWindow* mainWindow = RiaGuiApplication::instance()->mainWindow(); + if (mainWindow) + { + mainWindow->enableShowFirstVisibleMdiWindowMaximized(false); + } + } + + { + RiuPlotMainWindow* plotMainWindow = RiaGuiApplication::instance()->mainPlotWindow(); + if (plotMainWindow) + { + plotMainWindow->enableShowFirstVisibleMdiWindowMaximized(false); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuMdiMaximizeWindowGuard::~RiuMdiMaximizeWindowGuard() +{ + { + RiuMainWindow* mainWindow = RiaGuiApplication::instance()->mainWindow(); + if (mainWindow) + { + mainWindow->enableShowFirstVisibleMdiWindowMaximized(true); + } + } + + { + RiuPlotMainWindow* plotMainWindow = RiaGuiApplication::instance()->mainPlotWindow(); + if (plotMainWindow) + { + plotMainWindow->enableShowFirstVisibleMdiWindowMaximized(true); + } + } +} diff --git a/ApplicationCode/UserInterface/RiuMdiMaximizeWindowGuard.h b/ApplicationCode/UserInterface/RiuMdiMaximizeWindowGuard.h new file mode 100644 index 0000000000..12d0038c96 --- /dev/null +++ b/ApplicationCode/UserInterface/RiuMdiMaximizeWindowGuard.h @@ -0,0 +1,32 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2011- Statoil ASA +// Copyright (C) 2013- Ceetron Solutions AS +// Copyright (C) 2011-2012 Ceetron AS +// +// 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +class RiuMdiMaximizeWindowGuard +{ +public: + RiuMdiMaximizeWindowGuard(); + ~RiuMdiMaximizeWindowGuard(); +}; + + diff --git a/ApplicationCode/UserInterface/RiuMdiSubWindow.cpp b/ApplicationCode/UserInterface/RiuMdiSubWindow.cpp index 56ddd44deb..7999d79c25 100644 --- a/ApplicationCode/UserInterface/RiuMdiSubWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMdiSubWindow.cpp @@ -18,7 +18,7 @@ #include "RiuMdiSubWindow.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "Rim3dView.h" #include "RimSummaryPlot.h" @@ -59,7 +59,7 @@ RimMdiWindowGeometry RiuMdiSubWindow::windowGeometry() const RimMdiWindowGeometry geo; int mainWinID = 0; - if (window() == RiaApplication::instance()->mainPlotWindow()) + if (window() == RiaGuiApplication::instance()->mainPlotWindow()) { mainWinID = 1; } @@ -132,13 +132,13 @@ void RiuMdiSubWindow::resizeEvent(QResizeEvent* resizeEvent) if (!m_blockTilingChanges) { - if (window() == RiaApplication::instance()->mainWindow()) + if (window() == RiaGuiApplication::instance()->mainWindow()) { - RiaApplication::instance()->mainWindow()->storeSubWindowTiling(false); + RiaGuiApplication::instance()->mainWindow()->storeSubWindowTiling(false); } - else if (window() == RiaApplication::instance()->mainPlotWindow()) + else if (window() == RiaGuiApplication::instance()->mainPlotWindow()) { - RiaApplication::instance()->mainPlotWindow()->storeSubWindowTiling(false); + RiaGuiApplication::instance()->mainPlotWindow()->storeSubWindowTiling(false); } } @@ -157,13 +157,13 @@ void RiuMdiSubWindow::moveEvent(QMoveEvent* moveEvent) if (!m_blockTilingChanges) { - if (window() == RiaApplication::instance()->mainWindow()) + if (window() == RiaGuiApplication::instance()->mainWindow()) { - RiaApplication::instance()->mainWindow()->storeSubWindowTiling(false); + RiaGuiApplication::instance()->mainWindow()->storeSubWindowTiling(false); } - else if (window() == RiaApplication::instance()->mainPlotWindow()) + else if (window() == RiaGuiApplication::instance()->mainPlotWindow()) { - RiaApplication::instance()->mainPlotWindow()->storeSubWindowTiling(false); + RiaGuiApplication::instance()->mainPlotWindow()->storeSubWindowTiling(false); } } diff --git a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp index cc0fa9b57b..4e06f9b0e3 100644 --- a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp @@ -178,7 +178,7 @@ void RiuPlotMainWindow::cleanUpTemporaryWidgets() //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindow::closeEvent(QCloseEvent* event) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); app->savePlotWinGeoAndDockToolBarLayout(); @@ -260,7 +260,7 @@ void RiuPlotMainWindow::createMenus() fileMenu->addAction(cmdFeatureMgr->action("RicSaveProjectFeature")); fileMenu->addAction(cmdFeatureMgr->action("RicSaveProjectAsFeature")); - std::vector recentFileActions = RiaApplication::instance()->recentFileActions(); + std::vector recentFileActions = RiaGuiApplication::instance()->recentFileActions(); for (auto act : recentFileActions) { fileMenu->addAction(act); diff --git a/ApplicationCode/UserInterface/RiuPlotMainWindowTools.cpp b/ApplicationCode/UserInterface/RiuPlotMainWindowTools.cpp index 4248fdaf79..3a55288cd8 100644 --- a/ApplicationCode/UserInterface/RiuPlotMainWindowTools.cpp +++ b/ApplicationCode/UserInterface/RiuPlotMainWindowTools.cpp @@ -17,7 +17,7 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiuPlotMainWindowTools.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuPlotMainWindow.h" //-------------------------------------------------------------------------------------------------- @@ -25,7 +25,7 @@ //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindowTools::showPlotMainWindow() { - RiaApplication::instance()->getOrCreateAndShowMainPlotWindow(); + RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); } //-------------------------------------------------------------------------------------------------- @@ -33,7 +33,7 @@ void RiuPlotMainWindowTools::showPlotMainWindow() //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindowTools::setActiveViewer(QWidget* subWindow) { - RiuPlotMainWindow* mpw = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mpw = RiaGuiApplication::instance()->mainPlotWindow(); if (mpw) mpw->setActiveViewer(subWindow); } @@ -43,7 +43,7 @@ void RiuPlotMainWindowTools::setActiveViewer(QWidget* subWindow) //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindowTools::setExpanded(const caf::PdmUiItem* uiItem, bool expanded /*= true*/) { - RiuPlotMainWindow* mpw = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mpw = RiaGuiApplication::instance()->mainPlotWindow(); if (mpw) mpw->setExpanded(uiItem, expanded); } @@ -53,7 +53,7 @@ void RiuPlotMainWindowTools::setExpanded(const caf::PdmUiItem* uiItem, bool expa //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindowTools::selectAsCurrentItem(const caf::PdmObject* object, bool allowActiveViewChange /*= true*/) { - RiuPlotMainWindow* mpw = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mpw = RiaGuiApplication::instance()->mainPlotWindow(); if (mpw) mpw->selectAsCurrentItem(object, allowActiveViewChange); } @@ -63,7 +63,7 @@ void RiuPlotMainWindowTools::selectAsCurrentItem(const caf::PdmObject* object, b //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindowTools::refreshToolbars() { - RiuPlotMainWindow* mpw = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mpw = RiaGuiApplication::instance()->mainPlotWindow(); if (mpw) { diff --git a/ApplicationCode/UserInterface/RiuPlotObjectPicker.cpp b/ApplicationCode/UserInterface/RiuPlotObjectPicker.cpp index ca09f25809..409e99e7cd 100644 --- a/ApplicationCode/UserInterface/RiuPlotObjectPicker.cpp +++ b/ApplicationCode/UserInterface/RiuPlotObjectPicker.cpp @@ -18,7 +18,7 @@ #include "RiuPlotObjectPicker.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiuPlotMainWindow.h" #include @@ -39,7 +39,7 @@ RiuPlotObjectPicker::RiuPlotObjectPicker(QWidget* widget, caf::PdmObject* associ //-------------------------------------------------------------------------------------------------- bool RiuPlotObjectPicker::eventFilter(QObject* watchedObject, QEvent* event) { - RiuPlotMainWindow* mainPlotWindow = RiaApplication::instance()->mainPlotWindow(); + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); if (mainPlotWindow && m_associatedObject.notNull()) { if (event->type() == QEvent::MouseButtonPress) diff --git a/ApplicationCode/UserInterface/RiuRecentFileActionProvider.cpp b/ApplicationCode/UserInterface/RiuRecentFileActionProvider.cpp index aa7b62cb1e..a8b12763c9 100644 --- a/ApplicationCode/UserInterface/RiuRecentFileActionProvider.cpp +++ b/ApplicationCode/UserInterface/RiuRecentFileActionProvider.cpp @@ -18,7 +18,7 @@ #include "RiuRecentFileActionProvider.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaFilePathTools.h" #include @@ -125,7 +125,7 @@ void RiuRecentFileActionProvider::slotOpenRecentFile() { QString fileName = RiaFilePathTools::toInternalSeparator(action->data().toString()); - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); if (RiaApplication::hasValidProjectFileExtension(fileName)) { if (!app->askUserToSaveModifiedProject()) return; diff --git a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp index 957683e7fa..eeb6bdb8ab 100644 --- a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp +++ b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp @@ -21,7 +21,7 @@ #include "ToggleCommands/RicToggleItemsFeatureImpl.h" -#include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RimCaseCollection.h" #include "RimEclipseCase.h" @@ -104,9 +104,9 @@ bool RiuTreeViewEventFilter::eventFilter(QObject *obj, QEvent *event) { toggleStateForSelection = false; } - else if (RiaApplication::instance()->mainPlotWindow() && - RiaApplication::instance()->mainPlotWindow()->projectTreeView() && - RiaApplication::instance()->mainPlotWindow()->projectTreeView()->isTreeItemEditWidgetActive()) + else if (RiaGuiApplication::instance()->mainPlotWindow() && + RiaGuiApplication::instance()->mainPlotWindow()->projectTreeView() && + RiaGuiApplication::instance()->mainPlotWindow()->projectTreeView()->isTreeItemEditWidgetActive()) { toggleStateForSelection = false; } diff --git a/ApplicationCode/UserInterface/RiuViewer.cpp b/ApplicationCode/UserInterface/RiuViewer.cpp index 70084ed0d2..f3db2871f5 100644 --- a/ApplicationCode/UserInterface/RiuViewer.cpp +++ b/ApplicationCode/UserInterface/RiuViewer.cpp @@ -93,9 +93,9 @@ RiuViewer::RiuViewer(const QGLFormat& format, QWidget* parent) : caf::Viewer(format, parent) , m_isNavigationRotationEnabled(true) { - cvf::Font* standardFont = RiaApplication::instance()->defaultSceneFont(); - QFont font = QApplication::font(); - font.setPointSize(RiaFontCache::pointSizeFromFontSizeEnum(RiaApplication::instance()->preferences()->defaultSceneFontSize())); + cvf::Font* standardFont = RiaGuiApplication::instance()->defaultSceneFont(); + QFont font = RiaGuiApplication::instance()->font(); + font.setPointSize(RiaFontCache::pointSizeFromFontSizeEnum(RiaGuiApplication::instance()->preferences()->defaultSceneFontSize())); m_axisCross = new cvf::OverlayAxisCross(m_mainCamera.p(), standardFont); m_axisCross->setAxisLabels("X", "Y", "Z"); @@ -559,7 +559,7 @@ void RiuViewer::removeAllColorLegends() //-------------------------------------------------------------------------------------------------- void RiuViewer::addColorLegendToBottomLeftCorner(caf::TitledOverlayFrame* addedLegend) { - RiaApplication* app = RiaApplication::instance(); + RiaGuiApplication* app = RiaGuiApplication::instance(); CVF_ASSERT(app); RiaPreferences* preferences = app->preferences(); cvf::Rendering* firstRendering = m_mainRendering.p(); @@ -689,21 +689,21 @@ void RiuViewer::enableNavigationRotation(bool enable) //-------------------------------------------------------------------------------------------------- void RiuViewer::updateNavigationPolicy() { - switch (RiaApplication::instance()->navigationPolicy()) + switch (RiaGuiApplication::instance()->navigationPolicy()) { - case RiaApplication::NAVIGATION_POLICY_CAD: + case RiaGuiApplication::NAVIGATION_POLICY_CAD: setNavigationPolicy(new RiuCadNavigation); break; - case RiaApplication::NAVIGATION_POLICY_CEETRON: + case RiaGuiApplication::NAVIGATION_POLICY_CEETRON: setNavigationPolicy(new caf::CeetronPlusNavigation); break; - case RiaApplication::NAVIGATION_POLICY_GEOQUEST: + case RiaGuiApplication::NAVIGATION_POLICY_GEOQUEST: setNavigationPolicy(new RiuGeoQuestNavigation); break; - case RiaApplication::NAVIGATION_POLICY_RMS: + case RiaGuiApplication::NAVIGATION_POLICY_RMS: setNavigationPolicy(new RiuRmsNavigation); break; @@ -1062,7 +1062,7 @@ void RiuViewer::clearHoverCursor() //-------------------------------------------------------------------------------------------------- void RiuViewer::updateFonts() { - cvf::Font* standardFont = RiaApplication::instance()->defaultSceneFont(); + cvf::Font* standardFont = RiaGuiApplication::instance()->defaultSceneFont(); m_mainRendering->removeOverlayItem(m_axisCross.p()); m_axisCross = new cvf::OverlayAxisCross(m_mainCamera.p(), standardFont); diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeature.cpp b/Fwk/AppFwk/cafCommand/cafCmdFeature.cpp index d1133284ca..f6a3cf97b4 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeature.cpp +++ b/Fwk/AppFwk/cafCommand/cafCmdFeature.cpp @@ -42,7 +42,7 @@ #include "cafPdmUiModelChangeDetector.h" #include - +#include namespace caf { @@ -106,7 +106,10 @@ QAction* CmdFeature::actionWithUserData(const QString& customText, const QVarian action->setData(userData); } - this->setupActionLook(action); + if (dynamic_cast(QCoreApplication::instance())) + { + this->setupActionLook(action); + } if (!customText.isEmpty()) { action->setText(customText); diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmObject.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmObject.h index 2914a7ecfc..d263892418 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmObject.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmObject.h @@ -61,6 +61,7 @@ class QXmlStreamWriter; #include "cafInternalPdmXmlFieldCapability.h" #include "cafPdmUiFieldSpecialization.h" +#include "cafQIconProvider.h" namespace caf @@ -85,7 +86,7 @@ class PdmObjectCapability; this->isInheritedFromPdmUiObject(); \ this->isInheritedFromPdmXmlSerializable(); \ \ - static caf::PdmUiItemInfo objDescr(uiName, QIcon(QString(iconResourceName)), toolTip, whatsThis); \ + static caf::PdmUiItemInfo objDescr(uiName, QString(iconResourceName), toolTip, whatsThis); \ this->setUiItemInfo(&objDescr); \ } @@ -106,7 +107,7 @@ class PdmObjectCapability; AddXmlCapabilityToField(field); \ AddUiCapabilityToField(field); \ \ - static caf::PdmUiItemInfo objDescr(uiName, QIcon(QString(iconResourceName)), toolTip, whatsThis, keyword); \ + static caf::PdmUiItemInfo objDescr(uiName, QString(iconResourceName), toolTip, whatsThis, keyword); \ addFieldUi(field, keyword, default, &objDescr); \ } @@ -124,7 +125,7 @@ class PdmObjectCapability; AddXmlCapabilityToField(field); \ AddUiCapabilityToField(field); \ \ - static caf::PdmUiItemInfo objDescr(uiName, QIcon(QString(iconResourceName)), toolTip, whatsThis, keyword); \ + static caf::PdmUiItemInfo objDescr(uiName, QString(iconResourceName), toolTip, whatsThis, keyword); \ addFieldUiNoDefault(field, keyword, &objDescr); \ } diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt index c400014550..5b4305ef87 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt @@ -76,6 +76,8 @@ set( PROJECT_FILES cafPdmUiSelection3dEditorVisualizer.cpp cafQShortenedLabel.cpp cafQShortenedLabel.h + cafQIconProvider.cpp + cafQIconProvider.h ) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inl b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inl index 34b98ff1db..ded2cc2fd1 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inl +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inl @@ -209,7 +209,7 @@ QList caf::PdmFieldUiCap::valueOptions(bool* useOp { if(!uiBasedQVariant.toString().isEmpty()) { - m_optionEntryCache.push_front(PdmOptionItemInfo(uiBasedQVariant.toString(), uiBasedQVariant, true, QIcon())); + m_optionEntryCache.push_front(PdmOptionItemInfo(uiBasedQVariant.toString(), uiBasedQVariant, true)); } } else // The field value is a list of values @@ -228,7 +228,7 @@ QList caf::PdmFieldUiCap::valueOptions(bool* useOp if(!isFound && !valuesSelectedInField[i].toString().isEmpty()) { - m_optionEntryCache.push_front(PdmOptionItemInfo(valuesSelectedInField[i].toString(), valuesSelectedInField[i], true, QIcon())); + m_optionEntryCache.push_front(PdmOptionItemInfo(valuesSelectedInField[i].toString(), valuesSelectedInField[i], true)); } } } diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp index cca07972ea..4d17f8a3f2 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp @@ -41,17 +41,79 @@ namespace caf { + + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText, - const QVariant& aValue, - bool isReadOnly /* = false */, - QIcon anIcon /* = QIcon()*/) +PdmUiItemInfo::PdmUiItemInfo(const QString& uiName, + QIconProvider iconProvider /*= QIconProvider() */, + QString toolTip /*= ""*/, + QString whatsThis /*= ""*/, + QString extraDebugText /*= ""*/) + : m_uiName(uiName) + , m_iconProvider(iconProvider) + , m_toolTip(toolTip) + , m_whatsThis(whatsThis) + , m_extraDebugText(extraDebugText) + , m_editorTypeName("") + , m_isHidden(false) + , m_isTreeChildrenHidden(false) + , m_isReadOnly(false) + , m_labelAlignment(LEFT) + , m_isCustomContextMenuEnabled(false) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +PdmUiItemInfo::PdmUiItemInfo(const QString& uiName, + QString iconResourceLocation /*= ""*/, + QString toolTip /*= ""*/, + QString whatsThis /*= ""*/, + QString extraDebugText /*= ""*/) + : m_uiName(uiName) + , m_iconProvider(iconResourceLocation) + , m_toolTip(toolTip) + , m_whatsThis(whatsThis) + , m_extraDebugText(extraDebugText) + , m_editorTypeName("") + , m_isHidden(false) + , m_isTreeChildrenHidden(false) + , m_isReadOnly(false) + , m_labelAlignment(LEFT) + , m_isCustomContextMenuEnabled(false) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIcon PdmUiItemInfo::icon() const +{ + return m_iconProvider.icon(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const QIconProvider& PdmUiItemInfo::iconProvider() const +{ + return m_iconProvider; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText, + const QVariant& aValue, + bool isReadOnly /* = false */, + const QIconProvider& anIcon /* = QIconProvider()*/) : m_optionUiText(anOptionUiText) , m_value(aValue) , m_isReadOnly(isReadOnly) - , m_icon(anIcon) + , m_iconProvider(anIcon) , m_level(0) { } @@ -62,10 +124,10 @@ PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText, PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText, caf::PdmObjectHandle* obj, bool isReadOnly /*= false*/, - QIcon anIcon /*= QIcon()*/) + const QIconProvider& anIcon /*= QIconProvider()*/) : m_optionUiText(anOptionUiText) , m_isReadOnly(isReadOnly) - , m_icon(anIcon) + , m_iconProvider(anIcon) , m_level(0) { m_value = QVariant::fromValue(caf::PdmPointer(obj)); @@ -75,7 +137,7 @@ PdmOptionItemInfo::PdmOptionItemInfo(const QString& anOptionUiText, /// //-------------------------------------------------------------------------------------------------- PdmOptionItemInfo - PdmOptionItemInfo::createHeader(const QString& anOptionUiText, bool isReadOnly /*= false*/, QIcon anIcon /*= QIcon()*/) + PdmOptionItemInfo::createHeader(const QString& anOptionUiText, bool isReadOnly /*= false*/, const QIconProvider& anIcon /*= QIconProvider()*/) { PdmOptionItemInfo header(anOptionUiText, QVariant(), isReadOnly, anIcon); @@ -127,7 +189,7 @@ bool PdmOptionItemInfo::isHeading() const //-------------------------------------------------------------------------------------------------- const QIcon PdmOptionItemInfo::icon() const { - return m_icon; + return m_iconProvider.icon(); } //-------------------------------------------------------------------------------------------------- @@ -188,23 +250,38 @@ void PdmUiItem::setUiName(const QString& uiName, const QString& uiConfigName /*= //-------------------------------------------------------------------------------------------------- const QIcon PdmUiItem::uiIcon(const QString& uiConfigName) const { - const PdmUiItemInfo* conInfo = configInfo(uiConfigName); - const PdmUiItemInfo* defInfo = defaultInfo(); - const PdmUiItemInfo* sttInfo = m_staticItemInfo; - - if (conInfo && !(conInfo->m_icon.isNull())) return conInfo->m_icon; - if (defInfo && !(defInfo->m_icon.isNull())) return defInfo->m_icon; - if (sttInfo && !(sttInfo->m_icon.isNull())) return sttInfo->m_icon; - - return QIcon(); + return uiIconProvider(uiConfigName).icon(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void PdmUiItem::setUiIcon(const QIcon& uiIcon, const QString& uiConfigName /*= ""*/) +const QIconProvider PdmUiItem::uiIconProvider(const QString& uiConfigName) const { - m_configItemInfos[uiConfigName].m_icon = uiIcon; + const PdmUiItemInfo* conInfo = configInfo(uiConfigName); + const PdmUiItemInfo* defInfo = defaultInfo(); + const PdmUiItemInfo* sttInfo = m_staticItemInfo; + + if (conInfo && !(conInfo->iconProvider().isNull())) return conInfo->iconProvider(); + if (defInfo && !(defInfo->iconProvider().isNull())) return defInfo->iconProvider(); + if (sttInfo && !(sttInfo->iconProvider().isNull())) return sttInfo->iconProvider(); + + return QIconProvider(); +} +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiItem::setUiIcon(const QIconProvider& uiIconProvider, const QString& uiConfigName /*= ""*/) +{ + m_configItemInfos[uiConfigName].m_iconProvider = uiIconProvider; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiItem::setUiIcon(const QString& uiIconResourceName, const QString& uiConfigName /*= ""*/) +{ + setUiIcon(caf::QIconProvider(uiIconResourceName), uiConfigName); } //-------------------------------------------------------------------------------------------------- @@ -575,32 +652,9 @@ PdmUiItem::PdmUiItem() //-------------------------------------------------------------------------------------------------- void PdmUiItem::updateUiIconFromState(bool isActive, const QString& uiConfigName) { - static const QString iconStorageConfigNamePostfix = "_Internally_StoredNormalIcon"; - const PdmUiItemInfo* conInfo = configInfo(uiConfigName + iconStorageConfigNamePostfix); - QIcon normalIcon; - - if (conInfo) - { - normalIcon = conInfo->m_icon; - } - else - { - normalIcon = this->uiIcon(uiConfigName); - } - - this->setUiIcon(normalIcon, uiConfigName + iconStorageConfigNamePostfix); - - if (isActive) - { - this->setUiIcon(normalIcon, uiConfigName); - m_configItemInfos.erase(uiConfigName + iconStorageConfigNamePostfix); - } - else - { - QIcon disabledIcon(normalIcon.pixmap(16, 16, QIcon::Disabled)); - this->setUiIcon(disabledIcon, uiConfigName); - this->setUiIcon(normalIcon, uiConfigName + iconStorageConfigNamePostfix); - } + QIconProvider normalIconProvider = this->uiIconProvider(uiConfigName); + normalIconProvider.setActive(isActive); + this->setUiIcon(normalIconProvider, uiConfigName); } //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h index f1bcc325fa..954f61b0ca 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h @@ -38,9 +38,10 @@ #pragma once #include "cafPdmUiFieldSpecialization.h" +#include "cafQIconProvider.h" +#include #include -#include #include #include @@ -55,6 +56,13 @@ namespace caf class PdmUiItemInfo { public: + enum LabelPosType + { + LEFT, + TOP, + HIDDEN + }; + PdmUiItemInfo() : m_editorTypeName("") , m_isHidden(-1) @@ -64,26 +72,25 @@ public: , m_isCustomContextMenuEnabled(-1) {} - PdmUiItemInfo(const QString& uiName, QIcon icon = QIcon(), QString toolTip = "", QString whatsThis = "", QString extraDebugText = "") - : m_uiName(uiName) - , m_icon(icon) - , m_toolTip(toolTip) - , m_whatsThis(whatsThis) - , m_extraDebugText(extraDebugText) - , m_editorTypeName("") - , m_isHidden(false) - , m_isTreeChildrenHidden(false) - , m_isReadOnly(false) - , m_labelAlignment(LEFT) - , m_isCustomContextMenuEnabled(false) - { } + PdmUiItemInfo(const QString& uiName, + QString iconResourceLocation = "", + QString toolTip = "", + QString whatsThis = "", + QString extraDebugText = ""); - enum LabelPosType { LEFT, TOP, HIDDEN }; + PdmUiItemInfo(const QString& uiName, + QIconProvider iconProvider = QIconProvider(), + QString toolTip = "", + QString whatsThis = "", + QString extraDebugText = ""); + + QIcon icon() const; + const QIconProvider& iconProvider() const; private: friend class PdmUiItem; QString m_uiName; - QIcon m_icon; + QIconProvider m_iconProvider; QColor m_contentTextColor; ///< Color of a fields value text. Invalid by default. An Invalid color is not used. QString m_toolTip; QString m_whatsThis; @@ -104,10 +111,10 @@ private: class PdmOptionItemInfo { public: - PdmOptionItemInfo(const QString& anOptionUiText, const QVariant& aValue, bool isReadOnly = false, QIcon anIcon = QIcon()); - PdmOptionItemInfo(const QString& anOptionUiText, caf::PdmObjectHandle* obj, bool isReadOnly = false, QIcon anIcon = QIcon()); + PdmOptionItemInfo(const QString& anOptionUiText, const QVariant& aValue, bool isReadOnly = false, const QIconProvider& anIcon = QIconProvider()); + PdmOptionItemInfo(const QString& anOptionUiText, caf::PdmObjectHandle* obj, bool isReadOnly = false, const QIconProvider& anIcon = QIconProvider()); - static PdmOptionItemInfo createHeader(const QString& anOptionUiText, bool isReadOnly = false, QIcon anIcon = QIcon()); + static PdmOptionItemInfo createHeader(const QString& anOptionUiText, bool isReadOnly = false, const QIconProvider& anIcon = QIconProvider()); void setLevel(int level); @@ -128,11 +135,11 @@ public: std::vector& foundIndexes); private: - QString m_optionUiText; - QVariant m_value; - bool m_isReadOnly; - QIcon m_icon; - int m_level; + QString m_optionUiText; + QVariant m_value; + bool m_isReadOnly; + QIconProvider m_iconProvider; + int m_level; }; class PdmUiEditorHandle; @@ -217,8 +224,10 @@ public: const QString uiName(const QString& uiConfigName = "") const; void setUiName(const QString& uiName, const QString& uiConfigName = ""); - const QIcon uiIcon(const QString& uiConfigName = "") const; - void setUiIcon(const QIcon& uiIcon, const QString& uiConfigName = ""); + const QIcon uiIcon(const QString& uiConfigName = "") const; + const QIconProvider uiIconProvider(const QString& uiConfigName = "") const; + void setUiIcon(const QIconProvider& uiIcon, const QString& uiConfigName = ""); + void setUiIcon(const QString& uiIconResourceName, const QString& uiConfigName = ""); const QColor uiContentTextColor(const QString& uiConfigName = "") const; void setUiContentTextColor(const QColor& uiIcon, const QString& uiConfigName = ""); diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp index 63c76662c9..f1f052624d 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp @@ -179,7 +179,7 @@ PdmUiTreeOrdering::PdmUiTreeOrdering(const QString & title, const QString& iconR { m_uiItem = new PdmUiItem(); m_uiItem->setUiName(title); - m_uiItem->setUiIcon(QIcon(iconResourceName)); + m_uiItem->setUiIcon(QIconProvider(iconResourceName)); } //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.cpp new file mode 100644 index 0000000000..bdc4f1c02c --- /dev/null +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.cpp @@ -0,0 +1,137 @@ +#include "cafQIconProvider.h" + +#include "cafAssert.h" + +#include + +using namespace caf; + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIconProvider::QIconProvider() + : m_active(true) +{ +} + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIconProvider::QIconProvider(const QString& iconResourceString) + : m_active(true) + , m_iconResourceString(iconResourceString) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIconProvider::QIconProvider(const QPixmap& pixmap) + : m_iconPixmap(pixmap) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIconProvider::QIconProvider(const QIconProvider& rhs) + : m_icon(rhs.m_icon) + , m_active(rhs.m_active) + , m_iconResourceString(rhs.m_iconResourceString) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIconProvider& QIconProvider::operator=(const QIconProvider& rhs) +{ + m_icon = rhs.m_icon; + m_active = rhs.m_active; + m_iconResourceString = rhs.m_iconResourceString; + return *this; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QIcon QIconProvider::icon() const +{ + if (m_icon.isNull()) + { + m_icon = generateIcon(); + } + + if (!m_active) + { + QPixmap disabledPixmap = m_icon.pixmap(16, 16, QIcon::Disabled); + return QIcon(disabledPixmap); + } + + return m_icon; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool QIconProvider::isNull() const +{ + if (!isGuiApplication()) return true; + + if (m_iconPixmap.isNull() && m_iconResourceString.isEmpty()) return true; + + return icon().isNull(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void QIconProvider::setActive(bool active) +{ + m_active = active; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void QIconProvider::setIconResourceString(const QString& iconResourceString) +{ + m_iconResourceString = iconResourceString; + m_icon = QIcon(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void QIconProvider::setPixmap(const QPixmap& pixmap) +{ + m_iconPixmap = pixmap; + m_icon = QIcon(); +} + +//-------------------------------------------------------------------------------------------------- +/// Generate the actual icon. Will generate a NULL-icon if a QtGuiApplication isn't running. +/// Override in a sub-class if you want to generate a custom icon procedurally +//-------------------------------------------------------------------------------------------------- +QIcon QIconProvider::generateIcon() const +{ + if (isGuiApplication()) + { + if (!m_iconPixmap.isNull()) + { + return QIcon(m_iconPixmap); + } + return QIcon(m_iconResourceString); + } + return QIcon(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool QIconProvider::isGuiApplication() +{ + return dynamic_cast(QCoreApplication::instance()) != nullptr; +} diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.h new file mode 100644 index 0000000000..c3ce820996 --- /dev/null +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafQIconProvider.h @@ -0,0 +1,73 @@ +//################################################################################################## +// +// Custom Visualization Core library +// Copyright (C) 2019- Ceetron Solutions AS +// +// This library may be used under the terms of either the GNU General Public License or +// the GNU Lesser General Public License as follows: +// +// GNU General Public License Usage +// This library 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. +// +// This library 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 <> +// for more details. +// +// GNU Lesser General Public License Usage +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library 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 Lesser General Public License at <> +// for more details. +// +//################################################################################################## +#pragma once + +#include +#include +#include + +namespace caf +{ +//================================================================================================== +/// Utility class to provide QIcons when required. Qt crashes if a non-empty QIcon is created +/// ... without a GUI Application running. So create the icon on demand instead. +//================================================================================================== +class QIconProvider +{ +public: + QIconProvider(); + QIconProvider(const QString& iconResourceString); + QIconProvider(const QPixmap& pixmap); + QIconProvider(const QIconProvider& rhs); + QIconProvider& operator=(const QIconProvider& rhs); + + QIcon icon() const; + virtual bool isNull() const; + void setActive(bool active); + void setIconResourceString(const QString& iconResourceString); + void setPixmap(const QPixmap& pixmap); + +protected: + virtual QIcon generateIcon() const; + static bool isGuiApplication(); + +protected: + QString m_iconResourceString; + QPixmap m_iconPixmap; + mutable QIcon m_icon; + bool m_active; +}; +} diff --git a/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp b/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp index c232719a52..d730a475e2 100644 --- a/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp @@ -40,6 +40,7 @@ #include "cafMemoryInspector.h" #include "cafProgressState.h" +#include #include #include #include @@ -115,7 +116,7 @@ namespace caf { { ProgressInfoStatic::start(maxProgressValue, title, delayShowingProgress); - if (qApp) + if (dynamic_cast(QCoreApplication::instance())) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); } @@ -128,7 +129,7 @@ namespace caf { { ProgressInfoStatic::finished(); - if (qApp) + if (dynamic_cast(QCoreApplication::instance())) { QApplication::restoreOverrideCursor(); } @@ -228,7 +229,7 @@ namespace caf { static QProgressDialog* progressDialog() { static QPointer progDialog; - if (progDialog.isNull()) + if (progDialog.isNull() && dynamic_cast(QCoreApplication::instance())) { progDialog = new QProgressDialog(nullptr, Qt::WindowTitleHint | Qt::WindowSystemMenuHint); @@ -467,19 +468,24 @@ namespace caf { std::vector& progressSpanStack_v = progressSpanStack(); std::vector& maxProgressStack_v = maxProgressStack(); + QProgressDialog* dialog = progressDialog(); + if (!maxProgressStack_v.size()) { //progressDialog()->setWindowModality(Qt::ApplicationModal); - progressDialog()->setMinimum(0); - progressDialog()->setWindowTitle(title); - progressDialog()->setCancelButton(nullptr); - if (delayShowingProgress) + if (dialog) { - progressDialog()->setMinimumDuration(1000); - } - else - { - progressDialog()->show(); + dialog->setMinimum(0); + dialog->setWindowTitle(title); + dialog->setCancelButton(nullptr); + if (delayShowingProgress) + { + dialog->setMinimumDuration(1000); + } + else + { + dialog->show(); + } } } @@ -489,10 +495,12 @@ namespace caf { titleStack().push_back(title); descriptionStack().push_back(""); - progressDialog()->setMaximum(static_cast(currentTotalMaxProgressValue())); - progressDialog()->setValue(static_cast(currentTotalProgress())); - progressDialog()->setLabelText(currentComposedLabel()); - + if (dialog) + { + dialog->setMaximum(static_cast(currentTotalMaxProgressValue())); + dialog->setValue(static_cast(currentTotalProgress())); + dialog->setLabelText(currentComposedLabel()); + } QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); //if (progressDialog()) progressDialog()->repaint(); } @@ -506,7 +514,11 @@ namespace caf { descriptionStack().back() = description; - progressDialog()->setLabelText(currentComposedLabel()); + QProgressDialog* dialog = progressDialog(); + if (dialog) + { + dialog->setLabelText(currentComposedLabel()); + } QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); //if (progressDialog()) progressDialog()->repaint(); @@ -546,8 +558,12 @@ namespace caf { totalProgress = totalMaxProgress; } - progressDialog()->setMaximum(totalMaxProgress); - progressDialog()->setValue(totalProgress); + QProgressDialog* dialog = progressDialog(); + if (dialog) + { + dialog->setMaximum(totalMaxProgress); + dialog->setValue(totalProgress); + } QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); //if (progressDialog()) progressDialog()->repaint(); @@ -623,15 +639,19 @@ namespace caf { descriptionStack().pop_back(); // Update the text to reflect the "previous level" - progressDialog()->setLabelText(currentComposedLabel()); + QProgressDialog* dialog = progressDialog(); + if (dialog) + { + dialog->setLabelText(currentComposedLabel()); + } // If we are finishing the last level, clean up if (maxProgressStack_v.empty()) { - if (progressDialog() != nullptr) + if (dialog) { - progressDialog()->reset(); - progressDialog()->close(); + dialog->reset(); + dialog->close(); } } else @@ -649,11 +669,15 @@ namespace caf { { if (s_disabled) return false; - if (!qApp) return false; - - if (!progressDialog()) return false; - - return progressDialog()->thread() == QThread::currentThread(); + if (dynamic_cast(QCoreApplication::instance())) + { + QProgressDialog* dialog = progressDialog(); + if (dialog) + { + return dialog->thread() == QThread::currentThread(); + } + } + return false; } } // namespace caf diff --git a/Fwk/AppFwk/cafVizExtensions/cafFixedAtlasFont.h b/Fwk/AppFwk/cafVizExtensions/cafFixedAtlasFont.h index 2fbae0cabd..7cc7595a28 100644 --- a/Fwk/AppFwk/cafVizExtensions/cafFixedAtlasFont.h +++ b/Fwk/AppFwk/cafVizExtensions/cafFixedAtlasFont.h @@ -37,6 +37,7 @@ #pragma once +#include "cvfBase.h" #include "cvfObject.h" #include "cvfFont.h" #include "cvfGlyph.h"