From 3a174edf0e13d0e6cae6fcab67af2290eb926478 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 21 Oct 2019 15:44:42 +0200 Subject: [PATCH 1/7] #4901 AppFwk : Add label editor --- Fwk/AppFwk/cafUserInterface/CMakeLists.txt | 3 + .../cafUserInterface/cafPdmUiLabelEditor.cpp | 98 +++++++++++++++++++ .../cafUserInterface/cafPdmUiLabelEditor.h | 77 +++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.cpp create mode 100644 Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.h diff --git a/Fwk/AppFwk/cafUserInterface/CMakeLists.txt b/Fwk/AppFwk/cafUserInterface/CMakeLists.txt index c2cdfe5763..64e6e89f84 100644 --- a/Fwk/AppFwk/cafUserInterface/CMakeLists.txt +++ b/Fwk/AppFwk/cafUserInterface/CMakeLists.txt @@ -45,6 +45,7 @@ set (MOC_HEADER_FILES cafPdmUniqueIdValidator.h cafPdmDoubleStringValidator.h cafPdmUiPickableLineEditor.h + cafPdmUiLabelEditor.h ) if (CEE_USE_QT5) @@ -99,6 +100,8 @@ set( PROJECT_FILES cafPdmUiTreeSelectionQModel.cpp cafPdmUiFieldEditorHelper.h cafPdmUiFieldEditorHelper.cpp + cafPdmUiLabelEditor.cpp + # object editors cafPdmUiDefaultObjectEditor.cpp diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.cpp new file mode 100644 index 0000000000..91e5511991 --- /dev/null +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.cpp @@ -0,0 +1,98 @@ +//################################################################################################## +// +// Custom Visualization Core library +// Copyright (C) 2011-2013 Ceetron 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. +// +//################################################################################################## + + +#include "cafPdmUiLabelEditor.h" + + + +namespace caf +{ + +CAF_PDM_UI_FIELD_EDITOR_SOURCE_INIT(PdmUiLabelEditor); + + + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +PdmUiLabelEditor::PdmUiLabelEditor() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +PdmUiLabelEditor::~PdmUiLabelEditor() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiLabelEditor::configureAndUpdateUi(const QString& uiConfigName) +{ + CAF_ASSERT(!m_label.isNull()); + + PdmUiFieldEditorHandle::updateLabelFromField(m_label, uiConfigName); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QWidget* PdmUiLabelEditor::createEditorWidget(QWidget * parent) +{ + return createLabelWidget(parent); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QWidget* PdmUiLabelEditor::createLabelWidget(QWidget * parent) +{ + if (m_label.isNull()) + { + m_label = new QShortenedLabel(parent); + } + + return m_label; +} + +} // end namespace caf diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.h new file mode 100644 index 0000000000..7863bbbbc6 --- /dev/null +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLabelEditor.h @@ -0,0 +1,77 @@ +//################################################################################################## +// +// Custom Visualization Core library +// Copyright (C) 2011-2013 Ceetron 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 "cafPdmUiFieldEditorHandle.h" +#include "cafQShortenedLabel.h" + +#include +#include +#include +#include + +class QGridLayout; + +namespace caf +{ + + + +//================================================================================================== +/// An editor to show (and possibly edit?) formatted larger portions of text +//================================================================================================== +class PdmUiLabelEditor : public PdmUiFieldEditorHandle +{ + Q_OBJECT + CAF_PDM_UI_FIELD_EDITOR_HEADER_INIT; + +public: + PdmUiLabelEditor(); + ~PdmUiLabelEditor() override; + +protected: + QWidget* createEditorWidget(QWidget * parent) override; + QWidget* createLabelWidget(QWidget * parent) override; + void configureAndUpdateUi(const QString& uiConfigName) override; + +private: + QPointer m_label; +}; + + +} // end namespace caf From 7be2cc303142a1491faba110a92cebc1c7573188 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 21 Oct 2019 16:18:07 +0200 Subject: [PATCH 2/7] #4775 Summary : Add text based curve creation to toolbar --- .../Summary/RimSummaryPlot.cpp | 22 +++++++--- ...RimSummaryPlotFilterTextCurveSetEditor.cpp | 40 ++++++++++++++++++ .../RimSummaryPlotFilterTextCurveSetEditor.h | 8 +++- .../UserInterface/RiuPlotMainWindow.cpp | 11 +++-- .../cafPdmUiToolBarEditor.cpp | 42 +++++++++++++++++++ .../cafUserInterface/cafPdmUiToolBarEditor.h | 4 ++ 6 files changed, 114 insertions(+), 13 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index af677dd272..29b074a9a0 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -2023,17 +2023,27 @@ std::vector RimSummaryPlot::fieldsToShowInToolbar() { std::vector toolBarFields; - auto sourceObject = sourceSteppingObjectForKeyEventHandling(); - - if ( sourceObject ) { - toolBarFields = sourceObject->fieldsToShowInToolbar(); + auto fields = m_textCurveSetEditor->fieldsToShowInToolbar(); + toolBarFields.insert( std::end( toolBarFields ), std::begin( fields ), std::end( fields ) ); } - if ( toolBarFields.empty() ) + bool anyFieldsAvailableForSummary = false; + + auto sourceObject = sourceSteppingObjectForKeyEventHandling(); + if ( sourceObject ) + { + auto fields = sourceObject->fieldsToShowInToolbar(); + toolBarFields.insert( std::end( toolBarFields ), std::begin( fields ), std::end( fields ) ); + + anyFieldsAvailableForSummary = !fields.empty(); + } + + if ( !anyFieldsAvailableForSummary ) { // Show ensemble stepping if no fields are available from summary stepping - toolBarFields = ensembleCurveSetCollection()->fieldsToShowInToolbar(); + auto fields = ensembleCurveSetCollection()->fieldsToShowInToolbar(); + toolBarFields.insert( std::end( toolBarFields ), std::begin( fields ), std::end( fields ) ); } return toolBarFields; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp index 94505ef109..86d6fc18a7 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp @@ -19,12 +19,14 @@ #include "RimSummaryPlotFilterTextCurveSetEditor.h" #include "RiaApplication.h" +#include "RiaGuiApplication.h" #include "RiaLogging.h" #include "RiaSummaryCurveDefinition.h" #include "RifSummaryReaderInterface.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" + #include "RimEclipseCase.h" #include "RimEnsembleCurveSet.h" #include "RimEnsembleCurveSetCollection.h" @@ -41,11 +43,14 @@ #include "RimSummaryCurve.h" #include "RimSummaryCurveCollection.h" #include "RimSummaryPlot.h" + +#include "RiuPlotMainWindow.h" #include "RiuSummaryCurveDefSelection.h" #include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h" #include "WellLogCommands/RicWellLogPlotCurveFeatureImpl.h" +#include "cafPdmUiLabelEditor.h" #include "cafPdmUiTextEditor.h" #include "cafPdmUiTreeSelectionEditor.h" @@ -72,6 +77,11 @@ RimSummaryPlotFilterTextCurveSetEditor::RimSummaryPlotFilterTextCurveSetEditor() " \"BPR:15,28,*\" (no space) Oil phase pressure for all blocks along k as separate curves.\n"; // clang-format on + CAF_PDM_InitFieldNoDefault( &m_curveFilterLabelText, "Summary", "Summary", "", "", "" ); + m_curveFilterLabelText.uiCapability()->setUiEditorTypeName( caf::PdmUiLabelEditor::uiEditorTypeName() ); + m_curveFilterLabelText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); + m_curveFilterLabelText.xmlCapability()->disableIO(); + CAF_PDM_InitFieldNoDefault( &m_curveFilterText, "CurveFilterText", "Curve Filter Text", "", filterTextToolTip, "" ); m_curveFilterText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); // m_curveFilterText.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() ); @@ -87,6 +97,23 @@ RimSummaryPlotFilterTextCurveSetEditor::RimSummaryPlotFilterTextCurveSetEditor() //-------------------------------------------------------------------------------------------------- RimSummaryPlotFilterTextCurveSetEditor::~RimSummaryPlotFilterTextCurveSetEditor() {} +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryPlotFilterTextCurveSetEditor::fieldsToShowInToolbar() +{ + std::vector fields; + fields.push_back( &m_curveFilterLabelText ); + fields.push_back( &m_curveFilterText ); + + return fields; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotFilterTextCurveSetEditor::updateCurveFilterText() {} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -266,9 +293,20 @@ void RimSummaryPlotFilterTextCurveSetEditor::fieldChangedByUi( const caf::PdmFie if ( changedField == &m_curveFilterText ) { m_curveFilterText = curveFilterTextWithoutOutdatedLabel(); + + m_curveFilterText.uiCapability()->updateConnectedEditors(); } m_isFieldRecentlyChangedFromGui = true; + + if ( RiaGuiApplication::isRunning() ) + { + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); + if ( mainPlotWindow ) + { + mainPlotWindow->updateSummaryPlotToolBar(); + } + } } //-------------------------------------------------------------------------------------------------- @@ -342,6 +380,8 @@ void RimSummaryPlotFilterTextCurveSetEditor::defineUiOrdering( QString uiConfigN { m_curveFilterText = curveFilterTextWithoutOutdatedLabel(); } + + m_curveFilterText.uiCapability()->updateConnectedEditors(); } m_isFieldRecentlyChangedFromGui = false; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h index f7e4869593..4a43e8d7a6 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h @@ -31,6 +31,10 @@ public: RimSummaryPlotFilterTextCurveSetEditor(); ~RimSummaryPlotFilterTextCurveSetEditor() override; + std::vector fieldsToShowInToolbar(); + + void updateCurveFilterText(); + protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; @@ -49,7 +53,9 @@ private: QString curveFilterTextWithoutOutdatedLabel() const; caf::PdmPtrArrayField m_selectedSources; - caf::PdmField m_curveFilterText; + + caf::PdmField m_curveFilterLabelText; + caf::PdmField m_curveFilterText; bool m_isFieldRecentlyChangedFromGui; }; diff --git a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp index 476d97f173..85e364976e 100644 --- a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp @@ -558,23 +558,22 @@ void RiuPlotMainWindow::updateSummaryPlotToolBar( bool forceUpdateUi ) { std::vector toolBarFields = summaryPlot->fieldsToShowInToolbar(); + QString keyword; + if ( !m_summaryPlotToolBarEditor->isEditorDataValid( toolBarFields ) ) { + keyword = m_summaryPlotToolBarEditor->keywordForWidgetWithFocus(); + m_summaryPlotToolBarEditor->setFields( toolBarFields ); } - else if ( forceUpdateUi ) - { - m_summaryPlotToolBarEditor->updateUi(); - } m_summaryPlotToolBarEditor->updateUi(); - m_summaryPlotToolBarEditor->show(); + m_summaryPlotToolBarEditor->setKeyboardFocusFromKeyword( keyword ); } else { m_summaryPlotToolBarEditor->clear(); - m_summaryPlotToolBarEditor->hide(); } diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp index 5577cde98f..655a9ecd42 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp @@ -232,6 +232,22 @@ void PdmUiToolBarEditor::clear() m_actions.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiToolBarEditor::setKeyboardFocusFromKeyword(const QString& fieldKeyword) +{ + auto fieldView = m_fieldViews[fieldKeyword]; + if (fieldView) + { + auto editorWidget = fieldView->editorWidget(); + if (editorWidget) + { + editorWidget->setFocus(Qt::ActiveWindowFocusReason); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -254,4 +270,30 @@ void PdmUiToolBarEditor::hide() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString PdmUiToolBarEditor::keywordForWidgetWithFocus() +{ + QString keyword; + + if (m_toolbar->isVisible()) + { + for (auto fieldViewPair : m_fieldViews) + { + auto fieldView = fieldViewPair.second; + if (fieldView) + { + auto editorWidget = fieldView->editorWidget(); + if (editorWidget && editorWidget->hasFocus()) + { + keyword = fieldViewPair.first; + } + } + } + } + + return keyword; +} + } // end namespace caf diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h index 4b48d7be35..c15050cb4e 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h @@ -64,10 +64,14 @@ public: bool isEditorDataValid(const std::vector& fields) const; void setFields(std::vector& fields); void clear(); + + void setKeyboardFocusFromKeyword(const QString& fieldKeyword); + QString keywordForWidgetWithFocus(); void show(); void hide(); + private: void configureAndUpdateUi(const QString& uiConfigName) override; From 1671fe44b294d6308f445b127db879c7389a77c5 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 21 Oct 2019 16:36:28 +0200 Subject: [PATCH 3/7] #4775 Summary : Add max width to line edit --- ...RimSummaryPlotFilterTextCurveSetEditor.cpp | 19 ++++++++++++++++++- .../RimSummaryPlotFilterTextCurveSetEditor.h | 14 +++++++++----- .../cafUserInterface/cafPdmUiLineEditor.cpp | 17 +++++++++++------ .../cafUserInterface/cafPdmUiLineEditor.h | 2 ++ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp index 86d6fc18a7..cb77f278d5 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp @@ -51,7 +51,7 @@ #include "WellLogCommands/RicWellLogPlotCurveFeatureImpl.h" #include "cafPdmUiLabelEditor.h" -#include "cafPdmUiTextEditor.h" +#include "cafPdmUiLineEditor.h" #include "cafPdmUiTreeSelectionEditor.h" #include @@ -395,6 +395,23 @@ void RimSummaryPlotFilterTextCurveSetEditor::setupBeforeSave() m_curveFilterText = curveFilterTextWithoutOutdatedLabel(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotFilterTextCurveSetEditor::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_curveFilterText ) + { + auto attr = dynamic_cast( attribute ); + if ( attr ) + { + attr->maximumWidth = 150; + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h index 4a43e8d7a6..8ea0021954 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h @@ -38,11 +38,15 @@ public: protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; - void fieldChangedByUi( const caf::PdmFieldHandle* changedField, - const QVariant& oldValue, - const QVariant& newValue ) override; - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; - virtual void setupBeforeSave() override; + + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void setupBeforeSave() override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; private: static void appendOptionItemsForSources( QList& options, diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp index 6ccf62eb8f..61906a3736 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp @@ -38,29 +38,29 @@ #include "cafPdmUiLineEditor.h" #include "cafFactory.h" -#include "cafQShortenedLabel.h" #include "cafPdmField.h" #include "cafPdmObject.h" #include "cafPdmUiDefaultObjectEditor.h" #include "cafPdmUiFieldEditorHandle.h" #include "cafPdmUiOrdering.h" #include "cafPdmUniqueIdValidator.h" +#include "cafQShortenedLabel.h" #include "cafSelectionManager.h" +#include +#include #include -#include +#include +#include #include +#include #include #include #include #include #include #include -#include #include -#include -#include -#include namespace caf @@ -131,6 +131,11 @@ void PdmUiLineEditor::configureAndUpdateUi(const QString& uiConfigName) } m_lineEdit->setAvoidSendingEnterEventToParentWidget(leab.avoidSendingEnterEventToParentWidget); + + if (leab.maximumWidth != -1) + { + m_lineEdit->setMaximumWidth(leab.maximumWidth); + } } bool fromMenuOnly = true; diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h index 44b3ee296a..3c8adb7177 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h @@ -64,6 +64,7 @@ public: avoidSendingEnterEventToParentWidget = false; completerCaseSensitivity = Qt::CaseInsensitive; completerFilterMode = Qt::MatchContains; + maximumWidth = -1; } public: @@ -73,6 +74,7 @@ public: // Completer setup Qt::CaseSensitivity completerCaseSensitivity; Qt::MatchFlags completerFilterMode; + int maximumWidth; }; //-------------------------------------------------------------------------------------------------- From 28ef4166ea6fbb0af3c1bddb19fd5ac915c5ea93 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 22 Oct 2019 10:39:18 +0200 Subject: [PATCH 4/7] #4775 Summary : Improve event handling and add shorcut --- .../CMakeLists_files.cmake | 2 + ...RicActivateCurveFilterInToolbarFeature.cpp | 58 +++++++++++++++++++ .../RicActivateCurveFilterInToolbarFeature.h | 34 +++++++++++ .../Summary/RimSummaryPlot.cpp | 8 ++- ...RimSummaryPlotFilterTextCurveSetEditor.cpp | 28 ++++++--- .../RimSummaryPlotFilterTextCurveSetEditor.h | 2 +- .../UserInterface/RiuPlotMainWindow.cpp | 36 ++++++++++-- .../UserInterface/RiuPlotMainWindow.h | 2 + .../UserInterface/RiuTreeViewEventFilter.cpp | 50 +++++++++++++--- .../UserInterface/RiuTreeViewEventFilter.h | 13 ++++- .../cafUserInterface/cafPdmUiLineEditor.h | 2 + .../cafPdmUiToolBarEditor.cpp | 45 ++++++++++++-- .../cafUserInterface/cafPdmUiToolBarEditor.h | 5 +- 13 files changed, 255 insertions(+), 30 deletions(-) create mode 100644 ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.cpp create mode 100644 ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.h diff --git a/ApplicationCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake b/ApplicationCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake index 64b1b1429d..429b743ed4 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake +++ b/ApplicationCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake @@ -41,6 +41,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingSummaryCurveFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingSummaryCurveFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingEnsembleCurveSetFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingEnsembleCurveSetFeature.h +${CMAKE_CURRENT_LIST_DIR}/RicActivateCurveFilterInToolbarFeature.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -85,6 +86,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingSummaryCurveFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingSummaryCurveFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingEnsembleCurveSetFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingEnsembleCurveSetFeature.cpp +${CMAKE_CURRENT_LIST_DIR}/RicActivateCurveFilterInToolbarFeature.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.cpp new file mode 100644 index 0000000000..4d766996bc --- /dev/null +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.cpp @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RicActivateCurveFilterInToolbarFeature.h" + +#include "RiaGuiApplication.h" +#include "RiuPlotMainWindow.h" + +#include + +CAF_CMD_SOURCE_INIT( RicActivateCurveFilterInToolbarFeature, "RicActivateCurveFilterInToolbarFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicActivateCurveFilterInToolbarFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicActivateCurveFilterInToolbarFeature::onActionTriggered( bool isChecked ) +{ + if ( RiaGuiApplication::isRunning() ) + { + auto plotWindow = RiaGuiApplication::instance()->mainPlotWindow(); + if ( plotWindow ) + { + plotWindow->setFocusToLineEditInSummaryToolBar(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicActivateCurveFilterInToolbarFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Activate Summary Curve Filter Editor" ); + actionToSetup->setShortcut( QKeySequence( tr( "Ctrl+F" ) ) ); +} diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.h b/ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.h new file mode 100644 index 0000000000..8352953ce0 --- /dev/null +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicActivateCurveFilterInToolbarFeature.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicActivateCurveFilterInToolbarFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 29b074a9a0..c06d4f6d75 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -47,11 +47,13 @@ #include "RiuPlotMainWindowTools.h" #include "RiuSummaryQwtPlot.h" +#include "RiuTreeViewEventFilter.h" #include "cvfColor3.h" #include "cafPdmUiCheckBoxEditor.h" #include "cafPdmUiTreeOrdering.h" +#include "cafSelectionManager.h" #include "qwt_abstract_legend.h" #include "qwt_legend.h" @@ -67,7 +69,6 @@ #include #include -#include "cafSelectionManager.h" #include #include @@ -1948,6 +1949,11 @@ void RimSummaryPlot::handleKeyPressEvent( QKeyEvent* keyEvent ) { if ( !keyEvent ) return; + if ( RiuTreeViewEventFilter::activateFeatureFromKeyEvent( keyEvent ) ) + { + return; + } + RimSummaryPlotSourceStepping* sourceStepping = sourceSteppingObjectForKeyEventHandling(); if ( !sourceStepping ) return; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp index cb77f278d5..f786b58274 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp @@ -52,6 +52,7 @@ #include "cafPdmUiLabelEditor.h" #include "cafPdmUiLineEditor.h" +#include "cafPdmUiToolBarEditor.h" #include "cafPdmUiTreeSelectionEditor.h" #include @@ -69,22 +70,29 @@ RimSummaryPlotFilterTextCurveSetEditor::RimSummaryPlotFilterTextCurveSetEditor() CAF_PDM_InitObject( "Curve Set Filter Text", "", "", "" ); // clang-format off + QString filterTextHeading = "Text to Create Summary Vectors"; + QString filterTextShortcut = " (Ctrl + F)"; + QString filterTextToolTip = - "A space separated list of vector addresses in the syntax: [:[:[:i,j,k]]]\n" + "A list of vector addresses separated by spaces using the syntax: [:[:[:i,j,k]]]\n" "Wildcards can also be used. Examples:\n" " \"WOPT:*\" One total oil production curve for each well.\n" " \"FOPT FWPT\" Two curves with oil and water total production.\n" " \"BPR:15,28,*\" (no space) Oil phase pressure for all blocks along k as separate curves.\n"; // clang-format on + QString toolTipPropertyEditor = filterTextHeading + "\n\n" + filterTextToolTip; + QString toolTipToolbar = filterTextHeading + filterTextShortcut + "\n\n" + filterTextToolTip; + CAF_PDM_InitFieldNoDefault( &m_curveFilterLabelText, "Summary", "Summary", "", "", "" ); m_curveFilterLabelText.uiCapability()->setUiEditorTypeName( caf::PdmUiLabelEditor::uiEditorTypeName() ); - m_curveFilterLabelText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); m_curveFilterLabelText.xmlCapability()->disableIO(); - CAF_PDM_InitFieldNoDefault( &m_curveFilterText, "CurveFilterText", "Curve Filter Text", "", filterTextToolTip, "" ); + CAF_PDM_InitFieldNoDefault( &m_curveFilterText, "CurveFilterText", "Curve Filter Text", "", toolTipPropertyEditor, "" ); m_curveFilterText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); - // m_curveFilterText.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() ); + + // Special tool tip for toolbar + m_curveFilterText.uiCapability()->setUiToolTip( toolTipToolbar, caf::PdmUiToolBarEditor::uiEditorConfigName() ); CAF_PDM_InitFieldNoDefault( &m_selectedSources, "SummaryCases", "Sources", "", "", "" ); m_selectedSources.uiCapability()->setAutoAddingOptionFromValue( false ); @@ -112,7 +120,10 @@ std::vector RimSummaryPlotFilterTextCurveSetEditor::fields //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryPlotFilterTextCurveSetEditor::updateCurveFilterText() {} +QString RimSummaryPlotFilterTextCurveSetEditor::curveFilterFieldKeyword() +{ + return "CurveFilterText"; +} //-------------------------------------------------------------------------------------------------- /// @@ -402,12 +413,15 @@ void RimSummaryPlotFilterTextCurveSetEditor::defineEditorAttribute( const caf::P QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) { - if ( field == &m_curveFilterText ) + if ( field == &m_curveFilterText && uiConfigName == caf::PdmUiToolBarEditor::uiEditorConfigName() ) { + // Special config for toolbar + auto attr = dynamic_cast( attribute ); if ( attr ) { - attr->maximumWidth = 150; + attr->maximumWidth = 150; + attr->selectAllOnFocusEvent = true; } } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h index 8ea0021954..a643d7a2fb 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h @@ -33,7 +33,7 @@ public: std::vector fieldsToShowInToolbar(); - void updateCurveFilterText(); + static QString curveFilterFieldKeyword(); protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, diff --git a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp index 85e364976e..7b46a857c1 100644 --- a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp @@ -29,6 +29,7 @@ #include "RimSummaryCurveCollection.h" #include "RimSummaryPlot.h" #include "RimSummaryPlotCollection.h" +#include "RimSummaryPlotFilterTextCurveSetEditor.h" #include "RimViewWindow.h" #include "RimWellAllocationPlot.h" #include "RimWellLogCurveCommonDataSource.h" @@ -202,6 +203,19 @@ void RiuPlotMainWindow::closeEvent( QCloseEvent* event ) app->closeProject(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuPlotMainWindow::keyPressEvent( QKeyEvent* keyEvent ) +{ + if ( RiuTreeViewEventFilter::activateFeatureFromKeyEvent( keyEvent ) ) + { + return; + } + + RiuMainWindowBase::keyPressEvent( keyEvent ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -562,14 +576,14 @@ void RiuPlotMainWindow::updateSummaryPlotToolBar( bool forceUpdateUi ) if ( !m_summaryPlotToolBarEditor->isEditorDataValid( toolBarFields ) ) { - keyword = m_summaryPlotToolBarEditor->keywordForWidgetWithFocus(); + keyword = m_summaryPlotToolBarEditor->keywordForFocusWidget(); m_summaryPlotToolBarEditor->setFields( toolBarFields ); } - m_summaryPlotToolBarEditor->updateUi(); + m_summaryPlotToolBarEditor->updateUi( caf::PdmUiToolBarEditor::uiEditorConfigName() ); m_summaryPlotToolBarEditor->show(); - m_summaryPlotToolBarEditor->setKeyboardFocusFromKeyword( keyword ); + m_summaryPlotToolBarEditor->setFocusWidgetFromKeyword( keyword ); } else { @@ -580,6 +594,18 @@ void RiuPlotMainWindow::updateSummaryPlotToolBar( bool forceUpdateUi ) refreshToolbars(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuPlotMainWindow::setFocusToLineEditInSummaryToolBar() +{ + if ( m_summaryPlotToolBarEditor ) + { + m_summaryPlotToolBarEditor->setFocusWidgetFromKeyword( + RimSummaryPlotFilterTextCurveSetEditor::curveFilterFieldKeyword() ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -807,8 +833,8 @@ void RiuPlotMainWindow::customMenuRequested( const QPoint& pos ) RiaApplication* app = RiaApplication::instance(); app->project()->actionsBasedOnSelection( menu ); - // Qt doc: QAbstractScrollArea and its subclasses that map the context menu event to coordinates of the viewport(). - // Since we might get this signal from different treeViews, we need to map the position accordingly. + // Qt doc: QAbstractScrollArea and its subclasses that map the context menu event to coordinates of the + // viewport(). Since we might get this signal from different treeViews, we need to map the position accordingly. QObject* senderObj = this->sender(); QTreeView* treeView = dynamic_cast( senderObj ); if ( treeView ) diff --git a/ApplicationCode/UserInterface/RiuPlotMainWindow.h b/ApplicationCode/UserInterface/RiuPlotMainWindow.h index 8ba6e0ccb2..1c7d7f3614 100644 --- a/ApplicationCode/UserInterface/RiuPlotMainWindow.h +++ b/ApplicationCode/UserInterface/RiuPlotMainWindow.h @@ -81,9 +81,11 @@ public: void updateWellLogPlotToolBar(); void updateSummaryPlotToolBar( bool forceUpdateUi = false ); + void setFocusToLineEditInSummaryToolBar(); protected: void closeEvent( QCloseEvent* event ) override; + void keyPressEvent( QKeyEvent* ) override; private: void setPdmRoot( caf::PdmObject* pdmRoot ); diff --git a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp index f718c0e82c..89e083bfed 100644 --- a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp +++ b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.cpp @@ -49,6 +49,44 @@ RiuTreeViewEventFilter::RiuTreeViewEventFilter( QObject* parent ) { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiuTreeViewEventFilter::activateFeatureFromKeyEvent( QKeyEvent* keyEvent ) +{ + QKeySequence keySeq( keyEvent->modifiers() + keyEvent->key() ); + + auto matches = caf::CmdFeatureManager::instance()->commandFeaturesMatchingKeyboardShortcut( keySeq ); + + bool wasFeatureActivated = activateFirstEnabledFeature( matches ); + if ( wasFeatureActivated ) + { + keyEvent->setAccepted( true ); + + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiuTreeViewEventFilter::activateFirstEnabledFeature( const std::vector& features ) +{ + for ( caf::CmdFeature* feature : features ) + { + if ( feature->canFeatureBeExecuted() ) + { + feature->actionTriggered( false ); + + return true; + } + } + + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -93,15 +131,11 @@ bool RiuTreeViewEventFilter::eventFilter( QObject* obj, QEvent* event ) matches = caf::CmdFeatureManager::instance()->commandFeaturesMatchingKeyboardShortcut( keySeq ); } - for ( caf::CmdFeature* feature : matches ) + bool wasFeatureActivated = RiuTreeViewEventFilter::activateFirstEnabledFeature( matches ); + if ( wasFeatureActivated ) { - if ( feature->canFeatureBeExecuted() ) - { - feature->actionTriggered( false ); - - keyEvent->setAccepted( true ); - return true; - } + keyEvent->setAccepted( true ); + return true; } } diff --git a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h index a3638ea262..be6756ca9e 100644 --- a/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h +++ b/ApplicationCode/UserInterface/RiuTreeViewEventFilter.h @@ -21,7 +21,15 @@ #include +#include + class QEvent; +class QKeyEvent; + +namespace caf +{ +class CmdFeature; +} //-------------------------------------------------------------------------------------------------- class RiuTreeViewEventFilter : public QObject @@ -30,6 +38,9 @@ class RiuTreeViewEventFilter : public QObject public: explicit RiuTreeViewEventFilter( QObject* parent ); + static bool activateFeatureFromKeyEvent( QKeyEvent* keyEvent ); + static bool activateFirstEnabledFeature( const std::vector& features ); + protected: bool eventFilter( QObject* obj, QEvent* event ) override; -}; \ No newline at end of file +}; diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h index 3c8adb7177..8be05b7d4d 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h @@ -65,6 +65,7 @@ public: completerCaseSensitivity = Qt::CaseInsensitive; completerFilterMode = Qt::MatchContains; maximumWidth = -1; + selectAllOnFocusEvent = false; } public: @@ -75,6 +76,7 @@ public: Qt::CaseSensitivity completerCaseSensitivity; Qt::MatchFlags completerFilterMode; int maximumWidth; + bool selectAllOnFocusEvent; }; //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp index 655a9ecd42..b88113ecab 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.cpp @@ -42,12 +42,14 @@ #include "cafPdmUiFieldEditorHandle.h" #include "cafPdmUiFieldEditorHelper.h" #include "cafPdmUiFieldHandle.h" +#include "cafPdmUiLineEditor.h" #include "cafPdmUiObjectHandle.h" #include "cafPdmUiOrdering.h" #include "cafPdmUiPushButtonEditor.h" #include "cafPdmUiToolButtonEditor.h" #include +#include #include #include @@ -235,15 +237,40 @@ void PdmUiToolBarEditor::clear() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void PdmUiToolBarEditor::setKeyboardFocusFromKeyword(const QString& fieldKeyword) +void PdmUiToolBarEditor::setFocusWidgetFromKeyword(const QString& fieldKeyword) { - auto fieldView = m_fieldViews[fieldKeyword]; - if (fieldView) + if (!m_toolbar->isVisible()) return; + + auto fieldView = m_fieldViews.find(fieldKeyword); + if (fieldView != m_fieldViews.end() && fieldView->second) { - auto editorWidget = fieldView->editorWidget(); + auto editorWidget = fieldView->second->editorWidget(); if (editorWidget) { editorWidget->setFocus(Qt::ActiveWindowFocusReason); + + PdmUiLineEditorAttribute attributes; + + for (auto field : m_fields) + { + if (field->keyword() == fieldKeyword) + { + caf::PdmUiObjectHandle* uiObject = uiObj(field->ownerObject()); + if (uiObject) + { + uiObject->editorAttribute(field, uiEditorConfigName(), &attributes); + } + } + } + + if (attributes.selectAllOnFocusEvent) + { + auto lineEdit = dynamic_cast(editorWidget); + if (lineEdit ) + { + lineEdit->selectAll(); + } + } } } } @@ -270,10 +297,18 @@ void PdmUiToolBarEditor::hide() } } +//-------------------------------------------------------------------------------------------------- +/// Special config name used to configure toolbar UI (tooltip etc.) +//-------------------------------------------------------------------------------------------------- +QString PdmUiToolBarEditor::uiEditorConfigName() +{ + return "ToolbarConfigName"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString PdmUiToolBarEditor::keywordForWidgetWithFocus() +QString PdmUiToolBarEditor::keywordForFocusWidget() { QString keyword; diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h index c15050cb4e..11ad9e9d1e 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiToolBarEditor.h @@ -65,12 +65,13 @@ public: void setFields(std::vector& fields); void clear(); - void setKeyboardFocusFromKeyword(const QString& fieldKeyword); - QString keywordForWidgetWithFocus(); + void setFocusWidgetFromKeyword(const QString& fieldKeyword); + QString keywordForFocusWidget(); void show(); void hide(); + static QString uiEditorConfigName(); private: void configureAndUpdateUi(const QString& uiConfigName) override; From bbfc6188e910eb0863a875e88ed37e08d0bc6eec Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 23 Oct 2019 17:39:16 +0200 Subject: [PATCH 5/7] #4775 Summary : Do not change source selection if no sources are matching --- .../Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp index f786b58274..b122858303 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp @@ -366,8 +366,11 @@ void RimSummaryPlotFilterTextCurveSetEditor::defineUiOrdering( QString uiConfigN std::vector> usedSources( sourcesFromExistingCurves.begin(), sourcesFromExistingCurves.end() ); - m_selectedSources.clear(); - m_selectedSources.setValue( usedSources ); + if ( !usedSources.empty() ) + { + m_selectedSources.clear(); + m_selectedSources.setValue( usedSources ); + } // Check if existing filtertext matches all the curves // Todo: possibly check grid time history curves also From 19354512423d46c0f53c00817a522f4a5ea91bf3 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 24 Oct 2019 09:44:51 +0200 Subject: [PATCH 6/7] AppFwk : Add placeholder text to line edit --- Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp | 5 +++++ Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp index 61906a3736..6cc7e86783 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp @@ -136,6 +136,11 @@ void PdmUiLineEditor::configureAndUpdateUi(const QString& uiConfigName) { m_lineEdit->setMaximumWidth(leab.maximumWidth); } + + if (!leab.placeholderText.isEmpty()) + { + m_lineEdit->setPlaceholderText(leab.placeholderText); + } } bool fromMenuOnly = true; diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h index 8be05b7d4d..97f4e9b641 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.h @@ -66,6 +66,7 @@ public: completerFilterMode = Qt::MatchContains; maximumWidth = -1; selectAllOnFocusEvent = false; + placeholderText = ""; } public: @@ -77,6 +78,7 @@ public: Qt::MatchFlags completerFilterMode; int maximumWidth; bool selectAllOnFocusEvent; + QString placeholderText; }; //-------------------------------------------------------------------------------------------------- From 580d82692293a276999fd6c8880b504cb6358967 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 24 Oct 2019 10:04:42 +0200 Subject: [PATCH 7/7] Clear line edit when content do not match --- .../Summary/RimSummaryPlot.cpp | 2 + ...RimSummaryPlotFilterTextCurveSetEditor.cpp | 162 ++++++++++-------- .../RimSummaryPlotFilterTextCurveSetEditor.h | 1 + 3 files changed, 92 insertions(+), 73 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index c06d4f6d75..048901540c 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -1432,6 +1432,8 @@ void RimSummaryPlot::onLoadDataAndUpdate() if ( m_qwtPlot ) m_qwtPlot->updateLegend(); this->updateAxes(); + + m_textCurveSetEditor->updateTextFilter(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp index b122858303..94f4d0fd51 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.cpp @@ -125,6 +125,82 @@ QString RimSummaryPlotFilterTextCurveSetEditor::curveFilterFieldKeyword() return "CurveFilterText"; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotFilterTextCurveSetEditor::updateTextFilter() +{ + RimSummaryPlot* parentPlot; + this->firstAncestorOrThisOfType( parentPlot ); + std::set sourcesFromExistingCurves; + std::set addressesInUse; + std::vector gridaddressesInUse; + + if ( parentPlot ) + { + std::vector ensembleCurveSets = parentPlot->ensembleCurveSetCollection()->curveSets(); + for ( auto ensCurvSet : ensembleCurveSets ) + { + sourcesFromExistingCurves.insert( ensCurvSet->summaryCaseCollection() ); + addressesInUse.insert( ensCurvSet->summaryAddress() ); + } + + std::vector sumCurves = parentPlot->summaryCurveCollection()->curves(); + for ( auto sumCurve : sumCurves ) + { + sourcesFromExistingCurves.insert( sumCurve->summaryCaseY() ); + addressesInUse.insert( sumCurve->summaryAddressY() ); + } + + std::vector gridTimeHistoryCurves = parentPlot->gridTimeHistoryCurves(); + for ( auto grCurve : gridTimeHistoryCurves ) + { + RimEclipseCase* eclCase = dynamic_cast( grCurve->gridCase() ); + if ( eclCase ) + { + sourcesFromExistingCurves.insert( eclCase ); + gridaddressesInUse.push_back( grCurve->resultAddress() ); + } + } + } + + std::vector> usedSources( sourcesFromExistingCurves.begin(), + sourcesFromExistingCurves.end() ); + + if ( !usedSources.empty() ) + { + m_selectedSources.clear(); + m_selectedSources.setValue( usedSources ); + } + + // Check if existing filter text matches all the curves + // Todo: possibly check grid time history curves also + + QStringList allCurveAddressFilters = curveFilterTextWithoutOutdatedLabel().split( QRegExp( "\\s+" ), + QString::SkipEmptyParts ); + + std::vector accumulatedUsedFilters( allCurveAddressFilters.size(), false ); + + std::vector usedFilters; + std::set filteredAddressesFromSource; + RicSummaryPlotFeatureImpl::filteredSummaryAdressesFromCase( allCurveAddressFilters, + addressesInUse, + &filteredAddressesFromSource, + &usedFilters ); + + if ( filteredAddressesFromSource != addressesInUse ) + { + // m_curveFilterText = FILTER_TEXT_OUTDATED_TEXT + curveFilterTextWithoutOutdatedLabel(); + m_curveFilterText = ""; + } + else + { + m_curveFilterText = curveFilterTextWithoutOutdatedLabel(); + } + + m_curveFilterText.uiCapability()->updateConnectedEditors(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -325,77 +401,13 @@ void RimSummaryPlotFilterTextCurveSetEditor::fieldChangedByUi( const caf::PdmFie //-------------------------------------------------------------------------------------------------- void RimSummaryPlotFilterTextCurveSetEditor::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { + uiOrdering.add( &m_curveFilterText ); + uiOrdering.add( &m_selectedSources ); + uiOrdering.skipRemainingFields(); + if ( !m_isFieldRecentlyChangedFromGui ) { - // Sync gui from existing curves - - RimSummaryPlot* parentPlot; - this->firstAncestorOrThisOfType( parentPlot ); - std::set sourcesFromExistingCurves; - std::set addressesInUse; - std::vector gridaddressesInUse; - - if ( parentPlot ) - { - std::vector ensembleCurveSets = parentPlot->ensembleCurveSetCollection()->curveSets(); - for ( auto ensCurvSet : ensembleCurveSets ) - { - sourcesFromExistingCurves.insert( ensCurvSet->summaryCaseCollection() ); - addressesInUse.insert( ensCurvSet->summaryAddress() ); - } - - std::vector sumCurves = parentPlot->summaryCurveCollection()->curves(); - for ( auto sumCurve : sumCurves ) - { - sourcesFromExistingCurves.insert( sumCurve->summaryCaseY() ); - addressesInUse.insert( sumCurve->summaryAddressY() ); - } - - std::vector gridTimeHistoryCurves = parentPlot->gridTimeHistoryCurves(); - for ( auto grCurve : gridTimeHistoryCurves ) - { - RimEclipseCase* eclCase = dynamic_cast( grCurve->gridCase() ); - if ( eclCase ) - { - sourcesFromExistingCurves.insert( eclCase ); - gridaddressesInUse.push_back( grCurve->resultAddress() ); - } - } - } - - std::vector> usedSources( sourcesFromExistingCurves.begin(), - sourcesFromExistingCurves.end() ); - - if ( !usedSources.empty() ) - { - m_selectedSources.clear(); - m_selectedSources.setValue( usedSources ); - } - - // Check if existing filtertext matches all the curves - // Todo: possibly check grid time history curves also - - QStringList allCurveAddressFilters = curveFilterTextWithoutOutdatedLabel().split( QRegExp( "\\s+" ), - QString::SkipEmptyParts ); - std::vector accumulatedUsedFilters( allCurveAddressFilters.size(), false ); - - std::vector usedFilters; - std::set filteredAddressesFromSource; - RicSummaryPlotFeatureImpl::filteredSummaryAdressesFromCase( allCurveAddressFilters, - addressesInUse, - &filteredAddressesFromSource, - &usedFilters ); - - if ( filteredAddressesFromSource != addressesInUse ) - { - m_curveFilterText = FILTER_TEXT_OUTDATED_TEXT + curveFilterTextWithoutOutdatedLabel(); - } - else - { - m_curveFilterText = curveFilterTextWithoutOutdatedLabel(); - } - - m_curveFilterText.uiCapability()->updateConnectedEditors(); + updateTextFilter(); } m_isFieldRecentlyChangedFromGui = false; @@ -416,15 +428,19 @@ void RimSummaryPlotFilterTextCurveSetEditor::defineEditorAttribute( const caf::P QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) { - if ( field == &m_curveFilterText && uiConfigName == caf::PdmUiToolBarEditor::uiEditorConfigName() ) + if ( field == &m_curveFilterText ) { - // Special config for toolbar - auto attr = dynamic_cast( attribute ); if ( attr ) { - attr->maximumWidth = 150; + if ( uiConfigName == caf::PdmUiToolBarEditor::uiEditorConfigName() ) + { + // Special config for toolbar + attr->maximumWidth = 150; + } + attr->selectAllOnFocusEvent = true; + attr->placeholderText = "Click to define filter"; } } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h index a643d7a2fb..6a9b7b28ba 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotFilterTextCurveSetEditor.h @@ -34,6 +34,7 @@ public: std::vector fieldsToShowInToolbar(); static QString curveFilterFieldKeyword(); + void updateTextFilter(); protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,