Merge pull request #4942 from OPM/summary-text-edit-in-toolbar

Add combo box to specify text for summary curves
This commit is contained in:
Magne Sjaastad
2019-10-29 06:52:33 +01:00
committed by GitHub
11 changed files with 264 additions and 44 deletions

View File

@@ -50,6 +50,7 @@
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
#include "WellLogCommands/RicWellLogPlotCurveFeatureImpl.h"
#include "cafPdmUiComboBoxEditor.h"
#include "cafPdmUiLabelEditor.h"
#include "cafPdmUiLineEditor.h"
#include "cafPdmUiToolBarEditor.h"
@@ -90,6 +91,7 @@ RimSummaryPlotFilterTextCurveSetEditor::RimSummaryPlotFilterTextCurveSetEditor()
CAF_PDM_InitFieldNoDefault( &m_curveFilterText, "CurveFilterText", "Curve Filter Text", "", toolTipPropertyEditor, "" );
m_curveFilterText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
m_curveFilterText.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() );
// Special tool tip for toolbar
m_curveFilterText.uiCapability()->setUiToolTip( toolTipToolbar, caf::PdmUiToolBarEditor::uiEditorConfigName() );
@@ -381,6 +383,17 @@ void RimSummaryPlotFilterTextCurveSetEditor::fieldChangedByUi( const caf::PdmFie
{
m_curveFilterText = curveFilterTextWithoutOutdatedLabel();
{
if ( m_historyItems.indexOf( m_curveFilterText ) == -1 )
{
m_historyItems.push_front( m_curveFilterText );
while ( m_historyItems.size() > 10 )
{
m_historyItems.pop_back();
}
}
}
m_curveFilterText.uiCapability()->updateConnectedEditors();
}
@@ -430,17 +443,29 @@ void RimSummaryPlotFilterTextCurveSetEditor::defineEditorAttribute( const caf::P
{
if ( field == &m_curveFilterText )
{
auto attr = dynamic_cast<caf::PdmUiLineEditorAttribute*>( attribute );
if ( attr )
{
if ( uiConfigName == caf::PdmUiToolBarEditor::uiEditorConfigName() )
auto attr = dynamic_cast<caf::PdmUiLineEditorAttribute*>( attribute );
if ( attr )
{
// Special config for toolbar
attr->maximumWidth = 150;
}
if ( uiConfigName == caf::PdmUiToolBarEditor::uiEditorConfigName() )
{
// Special config for toolbar
attr->maximumWidth = 150;
}
attr->selectAllOnFocusEvent = true;
attr->placeholderText = "Click to Edit Summary Curves";
attr->selectAllOnFocusEvent = true;
attr->placeholderText = "Click to define filter";
}
}
{
auto attr = dynamic_cast<caf::PdmUiComboBoxEditorAttribute*>( attribute );
if ( attr )
{
attr->enableEditableContent = true;
attr->adjustWidthToContents = true;
attr->minimumWidth = 100;
}
}
}
}
@@ -458,6 +483,14 @@ QList<caf::PdmOptionItemInfo>
appendOptionItemsForSources( options, false, false );
}
if ( fieldNeedingOptions == &m_curveFilterText )
{
for ( const auto& s : m_historyItems )
{
options.push_back( caf::PdmOptionItemInfo( s, s ) );
}
}
return options;
}

View File

@@ -61,6 +61,7 @@ private:
caf::PdmField<QString> m_curveFilterLabelText;
caf::PdmField<QString> m_curveFilterText;
QStringList m_historyItems;
bool m_isFieldRecentlyChangedFromGui;
};

View File

