From f748b68e0ccf164406e7af6227757b545251d621 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 6 Aug 2015 11:00:21 +0200 Subject: [PATCH] Prototyped commands for new treeview --- ApplicationCode/CMakeLists.txt | 1 + .../Commands/CMakeLists_files.cmake | 23 ++++ .../Commands/RicRangeFilterNew.cpp | 124 ++++++++++++++++++ ApplicationCode/Commands/RicRangeFilterNew.h | 38 ++++++ .../Commands/RicRangeFilterNewSliceI.cpp | 118 +++++++++++++++++ .../Commands/RicRangeFilterNewSliceI.h | 38 ++++++ .../ProjectDataModel/RimProject.cpp | 47 +++++++ ApplicationCode/ProjectDataModel/RimProject.h | 7 + .../UserInterface/RiuMainWindow.cpp | 34 ++++- ApplicationCode/UserInterface/RiuMainWindow.h | 1 + 10 files changed, 427 insertions(+), 4 deletions(-) create mode 100644 ApplicationCode/Commands/CMakeLists_files.cmake create mode 100644 ApplicationCode/Commands/RicRangeFilterNew.cpp create mode 100644 ApplicationCode/Commands/RicRangeFilterNew.h create mode 100644 ApplicationCode/Commands/RicRangeFilterNewSliceI.cpp create mode 100644 ApplicationCode/Commands/RicRangeFilterNewSliceI.h diff --git a/ApplicationCode/CMakeLists.txt b/ApplicationCode/CMakeLists.txt index d3c6fbb06f..f85b5bed76 100644 --- a/ApplicationCode/CMakeLists.txt +++ b/ApplicationCode/CMakeLists.txt @@ -102,6 +102,7 @@ list( APPEND REFERENCED_CMAKE_FILES ProjectDataModel/CMakeLists_files.cmake ModelVisualization/CMakeLists_files.cmake GeoMech/GeoMechVisualization/CMakeLists_files.cmake + Commands/CMakeLists_files.cmake ) # Include source file lists from *.cmake files diff --git a/ApplicationCode/Commands/CMakeLists_files.cmake b/ApplicationCode/Commands/CMakeLists_files.cmake new file mode 100644 index 0000000000..782ee2977b --- /dev/null +++ b/ApplicationCode/Commands/CMakeLists_files.cmake @@ -0,0 +1,23 @@ + +# Use this workaround until we're on 2.8.3 on all platforms and can use CMAKE_CURRENT_LIST_DIR directly +if (${CMAKE_VERSION} VERSION_GREATER "2.8.2") + set(CEE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_DIR}/) +endif() + +set (SOURCE_GROUP_HEADER_FILES +${CEE_CURRENT_LIST_DIR}RicRangeFilterNew.h +) + +set (SOURCE_GROUP_SOURCE_FILES +${CEE_CURRENT_LIST_DIR}RicRangeFilterNew.cpp +) + +list(APPEND CODE_HEADER_FILES +${SOURCE_GROUP_HEADER_FILES} +) + +list(APPEND CODE_SOURCE_FILES +${SOURCE_GROUP_SOURCE_FILES} +) + +source_group( "CommandFeature" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CEE_CURRENT_LIST_DIR}CMakeLists_files.cmake ) diff --git a/ApplicationCode/Commands/RicRangeFilterNew.cpp b/ApplicationCode/Commands/RicRangeFilterNew.cpp new file mode 100644 index 0000000000..6746c42eba --- /dev/null +++ b/ApplicationCode/Commands/RicRangeFilterNew.cpp @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2014 Ceetron Solutions AS, USFOS AS, AMOS - NTNU +// +// RPM 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. +// +// RPM 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 "RicRangeFilterNew.h" + +#include "RimCellRangeFilter.h" +#include "RimCellRangeFilterCollection.h" +#include "RimEclipseView.h" + +#include "cafSelectionManager.h" + +#include + +CAF_CMD_SOURCE_INIT(RicRangeFilterNew, "RicRangeFilterNew"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicRangeFilterNew::isCommandEnabled() +{ + std::vector selectedRangeFilter; + caf::SelectionManager::instance()->objectsByType(&selectedRangeFilter); + + std::vector selectedRangeFilterCollection; + caf::SelectionManager::instance()->objectsByType(&selectedRangeFilterCollection); + + if (selectedRangeFilter.size() > 0 || selectedRangeFilterCollection.size() > 0) + { + return true; + } + else + { + return false; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRangeFilterNew::onActionTriggered(bool isChecked) +{ + std::vector selectedRangeFilterCollection; + caf::SelectionManager::instance()->objectsByType(&selectedRangeFilterCollection); + + if (selectedRangeFilterCollection.size() == 1) + { +// selectedRangeFilterCollection[0]->rangeFilters.push_back(new RimCellRangeFilter); +// selectedRangeFilterCollection[0]->reservoirView()->createDisplayModelAndRedraw(); + } + + + +/* + EvmProject* proj = EvaApplication::instance()->project(); + + std::vector selectedNodes; + caf::SelectionManager::instance()->objectsByType(&selectedNodes, caf::SelectionManager::CURRENT); + + caf::CmdAddItemFeature* addItemFeature = dynamic_cast(caf::CmdFeatureManager::instance()->getCommandFeature(caf::CmdAddItemFeature::idNameStatic())); + assert(addItemFeature); + + if (selectedNodes.size() > 0) + { + caf::SelectionManager::instance()->setActiveChildArrayFieldHandle(&proj->boundaryConditions); + + std::vector commands; + for (size_t i = 0; i < selectedNodes.size(); i++) + { + // Not allowed to add more than one BC + if (proj->findBoundaryConditionForNode(selectedNodes[i]->id)) continue; + + std::vector newSelection; + newSelection.push_back(selectedNodes[i]); + caf::CmdSelectionChangeExec* selectionChangeExec = caf::CmdSelectionHelper::createSelectionCommand(newSelection, caf::SelectionManager::CURRENT); + commands.push_back(selectionChangeExec); + + int indexAfter = -1; + caf::CmdAddItemExec* addItemExec = new caf::CmdAddItemExec(caf::SelectionManager::instance()->notificationCenter()); + + caf::CmdAddItemExecData* data = addItemExec->commandData(); + data->m_rootObject = caf::PdmReferenceHelper::findRoot(&proj->nodalLoads); + data->m_pathToField = caf::PdmReferenceHelper::referenceFromRootToField(data->m_rootObject, &proj->boundaryConditions); + data->m_indexAfter = indexAfter; + + commands.push_back(addItemExec); + } + + if (commands.size() > 0) + { + // Add an empty selection when boundary conditions has been assigned + std::vector newSelection; + caf::CmdSelectionChangeExec* selectionChangeExec = caf::CmdSelectionHelper::createSelectionCommand(newSelection, caf::SelectionManager::CURRENT); + commands.push_back(selectionChangeExec); + } + + caf::CmdExecCommandManager::instance()->processExecuteCommandsAsMacro("New Boundary Conditions", commands); + } +*/ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRangeFilterNew::setupActionLook(QAction* actionToSetup) +{ +// actionToSetup->setIcon(QIcon(":/Constraint16x16.png")); + actionToSetup->setText("New Range Filter"); +} + diff --git a/ApplicationCode/Commands/RicRangeFilterNew.h b/ApplicationCode/Commands/RicRangeFilterNew.h new file mode 100644 index 0000000000..7cfa040709 --- /dev/null +++ b/ApplicationCode/Commands/RicRangeFilterNew.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2014 Ceetron Solutions AS, USFOS AS, AMOS - NTNU +// +// RPM 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. +// +// RPM 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 "cafCmdFeature.h" + + +//================================================================================================== +/// +//================================================================================================== +class RicRangeFilterNew : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + // Overrides + virtual bool isCommandEnabled(); + virtual void onActionTriggered( bool isChecked ); + virtual void setupActionLook( QAction* actionToSetup ); +}; + + diff --git a/ApplicationCode/Commands/RicRangeFilterNewSliceI.cpp b/ApplicationCode/Commands/RicRangeFilterNewSliceI.cpp new file mode 100644 index 0000000000..c3358e42eb --- /dev/null +++ b/ApplicationCode/Commands/RicRangeFilterNewSliceI.cpp @@ -0,0 +1,118 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2014 Ceetron Solutions AS, USFOS AS, AMOS - NTNU +// +// RPM 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. +// +// RPM 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 "EvcNewBoundaryConditionSelectedItemsFeature.h" + +#include "EvaApplication.h" + +#include "EvmNode.h" +#include "EvmProject.h" + +#include "cafCmdExecCommandManager.h" +#include "cafCmdSelectionChangeExec.h" +#include "cafCmdFeatureManager.h" +#include "cafCmdSelectionHelper.h" +#include "cafSelectionManager.h" + +#include "defaultfeatures/cafCmdAddItemFeature.h" +#include "defaultfeatures/cafCmdAddItemExec.h" +#include "defaultfeatures/cafCmdAddItemExecData.h" + +#include + +#include + +CAF_CMD_SOURCE_INIT(EvcNewBoundaryConditionSelectedItemsFeature, "EvcNewBoundaryConditionSelectedItemsFeature"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool EvcNewBoundaryConditionSelectedItemsFeature::isCommandEnabled() +{ + std::vector selectedNodes; + caf::SelectionManager::instance()->objectsByType(&selectedNodes, caf::SelectionManager::CURRENT); + + if (selectedNodes.size() > 0) + { + return true; + } + else + { + return false; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void EvcNewBoundaryConditionSelectedItemsFeature::onActionTriggered(bool isChecked) +{ + EvmProject* proj = EvaApplication::instance()->project(); + + std::vector selectedNodes; + caf::SelectionManager::instance()->objectsByType(&selectedNodes, caf::SelectionManager::CURRENT); + + caf::CmdAddItemFeature* addItemFeature = dynamic_cast(caf::CmdFeatureManager::instance()->getCommandFeature(caf::CmdAddItemFeature::idNameStatic())); + assert(addItemFeature); + + if (selectedNodes.size() > 0) + { + caf::SelectionManager::instance()->setActiveChildArrayFieldHandle(&proj->boundaryConditions); + + std::vector commands; + for (size_t i = 0; i < selectedNodes.size(); i++) + { + // Not allowed to add more than one BC + if (proj->findBoundaryConditionForNode(selectedNodes[i]->id)) continue; + + std::vector newSelection; + newSelection.push_back(selectedNodes[i]); + caf::CmdSelectionChangeExec* selectionChangeExec = caf::CmdSelectionHelper::createSelectionCommand(newSelection, caf::SelectionManager::CURRENT); + commands.push_back(selectionChangeExec); + + int indexAfter = -1; + caf::CmdAddItemExec* addItemExec = new caf::CmdAddItemExec(caf::SelectionManager::instance()->notificationCenter()); + + caf::CmdAddItemExecData* data = addItemExec->commandData(); + data->m_rootObject = caf::PdmReferenceHelper::findRoot(&proj->nodalLoads); + data->m_pathToField = caf::PdmReferenceHelper::referenceFromRootToField(data->m_rootObject, &proj->boundaryConditions); + data->m_indexAfter = indexAfter; + + commands.push_back(addItemExec); + } + + if (commands.size() > 0) + { + // Add an empty selection when boundary conditions has been assigned + std::vector newSelection; + caf::CmdSelectionChangeExec* selectionChangeExec = caf::CmdSelectionHelper::createSelectionCommand(newSelection, caf::SelectionManager::CURRENT); + commands.push_back(selectionChangeExec); + } + + caf::CmdExecCommandManager::instance()->processExecuteCommandsAsMacro("New Boundary Conditions", commands); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void EvcNewBoundaryConditionSelectedItemsFeature::setupActionLook(QAction* actionToSetup) +{ + actionToSetup->setIcon(QIcon(":/Constraint16x16.png")); +} + diff --git a/ApplicationCode/Commands/RicRangeFilterNewSliceI.h b/ApplicationCode/Commands/RicRangeFilterNewSliceI.h new file mode 100644 index 0000000000..63836740ab --- /dev/null +++ b/ApplicationCode/Commands/RicRangeFilterNewSliceI.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2014 Ceetron Solutions AS, USFOS AS, AMOS - NTNU +// +// RPM 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. +// +// RPM 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 "cafCmdFeature.h" + + +//================================================================================================== +/// +//================================================================================================== +class EvcNewBoundaryConditionSelectedItemsFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + // Overrides + virtual bool isCommandEnabled(); + virtual void onActionTriggered( bool isChecked ); + virtual void setupActionLook( QAction* actionToSetup ); +}; + + diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 6c1008f68a..f9888ee49e 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -503,3 +503,50 @@ void RimProject::computeUtmAreaOfInterest() } } + + + + + + +#include "cafCmdFeatureManager.h" +#include "cafSelectionManager.h" + +#include "RimCellRangeFilterCollection.h" +#include "RimCellRangeFilter.h" + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimProject::actionsBasedOnSelection(std::vector& actions) +{ + caf::CmdFeatureManager* commandManager = caf::CmdFeatureManager::instance(); + + std::vector uiItems; + caf::SelectionManager::instance()->selectedItems(uiItems); + + if (uiItems.size() == 1) + { + if (dynamic_cast(uiItems[0])) + { + actions.push_back(commandManager->action("RicRangeFilterNew")); + } + if (dynamic_cast(uiItems[0])) + { + actions.push_back(commandManager->action("RicRangeFilterNew")); + } + } + + +/* + for (size_t i = 0; i < uiItems.size(); i++) + { + if (dynamic_cast(uiItems[i])) + { + actions.push_back(commandManager->action("NewRangeFilter")); + } + } +*/ +} + diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index 6a9a3e8979..5e371343a4 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -24,6 +24,8 @@ #include "cafPdmChildField.h" #include "cafPdmDocument.h" +#include + class RigCaseData; class RigGridManager; class RigMainGrid; @@ -35,6 +37,9 @@ class RimOilField; class RimScriptCollection; class RimWellPathImport; + +class QAction; + //================================================================================================== /// /// @@ -70,6 +75,8 @@ public: RimOilField* activeOilField(); + void actionsBasedOnSelection(std::vector& actions); + protected: // Overridden methods void initScriptDirectories(); diff --git a/ApplicationCode/UserInterface/RiuMainWindow.cpp b/ApplicationCode/UserInterface/RiuMainWindow.cpp index a11aa4d88e..4ea897a15e 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainWindow.cpp @@ -69,6 +69,7 @@ #include "RimGeoMechModels.h" #include "RimGeoMechView.h" #include "RigFemPartResultsCollection.h" +#include "cafSelectionManager.h" //================================================================================================== @@ -558,6 +559,9 @@ void RiuMainWindow::createDockPanels() connect(m_projectTreeView->treeView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedObjectsChanged(const QItemSelection&, const QItemSelection &))); + m_projectTreeView->treeView()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_projectTreeView->treeView(), SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(customMenuRequested(const QPoint&))); + // MODTODO //m_windowsMenu->addAction(dockWidget->toggleViewAction()); @@ -2190,11 +2194,33 @@ void RiuMainWindow::forceProjectTreeRepaint() m_OBSOLETE_treeView->scroll(0,-1); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- void RiuMainWindow::selectedObjectsChanged(const QItemSelection& selected, const QItemSelection & deselected) { + std::vector uiItems; + m_projectTreeView->selectedObjects(uiItems); - // MODTODO - - // Wire up update of property editor - + caf::SelectionManager::instance()->setSelectedItems(uiItems); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainWindow::customMenuRequested(const QPoint& pos) +{ + QMenu menu; + + std::vector actions; + + RiaApplication* app = RiaApplication::instance(); + app->project()->actionsBasedOnSelection(actions); + + for (size_t i = 0; i < actions.size(); i++) + { + menu.addAction(actions[i]); + } + + menu.exec(pos); } diff --git a/ApplicationCode/UserInterface/RiuMainWindow.h b/ApplicationCode/UserInterface/RiuMainWindow.h index 15562450e0..81471504d4 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.h +++ b/ApplicationCode/UserInterface/RiuMainWindow.h @@ -279,6 +279,7 @@ private slots: void OBSOLETE_slotCurrentChanged(const QModelIndex & current, const QModelIndex & previous); void selectedObjectsChanged(const QItemSelection& selected, const QItemSelection & deselected); + void customMenuRequested(const QPoint& pos); // Animation slots