AppFwk : Add support for push buttons in table editor

This commit is contained in:
Magne Sjaastad 2017-10-11 19:39:32 +02:00
parent a33a2411ef
commit 9dd730f8f6
7 changed files with 165 additions and 23 deletions

View File

@ -35,6 +35,7 @@
#include "cafPdmUiTreeView.h" #include "cafPdmUiTreeView.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include "cafPdmUiTreeSelectionEditor.h" #include "cafPdmUiTreeSelectionEditor.h"
#include "cafPdmUiPushButtonEditor.h"
@ -213,6 +214,7 @@ public:
CAF_PDM_InitObject("Small Demo Object A", "", "This object is a demo of the CAF framework", "This object is a demo of the CAF framework"); CAF_PDM_InitObject("Small Demo Object A", "", "This object is a demo of the CAF framework", "This object is a demo of the CAF framework");
CAF_PDM_InitField(&m_toggleField, "Toggle", false, "Toggle Field", "", "Toggle Field tooltip", " Toggle Field whatsthis"); CAF_PDM_InitField(&m_toggleField, "Toggle", false, "Toggle Field", "", "Toggle Field tooltip", " Toggle Field whatsthis");
CAF_PDM_InitField(&m_pushButtonField, "Push", false, "Button Field", "", "", " ");
CAF_PDM_InitField(&m_doubleField, "BigNumber", 0.0, "Big Number", "", "Enter a big number here", "This is a place you can enter a big real value if you want"); CAF_PDM_InitField(&m_doubleField, "BigNumber", 0.0, "Big Number", "", "Enter a big number here", "This is a place you can enter a big real value if you want");
CAF_PDM_InitField(&m_intField, "IntNumber", 0, "Small Number", "", "Enter some small number here","This is a place you can enter a small integer value if you want"); CAF_PDM_InitField(&m_intField, "IntNumber", 0, "Small Number", "", "Enter some small number here","This is a place you can enter a small integer value if you want");
CAF_PDM_InitField(&m_textField, "TextField", QString("Small Demo Object A"), "Name Text Field", "", "", ""); CAF_PDM_InitField(&m_textField, "TextField", QString("Small Demo Object A"), "Name Text Field", "", "", "");
@ -249,6 +251,8 @@ public:
caf::PdmField< caf::AppEnum<TestEnumType> > m_highlightedEnum; caf::PdmField< caf::AppEnum<TestEnumType> > m_highlightedEnum;
caf::PdmField<bool> m_toggleField; caf::PdmField<bool> m_toggleField;
caf::PdmField<bool> m_pushButtonField;
virtual caf::PdmFieldHandle* objectToggleField() virtual caf::PdmFieldHandle* objectToggleField()
{ {
return &m_toggleField; return &m_toggleField;
@ -264,6 +268,10 @@ public:
{ {
std::cout << "Highlight value " << m_highlightedEnum() << std::endl; std::cout << "Highlight value " << m_highlightedEnum() << std::endl;
} }
else if (changedField == &m_pushButtonField)
{
std::cout << "Push Button pressed " << std::endl;
}
} }
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly)
@ -335,6 +343,18 @@ protected:
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
virtual void defineObjectEditorAttribute(QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override
{
caf::PdmUiTableViewEditorAttribute* attr = dynamic_cast<caf::PdmUiTableViewEditorAttribute*>(attribute);
if (attr)
{
attr->registerPushButtonTextForFieldKeyword(m_pushButtonField.keyword(), "Edit");
}
}
}; };
CAF_PDM_SOURCE_INIT(SmallDemoPdmObjectA, "SmallDemoPdmObjectA"); CAF_PDM_SOURCE_INIT(SmallDemoPdmObjectA, "SmallDemoPdmObjectA");

View File

