#ifndef AUTOFORM_H #define AUTOFORM_H #include #include #include #include #include #include #include #include "iform.h" #include "service.h" #include "ivalidator.h" template class AutoForm : public IForm { public: explicit AutoForm(QWidget *parent = 0) : IForm(parent) { m_newRec = false; } virtual ~AutoForm() { foreach (IValidator *val, m_validators) { delete val; } m_validators.clear(); } void setEntity(QSharedPointer entity) { m_entity = entity; bindToUi(); } QSharedPointer entity() { return m_entity; } void setNewRec(bool isNew) { m_newRec = isNew; } void registerBinding(QWidget *widget) { if (!m_bindWidgets.contains(widget)) { m_bindWidgets.append(widget); } } void registerValidator(IValidator *validator) { m_validators.append(validator); } protected: virtual void bindOtherToUi() {} virtual bool bindOtherToData() { return true; } private: QSharedPointer m_entity; QList m_bindWidgets; QList m_validators; bool m_newRec; void bindToUi() { foreach (QWidget *widget, m_bindWidgets) { const char* prop = widget->metaObject()->userProperty().name(); widget->setProperty(prop, ((QObject*)m_entity.data())->property(widget->objectName().toStdString().c_str())); } bindOtherToUi(); } bool bindToData() { foreach (IValidator *val, m_validators) { if (!val->validate()) { emit validationError(val->errMessage()); return false; } } foreach (QWidget *widget, m_bindWidgets) { const char* prop = widget->metaObject()->userProperty().name(); ((QObject*)m_entity.data())->setProperty(widget->objectName().toStdString().c_str(), widget->property(prop)); } return bindOtherToData(); } public slots: bool saveRecord() { if (!bindToData()) { return false; } if (m_newRec) { emit recordAdded(); } else { emit recordUpdated(); } return true; } }; #endif // AUTOFORM_H