void PropertyModel::buildUp(const std::map<std::string, std::vector<App::Property*> >& props) { // fill up the listview with the properties rootItem->reset(); // sort the properties into their groups std::map<std::string, std::vector<std::vector<App::Property*> > > propGroup; std::map<std::string, std::vector<App::Property*> > ::const_iterator jt; for (jt = props.begin(); jt != props.end(); ++jt) { App::Property* prop = jt->second.front(); const char* group = prop->getGroup(); std::string grp = group ? group : "Base"; propGroup[grp].push_back(jt->second); } std::map<std::string, std::vector<std::vector<App::Property*> > > ::const_iterator kt; for (kt = propGroup.begin(); kt != propGroup.end(); ++kt) { // set group item PropertyItem* group = static_cast<PropertyItem*>(PropertySeparatorItem::create()); group->setParent(rootItem); rootItem->appendChild(group); group->setPropertyName(QString::fromAscii(kt->first.c_str())); // setup the items for the properties std::vector<std::vector<App::Property*> >::const_iterator it; for (it = kt->second.begin(); it != kt->second.end(); ++it) { App::Property* prop = it->front(); QString editor = QString::fromAscii(prop->getEditorName()); if (!editor.isEmpty()) { Base::BaseClass* item = 0; try { item = static_cast<Base::BaseClass*>(Base::Type:: createInstanceByName(prop->getEditorName(),true)); } catch (...) { } if (!item) { qWarning("No property item for type %s found\n", prop->getEditorName()); continue; } if (item->getTypeId().isDerivedFrom(PropertyItem::getClassTypeId())) { PropertyItem* child = (PropertyItem*)item; child->setParent(rootItem); rootItem->appendChild(child); child->setPropertyName(QString::fromAscii(prop->getName())); child->setPropertyData(*it); } } } } reset(); }
void PropertyEditor::appendProperty(const App::Property& prop) { // check if the parent object is selected std::string editor = prop.getEditorName(); if (editor.empty()) return; App::PropertyContainer* parent = prop.getContainer(); std::string context = prop.getName(); bool canAddProperty = (!propList.empty()); for (PropertyModel::PropertyList::iterator it = propList.begin(); it != propList.end(); ++it) { if (it->second.empty() || it->second.size() > 1) { canAddProperty = false; break; } else if (it->second.front()->getContainer() != parent) { canAddProperty = false; break; } } if (canAddProperty) { std::vector<App::Property*> list; list.push_back(const_cast<App::Property*>(&prop)); std::pair< std::string, std::vector<App::Property*> > pair = std::make_pair(context, list); propList.push_back(pair); propertyModel->appendProperty(prop); } }
void PropertyEditor::updatetEditorMode(const App::Property& prop) { // check if the parent object is selected std::string editor = prop.getEditorName(); if (editor.empty()) return; bool hidden = prop.testStatus(App::Property::Hidden); bool readOnly = prop.testStatus(App::Property::ReadOnly); int column = 1; int numRows = propertyModel->rowCount(); for (int i=0; i<numRows; i++) { QModelIndex item = propertyModel->index(i, column); PropertyItem* propItem = static_cast<PropertyItem*>(item.internalPointer()); if (propItem && propItem->hasProperty(&prop)) { setRowHidden (i, QModelIndex(), hidden); propItem->updateData(); if (item.isValid()) { updateItemEditor(!readOnly, column, item); dataChanged(item, item); } break; } } }