@ -160,5 +160,36 @@ PdmObjectHandle* PdmUiTableView::pdmObjectFromModelIndex(const QModelIndex& mi)
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiTableViewEditorAttribute::registerPushButtonTextForFieldKeyword(const QString& keyword, const QString& text)
{
m_fieldKeywordAndPushButtonText[keyword] = text;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool PdmUiTableViewEditorAttribute::showPushButtonForFieldKeyword(const QString& keyword) const
{
if (m_fieldKeywordAndPushButtonText.count(keyword) > 0) return true;
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString PdmUiTableViewEditorAttribute::pushButtonText(const QString& keyword) const
{
if (showPushButtonForFieldKeyword(keyword))
{
return m_fieldKeywordAndPushButtonText.at(keyword);
}
return "";
}
} //End of namespace caf } //End of namespace caf

View File

@ -38,6 +38,7 @@
#pragma once #pragma once
#include "cafNotificationCenter.h" #include "cafNotificationCenter.h"
#include "cafPdmUiFieldEditorHandle.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include <QModelIndex> #include <QModelIndex>
@ -53,6 +54,21 @@ class PdmObjectHandle;
class PdmUiTableViewEditor; class PdmUiTableViewEditor;
class PdmChildArrayFieldHandle; class PdmChildArrayFieldHandle;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class PdmUiTableViewEditorAttribute : public PdmUiEditorAttribute
{
public:
void registerPushButtonTextForFieldKeyword(const QString& keyword, const QString& text);
bool showPushButtonForFieldKeyword(const QString& keyword) const;
QString pushButtonText(const QString& keyword) const;
private:
std::map<QString, QString> m_fieldKeywordAndPushButtonText;
};
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================

View File

@ -183,6 +183,8 @@ void PdmUiTableViewEditor::configureAndUpdateUi(const QString& uiConfigName)
QString text = ""; QString text = "";
m_tableHeadingIcon->setPixmap(m_pdmListField->uiCapability()->uiIcon(uiConfigName).pixmap(16, 16)); m_tableHeadingIcon->setPixmap(m_pdmListField->uiCapability()->uiIcon(uiConfigName).pixmap(16, 16));
m_tableHeading->setText(m_pdmListField->uiCapability()->uiName(uiConfigName) + QString(" (%1)").arg(m_pdmListField->size())); m_tableHeading->setText(m_pdmListField->uiCapability()->uiName(uiConfigName) + QString(" (%1)").arg(m_pdmListField->size()));
m_tableModelPdm->createPersistentPushButtonWidgets(m_tableView);
} }
else else
{ {

View File

@ -85,6 +85,8 @@ public:
QTableView* tableView(); QTableView* tableView();
void handleModelSelectionChange(); void handleModelSelectionChange();
void updatePersistentEditors() const;
protected: protected:
virtual void configureAndUpdateUi(const QString& uiConfigName); virtual void configureAndUpdateUi(const QString& uiConfigName);

View File

@ -45,8 +45,13 @@
#include "cafPdmUiFieldEditorHelper.h" #include "cafPdmUiFieldEditorHelper.h"
#include "cafPdmUiLineEditor.h" #include "cafPdmUiLineEditor.h"
#include "cafPdmUiTableItemEditor.h" #include "cafPdmUiTableItemEditor.h"
#include "cafPdmUiTableView.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include <QTableView>
namespace caf namespace caf
{ {
@ -328,31 +333,20 @@ void PdmUiTableViewModel::setPdmData(PdmChildArrayFieldHandle* listField, const
m_pdmList = listField; m_pdmList = listField;
m_currentConfigName = configName; m_currentConfigName = configName;
PdmUiOrdering configForFirstRow; PdmUiOrdering configForFirstObject;
if (m_pdmList) if (m_pdmList && m_pdmList->size() > 0)
{ {
PdmUiOrdering dummy; PdmObjectHandle* pdmObjHandle = m_pdmList->at(0);
PdmUiObjectHandle* uiObject = pdmObjHandle->uiCapability();
for (size_t i = 0; i < listField->size(); i++) if (uiObject)
{ {
PdmObjectHandle* pdmObjHandle = m_pdmList->at(i); uiObject->uiOrdering(configName, configForFirstObject);
PdmUiObjectHandle* uiObject = uiObj(pdmObjHandle); uiObject->objectEditorAttribute(m_currentConfigName, &m_attributes);
if (uiObject)
{
if (i == 0)
{
uiObject->uiOrdering(configName, configForFirstRow);
}
else
{
uiObject->uiOrdering(configName, dummy);
}
}
} }
} }
const std::vector<PdmUiItem*>& uiItems = configForFirstRow.uiItems(); const std::vector<PdmUiItem*>& uiItems = configForFirstObject.uiItems();
// Set all fieldViews to be unvisited // Set all fieldViews to be unvisited
std::map<QString, PdmUiFieldEditorHandle*>::iterator it; std::map<QString, PdmUiFieldEditorHandle*>::iterator it;
@ -558,9 +552,15 @@ PdmObjectHandle* PdmUiTableViewModel::pdmObjectForRow(int row) const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool PdmUiTableViewModel::isRepresentingBoolean(const QModelIndex &index) const bool PdmUiTableViewModel::isRepresentingBoolean(const QModelIndex &index) const
{ {
if (getField(index)) PdmFieldHandle* fieldHandle = getField(index);
if (fieldHandle)
{ {
QVariant val = getField(index)->uiCapability()->uiValue(); if (m_attributes.showPushButtonForFieldKeyword(fieldHandle->keyword()))
{
return false;
}
QVariant val = fieldHandle->uiCapability()->uiValue();
if (val.type() == QVariant::Bool) if (val.type() == QVariant::Bool)
{ {
return true; return true;
@ -570,6 +570,30 @@ bool PdmUiTableViewModel::isRepresentingBoolean(const QModelIndex &index) const
return false; return false;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiTableViewModel::createPersistentPushButtonWidgets(QTableView* tableView)
{
if (rowCount() > 0)
{
for (int col = 0; col < columnCount(); col++)
{
PdmFieldHandle* fieldHandle = getField(createIndex(0, col));
if (m_attributes.showPushButtonForFieldKeyword(fieldHandle->keyword()))
{
for (int row = 0; row < rowCount(); row++)
{
QModelIndex mi = createIndex(row, col);
tableView->setIndexWidget(mi, new TableViewPushButton(getField(mi)->uiCapability(), m_attributes.pushButtonText(fieldHandle->keyword())));
tableView->openPersistentEditor(mi);
}
}
}
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -618,4 +642,30 @@ int PdmUiTableViewModel::getFieldIndex(PdmFieldHandle* field) const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TableViewPushButton::TableViewPushButton(caf::PdmUiFieldHandle* field, const QString& text, QWidget* parent /*= 0*/)
: QPushButton(text, parent),
m_fieldHandle(field)
{
connect(this, SIGNAL(pressed()), SLOT(slotPressed()));
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void TableViewPushButton::slotPressed()
{
if (m_fieldHandle)
{
QVariant val = m_fieldHandle->uiValue();
if (val.type() == QVariant::Bool)
{
bool currentValue = val.toBool();
caf::PdmUiCommandSystemProxy::instance()->setUiValueToField(m_fieldHandle, !currentValue);
}
}
}
} // end namespace caf } // end namespace caf

View File

@ -38,8 +38,12 @@
#include "cafPdmUiTreeOrdering.h" #include "cafPdmUiTreeOrdering.h"
#include "cafPdmUiFieldHandle.h"
#include "cafPdmUiTableView.h"
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QItemSelection> #include <QItemSelection>
#include <QPushButton>
namespace caf namespace caf
{ {
@ -52,6 +56,21 @@ class PdmUiTableItemEditor;
class PdmUiTreeOrdering; class PdmUiTreeOrdering;
class PdmUiTreeViewEditor; class PdmUiTreeViewEditor;
class TableViewPushButton : public QPushButton
{
Q_OBJECT
public:
explicit TableViewPushButton(caf::PdmUiFieldHandle* field, const QString& text, QWidget* parent = 0);
private slots:
void slotPressed();
private:
caf::PdmUiFieldHandle* m_fieldHandle;
};
//================================================================================================== //==================================================================================================
// //
// //
@ -80,12 +99,12 @@ public:
virtual Qt::ItemFlags flags(const QModelIndex &index) const; virtual Qt::ItemFlags flags(const QModelIndex &index) const;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
void selectedUiItems(std::vector<PdmUiItem*>& objects);
void notifyDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); void notifyDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight);
bool isRepresentingBoolean(const QModelIndex &index) const; bool isRepresentingBoolean(const QModelIndex &index) const;
void createPersistentPushButtonWidgets(QTableView* tableView);
private: private:
int getFieldIndex(PdmFieldHandle* field) const; int getFieldIndex(PdmFieldHandle* field) const;
void recreateTableItemEditors(); void recreateTableItemEditors();
@ -102,6 +121,8 @@ private:
std::vector<int> m_modelColumnIndexToFieldIndex; std::vector<int> m_modelColumnIndexToFieldIndex;
std::vector<PdmUiTableItemEditor*> m_tableItemEditors; std::vector<PdmUiTableItemEditor*> m_tableItemEditors;
PdmUiTableViewEditorAttribute m_attributes;
}; };