//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void PdmUiTableViewModel::setPdmData(PdmChildArrayFieldHandle* listField, const QString& configName) { beginResetModel(); m_pdmList = listField; m_currentConfigName = configName; PdmUiOrdering config; if (m_pdmList && m_pdmList->size() > 0) { PdmObjectHandle* firstObject = m_pdmList->at(0); PdmUiObjectHandle* uiObject = uiObj(firstObject); if (uiObject) { uiObject->uiOrdering(configName, config); } } const std::vector<PdmUiItem*>& uiItems = config.uiItems(); // Set all fieldViews to be unvisited std::map<QString, PdmUiFieldEditorHandle*>::iterator it; for (it = m_fieldEditors.begin(); it != m_fieldEditors.end(); ++it) { it->second->setField(NULL); } m_modelColumnIndexToFieldIndex.clear(); for (size_t i = 0; i < uiItems.size(); ++i) { if (uiItems[i]->isUiHidden(configName)) continue; if (uiItems[i]->isUiGroup()) continue; { PdmUiFieldHandle* field = dynamic_cast<PdmUiFieldHandle*>(uiItems[i]); PdmUiFieldEditorHandle* fieldEditor = NULL; // Find or create FieldEditor std::map<QString, PdmUiFieldEditorHandle*>::iterator it; it = m_fieldEditors.find(field->fieldHandle()->keyword()); if (it == m_fieldEditors.end()) { // If editor type is specified, find in factory if ( !uiItems[i]->uiEditorTypeName(configName).isEmpty() ) { fieldEditor = Factory<PdmUiFieldEditorHandle, QString>::instance()->create(field->uiEditorTypeName(configName)); } else { // Find the default field editor QString editorTypeName = qStringTypeName(*(field->fieldHandle())); // Handle a single value field with valueOptions: Make a combobox if (field->uiValue().type() != QVariant::List) { bool useOptionsOnly = true; QList<PdmOptionItemInfo> options = field->valueOptions( &useOptionsOnly); if (!options.empty()) { editorTypeName = PdmUiComboBoxEditor::uiEditorTypeName(); } } fieldEditor = Factory<PdmUiFieldEditorHandle, QString>::instance()->create(editorTypeName); } if (fieldEditor) { m_fieldEditors[field->fieldHandle()->keyword()] = fieldEditor; } } else { fieldEditor = it->second; } if (fieldEditor) { fieldEditor->setField(field); //TODO: Create/update is not required at this point, as UI is recreated in getEditorWidgetAndTransferOwnership() // Can be moved, but a move will require changes in PdmUiFieldEditorHandle fieldEditor->createWidgets(NULL); fieldEditor->updateUi(configName); int fieldIndex = getFieldIndex(field->fieldHandle()); m_modelColumnIndexToFieldIndex.push_back(fieldIndex); } } } // Remove all fieldViews not mentioned by the configuration from the layout std::vector< QString > fvhToRemoveFromMap; for (it = m_fieldEditors.begin(); it != m_fieldEditors.end(); ++it) { if (it->second->field() == 0) { PdmUiFieldEditorHandle* fvh = it->second; delete fvh; fvhToRemoveFromMap.push_back(it->first); } } for (size_t i = 0; i < fvhToRemoveFromMap.size(); ++i) { m_fieldEditors.erase(fvhToRemoveFromMap[i]); } recreateTableItemEditors(); endResetModel(); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QVariant PdmUiTableViewModel::data(const QModelIndex &index, int role /*= Qt::DisplayRole */) const { if (role == Qt::DisplayRole || role == Qt::EditRole) { PdmFieldHandle* fieldHandle = getField(index); PdmUiFieldHandle* uiFieldHandle = fieldHandle->uiCapability(); if (uiFieldHandle) { bool fromMenuOnly = false; QList<PdmOptionItemInfo> valueOptions = uiFieldHandle->valueOptions(&fromMenuOnly); if (!valueOptions.isEmpty()) { int listIndex = uiFieldHandle->uiValue().toInt(); if (listIndex == -1) { return ""; } return valueOptions[listIndex].optionUiText; } QVariant val; PdmObjectHandle* objForRow = this->pdmObjectForRow(index.row()); PdmUiObjectHandle* uiObjForRow = uiObj(objForRow); if (uiObjForRow) { // NOTE: Redesign // To be able to get formatted string, an editor attribute concept is used // TODO: Create a function in pdmObject like this // virtual void defineDisplayString(const PdmFieldHandle* field, QString uiConfigName) {} PdmUiLineEditorAttributeUiDisplayString leab; uiObjForRow->editorAttribute(fieldHandle, m_currentConfigName, &leab); if (!leab.m_displayString.isEmpty()) { val = leab.m_displayString; } else { val = uiFieldHandle->uiValue(); } } else { val = uiFieldHandle->uiValue(); } return val; } else { assert(false); } } else if (role == Qt::CheckStateRole) { if (isRepresentingBoolean(index)) { PdmUiFieldHandle* uiFieldHandle = getField(index)->uiCapability(); if (uiFieldHandle) { QVariant val = uiFieldHandle->uiValue(); bool isToggledOn = val.toBool(); if (isToggledOn) { return Qt::Checked; } else { return Qt::Unchecked; } } else { return QVariant(); } } } return QVariant(); }