diff --git a/ApplicationCode/CMakeLists.txt b/ApplicationCode/CMakeLists.txt index f855410af4..b7e4ace89a 100644 --- a/ApplicationCode/CMakeLists.txt +++ b/ApplicationCode/CMakeLists.txt @@ -77,6 +77,8 @@ set( USER_INTERFACE_FILES UserInterface/RiuGeoQuestNavigation.cpp UserInterface/RiuDragDrop.cpp UserInterface/RiuDragDrop.h + UserInterface/RiuTreeViewEventFilter.cpp + UserInterface/RiuTreeViewEventFilter.h ) set( SOCKET_INTERFACE_FILES @@ -158,6 +160,7 @@ set ( QT_MOC_HEADERS SocketInterface/RiaSocketServer.h UserInterface/RiuMultiCaseImportDialog.h UserInterface/RiuViewerCommands.h + UserInterface/RiuTreeViewEventFilter.h ) qt4_wrap_cpp( MOC_FILES_CPP ${QT_MOC_HEADERS} ) diff --git a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeature.cpp b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeature.cpp index 3be078bedd..75e5e7be2f 100644 --- a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeature.cpp +++ b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeature.cpp @@ -43,7 +43,7 @@ bool RicToggleItemsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicToggleItemsFeature::onActionTriggered(bool isChecked) { - RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(RicToggleItemsFeatureImpl::TOGGLE); + RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(RicToggleItemsFeatureImpl::TOGGLE_SUBITEMS); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp index 5e4aeecbd6..93e4e99635 100644 --- a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp +++ b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.cpp @@ -89,7 +89,7 @@ void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(SelectionToggle { std::vector selectedItems; caf::SelectionManager::instance()->selectedItems(selectedItems); - if (selectedItems.size() == 1) + if (state != TOGGLE && selectedItems.size() == 1) { // If only one item is selected, loop over its children, and toggle them instead of the // selected item directly @@ -118,7 +118,7 @@ void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(SelectionToggle { if (state == TOGGLE_ON) uiFieldHandle->setValueFromUi(true); if (state == TOGGLE_OFF) uiFieldHandle->setValueFromUi(false); - if (state == TOGGLE) uiFieldHandle->setValueFromUi(!(field->v())); + if (state == TOGGLE_SUBITEMS) uiFieldHandle->setValueFromUi(!(field->v())); } } } @@ -138,7 +138,10 @@ void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(SelectionToggle { if (state == TOGGLE_ON) uiFieldHandle->setValueFromUi(true); if (state == TOGGLE_OFF) uiFieldHandle->setValueFromUi(false); - if (state == TOGGLE) uiFieldHandle->setValueFromUi(!(field->v())); + if (state == TOGGLE_SUBITEMS || state == TOGGLE) + { + uiFieldHandle->setValueFromUi(!(field->v())); + } } } } diff --git a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.h b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.h index 74eaab3050..ed9688d64a 100644 --- a/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.h +++ b/ApplicationCode/Commands/ToggleCommands/RicToggleItemsFeatureImpl.h @@ -29,6 +29,7 @@ public: { TOGGLE_ON, TOGGLE_OFF, + TOGGLE_SUBITEMS, TOGGLE, TOGGLE_UNDEFINED }; diff --git a/ApplicationCode/UserInterface/RiuMainWindow.cpp b/ApplicationCode/UserInterface/RiuMainWindow.cpp index e416221f0f..2a184145ee 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainWindow.cpp @@ -76,6 +76,7 @@ #include "cvfTimer.h" #include "RimTreeViewStateSerializer.h" +#include "RiuTreeViewEventFilter.h" //================================================================================================== @@ -570,12 +571,16 @@ void RiuMainWindow::createDockPanels() m_projectTreeView->treeView()->setHeaderHidden(true); m_projectTreeView->treeView()->setSelectionMode(QAbstractItemView::ExtendedSelection); - // TODO :Drag and drop configuration + // Drag and drop configuration m_projectTreeView->treeView()->setDragEnabled(true); m_projectTreeView->treeView()->viewport()->setAcceptDrops(true); m_projectTreeView->treeView()->setDropIndicatorShown(true); m_projectTreeView->treeView()->setDragDropMode(QAbstractItemView::DragDrop); + // Install event filter used to handle key press events + RiuTreeViewEventFilter* treeViewEventFilter = new RiuTreeViewEventFilter(this); + m_projectTreeView->treeView()->installEventFilter(treeViewEventFilter); + addDockWidget(Qt::RightDockWidgetArea, dockWidget); connect(m_projectTreeView, SIGNAL(selectionChanged()), this, SLOT(selectedObjectsChanged())); diff --git a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp new file mode 100644 index 0000000000..b52e82ab45 --- /dev/null +++ b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp @@ -0,0 +1,114 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015- Statoil ASA +// Copyright (C) 2015- Ceetron Solutions 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 "RiuTreeViewEventFilter.h" + +#include "ToggleCommands\RicToggleItemsFeatureImpl.h" + +#include "RimCaseCollection.h" +#include "RimEclipseCase.h" +#include "RimIdenticalGridCaseGroup.h" +#include "RiuMainWindow.h" + +#include "cafCmdFeatureManager.h" +#include "cafPdmUiTreeView.h" + +#include +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuTreeViewEventFilter::RiuTreeViewEventFilter(QObject* parent) + : QObject(parent) +{ +} + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiuTreeViewEventFilter::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyPress) + { + QKeyEvent* keyEvent = static_cast(event); + + QString featureToActivate; + + caf::PdmUiTreeView* uiTreeView = RiuMainWindow::instance()->projectTreeView(); + QModelIndex modIndex = RiuMainWindow::instance()->projectTreeView()->treeView()->currentIndex(); + caf::PdmUiItem* uiItem = uiTreeView->uiItemFromModelIndex(modIndex); + if (uiItem) + { + if (dynamic_cast(uiItem) + || dynamic_cast(uiItem)) + { + if (keyEvent->matches(QKeySequence::Copy)) + { + featureToActivate = "RicCopyReferencesToClipboardFeature"; + } + } + + if (keyEvent->matches(QKeySequence::Paste)) + { + if (dynamic_cast(uiItem) + || dynamic_cast(uiItem)) + { + featureToActivate = "RicPasteEclipseCasesFeature"; + } + else if (dynamic_cast(uiItem) + || dynamic_cast(uiItem)) + { + featureToActivate = "RicPasteEclipseViewsFeature"; + } + } + } + + if (!featureToActivate.isEmpty()) + { + QAction* actionToTrigger = caf::CmdFeatureManager::instance()->action(featureToActivate); + assert(actionToTrigger); + + actionToTrigger->trigger(); + + keyEvent->setAccepted(true); + return true; + } + + switch (keyEvent->key()) + { + case Qt::Key_Space: + case Qt::Key_Enter: + case Qt::Key_Return: + case Qt::Key_Select: + { + RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(RicToggleItemsFeatureImpl::TOGGLE); + + keyEvent->setAccepted(true); + return true; + } + } + } + + // standard event processing + return QObject::eventFilter(obj, event); +} + diff --git a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h new file mode 100644 index 0000000000..fd065b8018 --- /dev/null +++ b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015- Statoil ASA +// Copyright (C) 2015- Ceetron Solutions 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 + + +#include + +class QEvent; + +//-------------------------------------------------------------------------------------------------- +class RiuTreeViewEventFilter : public QObject +{ + Q_OBJECT +public: + RiuTreeViewEventFilter(QObject* parent); + +protected: + bool eventFilter(QObject *obj, QEvent *event); +}; \ No newline at end of file