@@ -20,6 +20,8 @@ void caf::PdmFieldUiCap<FieldType>::setValueFromUiEditor(const QVariant& uiValue
{
QVariant oldUiBasedQVariant = toUiBasedQVariant();
bool setUiValueDirectly = false;
// Check whether we are handling selections of values or actual values
if (m_optionEntryCache.size())
{
@@ -77,17 +79,22 @@ void caf::PdmFieldUiCap<FieldType>::setValueFromUiEditor(const QVariant& uiValue
}
else
{
// We are not getting indexes as expected from the UI. For now assert, to catch this condition
// but it should possibly be handled as setting the values explicitly. The code for that is below the assert
CAF_ASSERT(false);
typename FieldType::FieldDataType value;
PdmUiFieldSpecialization<typename FieldType::FieldDataType>::setFromVariant(uiValue, value);
m_field->setValue(value);
m_optionEntryCache.clear();
// We are not getting indexes as usually expected when an option cache is present.
// This situation can occur if a text field is edited by a combobox allowing user defined input
// when a history of recently used strings are stored in a field of string
setUiValueDirectly = true;
}
}
else
{ // Not an option based GUI, the uiValue is a real field value
{
// Not an option based GUI, the uiValue is a real field value
setUiValueDirectly = true;
}
if (setUiValueDirectly)
{
typename FieldType::FieldDataType value;
PdmUiFieldSpecialization<typename FieldType::FieldDataType>::setFromVariant(uiValue, value);
m_field->setValue(value);

View File

@@ -59,6 +59,9 @@ set( PROJECT_FILES
CustomObjectEditor.h
MenuItemProducer.cpp
MenuItemProducer.h
TamComboBox.h
TamComboBox.cpp
)

View File

@@ -6,6 +6,7 @@
#include "CustomObjectEditor.h"
#include "ManyGroups.h"
#include "MenuItemProducer.h"
#include "TamComboBox.h"
#include "WidgetLayoutTest.h"
#include "cafAppEnum.h"
@@ -16,6 +17,7 @@
#include "cafCmdSelectionHelper.h"
#endif
#include "cafCmdFeatureMenuBuilder.h"
#include "cafFilePath.h"
#include "cafPdmDocument.h"
#include "cafPdmObject.h"
@@ -37,7 +39,6 @@
#include "cafPdmUiTreeView.h"
#include "cafSelectionManager.h"
#include "cafCmdFeatureMenuBuilder.h"
#include <QAction>
#include <QDockWidget>
#include <QFileDialog>
@@ -1166,6 +1167,9 @@ void MainWindow::buildTestModel()
SingleEditorPdmObject* singleEditorObj = new SingleEditorPdmObject;
m_testRoot->objects.push_back(singleEditorObj);
auto tamComboBox = new TamComboBox;
m_testRoot->objects.push_back(tamComboBox);
DemoPdmObject* demoObj2 = new DemoPdmObject;
demoObject->m_textField = "Mitt Demo Obj";

View File

@@ -0,0 +1,72 @@
#include "TamComboBox.h"
#include "cafPdmUiComboBoxEditor.h"
CAF_PDM_SOURCE_INIT(TamComboBox, "TamComboBox");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TamComboBox::TamComboBox()
{
CAF_PDM_InitObject("Cell Filter", "", "", "");
CAF_PDM_InitField(&m_name, "UserDescription", QString("Filter Name"), "Name", "", "", "");
m_name.uiCapability()->setUiEditorTypeName(caf::PdmUiComboBoxEditor::uiEditorTypeName());
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo> TamComboBox::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly)
{
QList<caf::PdmOptionItemInfo> options;
for (const auto& s : m_historyItems)
{
options.push_back(caf::PdmOptionItemInfo(s, s));
}
return options;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void TamComboBox::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
{
if (changedField == &m_name)
{
QString text = m_name();
if (m_historyItems.indexOf(text) == -1)
{
m_historyItems.push_front(m_name);
while (m_historyItems.size() > 5)
{
m_historyItems.pop_back();
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void TamComboBox::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) {}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void TamComboBox::defineEditorAttribute(const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute)
{
auto attr = dynamic_cast<caf::PdmUiComboBoxEditorAttribute*>(attribute);
if (attr)
{
attr->enableEditableContent = true;
}
}

View File

@@ -0,0 +1,39 @@
#pragma once
#include "cafAppEnum.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include <QStringList>
//==================================================================================================
///
///
//==================================================================================================
class TamComboBox : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
TamComboBox();
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly) override;
virtual void
fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
private:
caf::PdmField<QString> m_name;
protected:
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute) override;
private:
QStringList m_historyItems;
};

View File

@@ -37,9 +37,9 @@
#include "cafPdmUiComboBoxEditor.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmUiFieldEditorHandle.h"
#include "cafPdmField.h"
#include "cafFactory.h"
#include "cafQShortenedLabel.h"
@@ -182,16 +182,17 @@ void PdmUiComboBoxEditor::configureAndUpdateUi(const QString& uiConfigName)
}
// Handle attributes
PdmUiComboBoxEditorAttribute attributes;
caf::PdmUiObjectHandle* uiObject = uiObj(uiField()->fieldHandle()->ownerObject());
if (uiObject)
{
uiObject->editorAttribute(uiField()->fieldHandle(), uiConfigName, &attributes);
uiObject->editorAttribute(uiField()->fieldHandle(), uiConfigName, &m_attributes);
}
if (!m_comboBox.isNull())
{
m_comboBox->setEnabled(!uiField()->isUiReadOnly(uiConfigName));
m_comboBox->setToolTip(uiField()->uiToolTip(uiConfigName));
bool fromMenuOnly = true;
QList<PdmOptionItemInfo> options = uiField()->valueOptions(&fromMenuOnly);
@@ -207,10 +208,10 @@ void PdmUiComboBoxEditor::configureAndUpdateUi(const QString& uiConfigName)
if (!options.isEmpty())
{
for (int i = 0; i < options.size(); i++)
for (const auto& option : options)
{
m_comboBox->addItem(options[i].icon(), options[i].optionUiText());
m_comboBox->setIconSize(attributes.iconSize);
m_comboBox->addItem(option.icon(), option.optionUiText());
m_comboBox->setIconSize(m_attributes.iconSize);
}
m_comboBox->setCurrentIndex(uiField()->uiValue().toInt());
}
@@ -220,14 +221,24 @@ void PdmUiComboBoxEditor::configureAndUpdateUi(const QString& uiConfigName)
m_comboBox->setCurrentIndex(0);
}
if (attributes.adjustWidthToContents)
if (m_attributes.adjustWidthToContents)
{
m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
}
else if (attributes.minimumContentsLength > 0)
else if (m_attributes.minimumContentsLength > 0)
{
m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
m_comboBox->setMinimumContentsLength(attributes.minimumContentsLength);
m_comboBox->setMinimumContentsLength(m_attributes.minimumContentsLength);
}
if (m_attributes.enableEditableContent)
{
m_comboBox->setEditable(true);
}
if (m_attributes.minimumWidth != -1)
{
m_comboBox->setMinimumWidth(m_attributes.minimumWidth);
}
m_comboBox->blockSignals(false);
@@ -235,7 +246,7 @@ void PdmUiComboBoxEditor::configureAndUpdateUi(const QString& uiConfigName)
if (!m_layout.isNull())
{
if (attributes.showPreviousAndNextButtons)
if (m_attributes.showPreviousAndNextButtons)
{
if (m_previousItemButton.isNull())
{
@@ -277,14 +288,14 @@ void PdmUiComboBoxEditor::configureAndUpdateUi(const QString& uiConfigName)
}
// Update button texts
if (!attributes.nextButtonText.isEmpty())
if (!m_attributes.nextButtonText.isEmpty())
{
m_nextItemButton->setToolTip(attributes.nextButtonText);
m_nextItemButton->setToolTip(m_attributes.nextButtonText);
}
if (!attributes.prevButtonText.isEmpty())
if (!m_attributes.prevButtonText.isEmpty())
{
m_previousItemButton->setToolTip(attributes.prevButtonText);
m_previousItemButton->setToolTip(m_attributes.prevButtonText);
}
}
else
@@ -406,11 +417,24 @@ QWidget* PdmUiComboBoxEditor::createLabelWidget(QWidget * parent)
//--------------------------------------------------------------------------------------------------
void PdmUiComboBoxEditor::slotIndexActivated(int index)
{
QVariant v;
v = index;
if (m_attributes.enableEditableContent)
{
// Use the text directly, as the item text could be entered directly by the user
QVariant uintValue(v.toUInt());
this->setValueToField(uintValue);
auto text = m_comboBox->itemText(index);
this->setValueToField(text);
}
else
{
// Use index as data carrier to PDM field
// The index will be used as a lookup in a list of option items
QVariant v;
v = index;
QVariant uintValue(v.toUInt());
this->setValueToField(uintValue);
}
}
//--------------------------------------------------------------------------------------------------

View File

@@ -61,6 +61,8 @@ public:
adjustWidthToContents = false;
showPreviousAndNextButtons = false;
minimumContentsLength = 8;
enableEditableContent = false;
minimumWidth = -1;
iconSize = QSize(14, 14);
}
@@ -69,9 +71,13 @@ public:
bool showPreviousAndNextButtons;
int minimumContentsLength; // The length of string to adjust to if adjustWidthToContents = false.
// Set to <= 0 to ignore and use AdjustToContentsOnFirstShow instead
QSize iconSize;
bool enableEditableContent;
int minimumWidth;
QString nextButtonText;
QString prevButtonText;
QSize iconSize;
};
@@ -107,6 +113,8 @@ private:
QPointer<QToolButton> m_nextItemButton;
QPointer<QHBoxLayout> m_layout;
QPointer<QWidget> m_placeholder;
PdmUiComboBoxEditorAttribute m_attributes;
};

View File

@@ -204,6 +204,32 @@ void PdmUiToolBarEditor::configureAndUpdateUi(const QString& uiConfigName)
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* PdmUiToolBarEditor::focusWidget(PdmUiFieldEditorHandle* uiFieldEditorHandle)
{
// Some editors have a placeholder widget as parent of the main editor widget
// This is the case for combo box widget to allow up/down arrow buttons associated with the combo box
QWidget* editorWidget = nullptr;
auto comboEditor = dynamic_cast<caf::PdmUiComboBoxEditor*>(uiFieldEditorHandle);
if (comboEditor)
{
auto topWidget = comboEditor->editorWidget();
QComboBox* comboBox = topWidget->findChild<QComboBox*>();
editorWidget = comboBox;
}
else
{
editorWidget = uiFieldEditorHandle->editorWidget();
}
return editorWidget;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -244,10 +270,11 @@ void PdmUiToolBarEditor::setFocusWidgetFromKeyword(const QString& fieldKeyword)
auto fieldView = m_fieldViews.find(fieldKeyword);
if (fieldView != m_fieldViews.end() && fieldView->second)
{
auto editorWidget = fieldView->second->editorWidget();
if (editorWidget)
QWidget* widget = focusWidget(fieldView->second);
if (widget)
{
editorWidget->setFocus(Qt::ActiveWindowFocusReason);
widget->setFocus(Qt::ActiveWindowFocusReason);
PdmUiLineEditorAttribute attributes;
@@ -265,7 +292,7 @@ void PdmUiToolBarEditor::setFocusWidgetFromKeyword(const QString& fieldKeyword)
if (attributes.selectAllOnFocusEvent)
{
auto lineEdit = dynamic_cast<QLineEdit*>(editorWidget);
auto lineEdit = dynamic_cast<QLineEdit*>(widget);
if (lineEdit )
{
lineEdit->selectAll();
@@ -316,11 +343,11 @@ QString PdmUiToolBarEditor::keywordForFocusWidget()
{
for (auto fieldViewPair : m_fieldViews)
{
auto fieldView = fieldViewPair.second;
if (fieldView)
auto uiFieldEditorHandle = fieldViewPair.second;
if (uiFieldEditorHandle)
{
auto editorWidget = fieldView->editorWidget();
if (editorWidget && editorWidget->hasFocus())
auto widget = focusWidget(uiFieldEditorHandle);
if (widget && widget->hasFocus())
{
keyword = fieldViewPair.first;
}

View File

@@ -75,6 +75,8 @@ public:
private:
void configureAndUpdateUi(const QString& uiConfigName) override;
static QWidget* focusWidget(PdmUiFieldEditorHandle* uiFieldEditorHandle);
private:
QPointer<QToolBar> m_toolbar;