diff --git a/accommodation/accommodation.pro b/accommodation/accommodation.pro index edfc4da..8634a1f 100644 --- a/accommodation/accommodation.pro +++ b/accommodation/accommodation.pro @@ -17,7 +17,8 @@ SOURCES += accommodation.cpp \ accommodationservice.cpp \ tablemodel.cpp \ acform.cpp \ - accgrid.cpp + accgrid.cpp \ + data/address.cpp HEADERS += accommodation.h\ accommodation_global.h \ @@ -25,7 +26,9 @@ HEADERS += accommodation.h\ accommodationservice.h \ tablemodel.h \ acform.h \ - accgrid.h + accgrid.h \ + data/address.h \ + data/accommodation-data.h unix { target.path = /usr/lib @@ -53,7 +56,7 @@ OTHER_FILES += \ FORMS += \ acform.ui -ODB_FILES = accommodation/data/person.h +ODB_FILES = accommodation/data/accommodation-data.h H_DIR = $$PWD/data/*.h include(../odb.pri) diff --git a/accommodation/acform.cpp b/accommodation/acform.cpp index e412f6c..1a8aaff 100644 --- a/accommodation/acform.cpp +++ b/accommodation/acform.cpp @@ -1,5 +1,8 @@ #include "acform.h" #include "ui_acform.h" +#include + +#include "accommodation-odb.hxx" AcForm::AcForm(QWidget *parent) : AutoForm(parent), @@ -15,3 +18,14 @@ AcForm::~AcForm() { delete ui; } + +void AcForm::registerCombos() +{ + QList cbData; + Service
srv; + foreach (QSharedPointer
adr, srv.all()) { + cbData.append(ComboData(adr)); + } + + registerBinding(ui->address, cbData); +} diff --git a/accommodation/acform.h b/accommodation/acform.h index 441c767..6c49933 100644 --- a/accommodation/acform.h +++ b/accommodation/acform.h @@ -20,6 +20,10 @@ public: private: Ui::AcForm *ui; + + // AutoForm interface +protected: + virtual void registerCombos(); }; #endif // ACFORM_H diff --git a/accommodation/acform.ui b/accommodation/acform.ui index 5e7aabe..f1b3c3d 100644 --- a/accommodation/acform.ui +++ b/accommodation/acform.ui @@ -46,6 +46,16 @@ PushButton + + + + 110 + 170 + 191 + 22 + + + diff --git a/accommodation/data/accommodation-data.h b/accommodation/data/accommodation-data.h new file mode 100644 index 0000000..bf6ad45 --- /dev/null +++ b/accommodation/data/accommodation-data.h @@ -0,0 +1,8 @@ +#ifndef ACCOMMODATIONDATA_H +#define ACCOMMODATIONDATA_H + +#include "address.h" +#include "person.h" + +#endif // ACCOMMODATIONDATA_H + diff --git a/accommodation/data/address.cpp b/accommodation/data/address.cpp new file mode 100644 index 0000000..ba7cb5b --- /dev/null +++ b/accommodation/data/address.cpp @@ -0,0 +1,58 @@ +#include "address.h" + +Address::Address(QObject *parent) : ComboItem(parent) +{ + +} + +Address::~Address() +{ + +} +QString Address::city() const +{ + return m_city; +} + +void Address::setCity(const QString &city) +{ + m_city = city; +} +QString Address::street() const +{ + return m_street; +} + +void Address::setStreet(const QString &street) +{ + m_street = street; +} +QString Address::houseNumber() const +{ + return m_houseNumber; +} + +void Address::setHouseNumber(const QString &houseNumber) +{ + m_houseNumber = houseNumber; +} +int Address::id() const +{ + return m_id; +} + +void Address::setId(int id) +{ + m_id = id; +} + +bool Address::eq(ComboItem *other) +{ + Address *addr = qobject_cast(other); + return addr != NULL && m_id == addr->id(); +} + +QString Address::toString() +{ + return m_street + ", " + m_houseNumber + ", " + m_city; +} diff --git a/accommodation/data/address.h b/accommodation/data/address.h new file mode 100644 index 0000000..c81bbfd --- /dev/null +++ b/accommodation/data/address.h @@ -0,0 +1,55 @@ +#ifndef ADDRESS_H +#define ADDRESS_H + +#include +#include + +#include + +#include + +#pragma db object +class Address : public ComboItem +{ + Q_OBJECT + + Q_PROPERTY(QString city READ city WRITE setCity) + Q_PROPERTY(QString street READ street WRITE setStreet) + Q_PROPERTY(QString houseNumber READ houseNumber WRITE setHouseNumber) + +public: + explicit Address(QObject *parent = 0); + ~Address(); + + QString city() const; + void setCity(const QString &city); + + QString street() const; + void setStreet(const QString &street); + + QString houseNumber() const; + void setHouseNumber(const QString &houseNumber); + + int id() const; + void setId(int id); + +private: + friend class odb::access; + +#pragma db id auto + int m_id; + QString m_city; + QString m_street; + QString m_houseNumber; + +signals: + +public slots: + + // ComboItem interface +public: + virtual bool eq(ComboItem *other); + virtual QString toString(); +}; + +#endif // ADDRESS_H diff --git a/accommodation/data/person.cpp b/accommodation/data/person.cpp index e4304b7..8457486 100644 --- a/accommodation/data/person.cpp +++ b/accommodation/data/person.cpp @@ -1,3 +1,4 @@ +#include #include "person.h" Person::Person() @@ -30,6 +31,19 @@ void Person::setLastName(const QString &value) { lastName = value; } +QSharedPointer Person::address() const +{ + return m_address; +} + +void Person::setAddress(const QSharedPointer &address) +{ + if (qobject_cast(address.data()) != NULL) + { + m_address = qSharedPointerDynamicCast(address); + } +} + diff --git a/accommodation/data/person.h b/accommodation/data/person.h index 015b2f7..46d8f86 100644 --- a/accommodation/data/person.h +++ b/accommodation/data/person.h @@ -4,6 +4,8 @@ #include #include +#include "address.h" + #include #pragma db object @@ -13,6 +15,7 @@ class Person : public QObject Q_PROPERTY(QString firstName READ getFirstName WRITE setFirstName) Q_PROPERTY(QString lastName READ getLastName WRITE setLastName) + Q_PROPERTY(QSharedPointer address READ address WRITE setAddress) public: Person(); @@ -25,12 +28,16 @@ public: QString getLastName() const; void setLastName(const QString &value); + QSharedPointer address() const; + void setAddress(const QSharedPointer &address); + private: friend class odb::access; #pragma db id auto int id; QString firstName; QString lastName; + QSharedPointer
m_address; }; diff --git a/core/autoform.h b/core/autoform.h index cc86616..f2a8b35 100644 --- a/core/autoform.h +++ b/core/autoform.h @@ -60,6 +60,7 @@ public: protected: virtual void bindOtherToUi() {} virtual bool bindOtherToData() { return true; } + virtual void registerCombos() {} private: QSharedPointer m_entity; @@ -69,6 +70,7 @@ private: bool m_newRec; void bindToUi() { + registerCombos(); 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())); diff --git a/core/autotablemodel.h b/core/autotablemodel.h index 307319f..196b935 100644 --- a/core/autotablemodel.h +++ b/core/autotablemodel.h @@ -10,6 +10,7 @@ #include "core_global.h" #include "exprevaluator.h" #include "itablemodel.h" +#include "data/comboitem.h" template class AutoTableModel : public ITableModel @@ -51,7 +52,13 @@ public: QSharedPointer entity = m_list.at(index.row()); QObject *rawEntity = (QObject*)entity.data(); - return rawEntity->property(rawEntity->metaObject()->property(index.column() + 1).name()); + QVariant dispData = rawEntity->property(rawEntity->metaObject()->property(index.column() + 1).name()); + if (dispData.canConvert() && qobject_cast(dispData.value())) + { + return qobject_cast(dispData.value())->toString(); + } + + return dispData; } return QVariant::Invalid; diff --git a/odb.pri b/odb.pri index 237db9a..43ad744 100644 --- a/odb.pri +++ b/odb.pri @@ -42,6 +42,7 @@ DEFINES += DATABASE_SQLITE # ODB_FLAGS += -I $$[QT_INSTALL_HEADERS] ODB_FLAGS += -I $$[QT_INSTALL_HEADERS]/QtCore +ODB_FLAGS += -I $$PWD/core ODB_FLAGS += -D __PIC__ win32 {