(#381) Handle key press events in new tree view

This commit is contained in:
Jacob Støren 2015-08-20 11:16:19 +02:00
parent 04368bd8a3
commit c75d09e3df
7 changed files with 167 additions and 5 deletions

View File

@ -77,6 +77,8 @@ set( USER_INTERFACE_FILES
UserInterface/RiuGeoQuestNavigation.cpp UserInterface/RiuGeoQuestNavigation.cpp
UserInterface/RiuDragDrop.cpp UserInterface/RiuDragDrop.cpp
UserInterface/RiuDragDrop.h UserInterface/RiuDragDrop.h
UserInterface/RiuTreeViewEventFilter.cpp
UserInterface/RiuTreeViewEventFilter.h
) )
set( SOCKET_INTERFACE_FILES set( SOCKET_INTERFACE_FILES
@ -158,6 +160,7 @@ set ( QT_MOC_HEADERS
SocketInterface/RiaSocketServer.h SocketInterface/RiaSocketServer.h
UserInterface/RiuMultiCaseImportDialog.h UserInterface/RiuMultiCaseImportDialog.h
UserInterface/RiuViewerCommands.h UserInterface/RiuViewerCommands.h
UserInterface/RiuTreeViewEventFilter.h
) )
qt4_wrap_cpp( MOC_FILES_CPP ${QT_MOC_HEADERS} ) qt4_wrap_cpp( MOC_FILES_CPP ${QT_MOC_HEADERS} )

View File

@ -43,7 +43,7 @@ bool RicToggleItemsFeature::isCommandEnabled()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicToggleItemsFeature::onActionTriggered(bool isChecked) void RicToggleItemsFeature::onActionTriggered(bool isChecked)
{ {
RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(RicToggleItemsFeatureImpl::TOGGLE); RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(RicToggleItemsFeatureImpl::TOGGLE_SUBITEMS);
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -89,7 +89,7 @@ void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(SelectionToggle
{ {
std::vector<caf::PdmUiItem*> selectedItems; std::vector<caf::PdmUiItem*> selectedItems;
caf::SelectionManager::instance()->selectedItems(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 // If only one item is selected, loop over its children, and toggle them instead of the
// selected item directly // selected item directly
@ -118,7 +118,7 @@ void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection(SelectionToggle
{ {
if (state == TOGGLE_ON) uiFieldHandle->setValueFromUi(true); if (state == TOGGLE_ON) uiFieldHandle->setValueFromUi(true);
if (state == TOGGLE_OFF) uiFieldHandle->setValueFromUi(false); 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_ON) uiFieldHandle->setValueFromUi(true);
if (state == TOGGLE_OFF) uiFieldHandle->setValueFromUi(false); if (state == TOGGLE_OFF) uiFieldHandle->setValueFromUi(false);
if (state == TOGGLE) uiFieldHandle->setValueFromUi(!(field->v())); if (state == TOGGLE_SUBITEMS || state == TOGGLE)
{
uiFieldHandle->setValueFromUi(!(field->v()));
}
} }
} }
} }

View File

@ -29,6 +29,7 @@ public:
{ {
TOGGLE_ON, TOGGLE_ON,
TOGGLE_OFF, TOGGLE_OFF,
TOGGLE_SUBITEMS,
TOGGLE, TOGGLE,
TOGGLE_UNDEFINED TOGGLE_UNDEFINED
}; };

View File

@ -76,6 +76,7 @@
#include "cvfTimer.h" #include "cvfTimer.h"
#include "RimTreeViewStateSerializer.h" #include "RimTreeViewStateSerializer.h"
#include "RiuTreeViewEventFilter.h"
//================================================================================================== //==================================================================================================
@ -570,12 +571,16 @@ void RiuMainWindow::createDockPanels()
m_projectTreeView->treeView()->setHeaderHidden(true); m_projectTreeView->treeView()->setHeaderHidden(true);
m_projectTreeView->treeView()->setSelectionMode(QAbstractItemView::ExtendedSelection); m_projectTreeView->treeView()->setSelectionMode(QAbstractItemView::ExtendedSelection);
// TODO :Drag and drop configuration // Drag and drop configuration
m_projectTreeView->treeView()->setDragEnabled(true); m_projectTreeView->treeView()->setDragEnabled(true);
m_projectTreeView->treeView()->viewport()->setAcceptDrops(true); m_projectTreeView->treeView()->viewport()->setAcceptDrops(true);
m_projectTreeView->treeView()->setDropIndicatorShown(true); m_projectTreeView->treeView()->setDropIndicatorShown(true);
m_projectTreeView->treeView()->setDragDropMode(QAbstractItemView::DragDrop); 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); addDockWidget(Qt::RightDockWidgetArea, dockWidget);
connect(m_projectTreeView, SIGNAL(selectionChanged()), this, SLOT(selectedObjectsChanged())); connect(m_projectTreeView, SIGNAL(selectionChanged()), this, SLOT(selectedObjectsChanged()));

View File

@ -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 <http://www.gnu.org/licenses/gpl.html>
// 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 <QAction>
#include <QKeyEvent>
#include <QTreeView>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiuTreeViewEventFilter::RiuTreeViewEventFilter(QObject* parent)
: QObject(parent)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiuTreeViewEventFilter::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = static_cast<QKeyEvent *>(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<RimEclipseCase*>(uiItem)
|| dynamic_cast<RimEclipseView*>(uiItem))
{
if (keyEvent->matches(QKeySequence::Copy))
{
featureToActivate = "RicCopyReferencesToClipboardFeature";
}
}
if (keyEvent->matches(QKeySequence::Paste))
{
if (dynamic_cast<RimIdenticalGridCaseGroup*>(uiItem)
|| dynamic_cast<RimCaseCollection*>(uiItem))
{
featureToActivate = "RicPasteEclipseCasesFeature";
}
else if (dynamic_cast<RimEclipseCase*>(uiItem)
|| dynamic_cast<RimEclipseView*>(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);
}

View File

@ -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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include <QObject>
class QEvent;
//--------------------------------------------------------------------------------------------------
class RiuTreeViewEventFilter : public QObject
{
Q_OBJECT
public:
RiuTreeViewEventFilter(QObject* parent);
protected:
bool eventFilter(QObject *obj, QEvent *event);
};