Added support for settings
							parent
							
								
									2bb07716b9
								
							
						
					
					
						commit
						e569dfbc12
					
				| @ -0,0 +1,31 @@ | ||||
| #include "system.h" | ||||
| 
 | ||||
| System::System() | ||||
| { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| int System::id() const | ||||
| { | ||||
|     return m_id; | ||||
| } | ||||
| 
 | ||||
| void System::setId(int id) | ||||
| { | ||||
|     m_id = id; | ||||
| } | ||||
| 
 | ||||
| QString System::pluginId() const | ||||
| { | ||||
|     return m_pluginId; | ||||
| } | ||||
| 
 | ||||
| QString System::settings() const | ||||
| { | ||||
|     return m_settings; | ||||
| } | ||||
| 
 | ||||
| void System::setSettings(const QString &settings) | ||||
| { | ||||
|     m_settings = settings; | ||||
| } | ||||
| @ -0,0 +1,34 @@ | ||||
| #ifndef SYSTEM_H | ||||
| #define SYSTEM_H | ||||
| 
 | ||||
| #include <QString> | ||||
| 
 | ||||
| #include <odb/core.hxx> | ||||
| 
 | ||||
| #pragma db object | ||||
| class System | ||||
| { | ||||
| public: | ||||
|     System(); | ||||
| 
 | ||||
|     int id() const; | ||||
|     void setId(int id); | ||||
| 
 | ||||
|     QString pluginId() const; | ||||
| 
 | ||||
|     QString schemaVersion() const; | ||||
| 
 | ||||
|     QString settings() const; | ||||
|     void setSettings(const QString &settings); | ||||
| 
 | ||||
| private: | ||||
|     friend class odb::access; | ||||
| 
 | ||||
| #pragma db id auto | ||||
|     int m_id; | ||||
|     QString m_pluginId; | ||||
|     QString m_schemaVersion; | ||||
|     QString m_settings; | ||||
| }; | ||||
| 
 | ||||
| #endif // SYSTEM_H
 | ||||
| @ -0,0 +1,136 @@ | ||||
| #ifndef FORMBINDER_H | ||||
| #define FORMBINDER_H | ||||
| 
 | ||||
| #include <QSharedPointer> | ||||
| #include <QComboBox> | ||||
| #include <QWidget> | ||||
| #include <QMetaMethod> | ||||
| #include <QMetaProperty> | ||||
| #include <QVariant> | ||||
| 
 | ||||
| #include "combodata.h" | ||||
| #include "ivalidator.h" | ||||
| #include "iform.h" | ||||
| 
 | ||||
| #include "../qdecimal/src/QDecDouble.hh" | ||||
| 
 | ||||
| template<class T> | ||||
| class FormBinder : public IForm | ||||
| { | ||||
| public: | ||||
| 
 | ||||
|     explicit FormBinder(QWidget *parent = NULL) : IForm(parent) {} | ||||
| 
 | ||||
|     virtual ~FormBinder() { | ||||
|         foreach (IValidator *val, m_validators) { | ||||
|             delete val; | ||||
|         } | ||||
|         m_validators.clear(); | ||||
|     } | ||||
| 
 | ||||
|     void registerBinding(QWidget *widget) { | ||||
|         if (!m_bindWidgets.contains(widget)) { | ||||
|             m_bindWidgets.append(widget); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     void registerBinding(QComboBox *combo, const QList<ComboData> &values) { | ||||
|         m_bindCombos[combo] = values; | ||||
|     } | ||||
| 
 | ||||
|     void registerValidator(IValidator *validator) { | ||||
|         m_validators.append(validator); | ||||
|     } | ||||
| 
 | ||||
|     void setEntity(QSharedPointer<T> entity) { | ||||
|         m_entity = entity; | ||||
|         bindToUi(); | ||||
|     } | ||||
| 
 | ||||
|     QSharedPointer<T> entity() { | ||||
|         return m_entity; | ||||
|     } | ||||
| 
 | ||||
| protected: | ||||
|     QSharedPointer<T> m_entity; | ||||
| 
 | ||||
|     virtual void bindOtherToUi() {} | ||||
|     virtual bool bindOtherToData() { return true; } | ||||
|     virtual void registerCombos() {} | ||||
| 
 | ||||
|     void bindToUi() { | ||||
|         registerCombos(); | ||||
|         foreach (QWidget *widget, m_bindWidgets) { | ||||
|             const char* prop = widget->metaObject()->userProperty().name(); | ||||
|             QVariant value = ((QObject*)m_entity.data())->property(widget->objectName().toStdString().c_str()); | ||||
|             if (value.canConvert<QDecDouble>()) | ||||
|             { | ||||
|                 widget->setProperty(prop, value.value<QDecDouble>().toString()); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 widget->setProperty(prop, value); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         foreach (QComboBox *combo, m_bindCombos.keys()) { | ||||
|             int idx = 0; | ||||
|             QVariant field = ((QObject*)m_entity.data())->property(combo->objectName().toStdString().c_str()); | ||||
| 
 | ||||
|             combo->clear(); | ||||
|             for (int i = 0; i < m_bindCombos[combo].size(); i++) { | ||||
|                 ComboData data = m_bindCombos[combo][i]; | ||||
|                 combo->addItem(data.label(), data.index()); | ||||
| 
 | ||||
|                 if (data.index().canConvert<QObject*>()) { | ||||
|                     ComboItem* ci = qobject_cast<ComboItem*>(data.index().value<QObject*>()); | ||||
|                     ComboItem* ciField = qobject_cast<ComboItem*>(field.value<QObject*>()); | ||||
|                     if (ci->eq(ciField)) { | ||||
|                         idx = i; | ||||
|                     } | ||||
|                 } | ||||
|                 else if (field == data.index()) { | ||||
|                     idx = i; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             combo->setCurrentIndex(idx); | ||||
|         } | ||||
| 
 | ||||
|         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(); | ||||
| 
 | ||||
|             QVariant val = widget->property(prop); | ||||
|             if (((QObject*)m_entity.data())->property(widget->objectName().toStdString().c_str()).canConvert<QDecDouble>()) | ||||
|             { | ||||
|                 QDecDouble dec(val.toDouble()); | ||||
|                 val = QVariant::fromValue(dec); | ||||
|             } | ||||
|             ((QObject*)m_entity.data())->setProperty(widget->objectName().toStdString().c_str(), val); | ||||
|         } | ||||
| 
 | ||||
|         foreach (QComboBox *combo, m_bindCombos.keys()) { | ||||
|             ((QObject*)m_entity.data())->setProperty(combo->objectName().toStdString().c_str(), combo->currentData()); | ||||
|         } | ||||
| 
 | ||||
|         return bindOtherToData(); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     QList<QWidget*> m_bindWidgets; | ||||
|     QHash<QComboBox*, QList<ComboData> > m_bindCombos; | ||||
|     QList<IValidator*> m_validators; | ||||
| }; | ||||
| 
 | ||||
| #endif // FORMBINDER_H
 | ||||
| @ -0,0 +1,96 @@ | ||||
| #include "globalsettings.h" | ||||
| 
 | ||||
| GlobalSettings::GlobalSettings(QObject *parent) : QObject(parent) | ||||
| { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::firmName() const | ||||
| { | ||||
|     return m_firmName; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setFirmName(const QString &firmName) | ||||
| { | ||||
|     m_firmName = firmName; | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::street() const | ||||
| { | ||||
|     return m_street; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setStreet(const QString &street) | ||||
| { | ||||
|     m_street = street; | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::houseNumber() const | ||||
| { | ||||
|     return m_houseNumber; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setHouseNumber(const QString &houseNumber) | ||||
| { | ||||
|     m_houseNumber = houseNumber; | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::zipCode() const | ||||
| { | ||||
|     return m_zipCode; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setZipCode(const QString &zipCode) | ||||
| { | ||||
|     m_zipCode = zipCode; | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::city() const | ||||
| { | ||||
|     return m_city; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setCity(const QString &city) | ||||
| { | ||||
|     m_city = city; | ||||
| } | ||||
| 
 | ||||
| int GlobalSettings::ic() const | ||||
| { | ||||
|     return m_ic; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setIc(int IC) | ||||
| { | ||||
|     m_ic = IC; | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::dic() const | ||||
| { | ||||
|     return m_dic; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setDic(const QString &dic) | ||||
| { | ||||
|     m_dic = dic; | ||||
| } | ||||
| 
 | ||||
| bool GlobalSettings::vatPayer() const | ||||
| { | ||||
|     return m_vatPayer; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setVatPayer(bool vatPayer) | ||||
| { | ||||
|     m_vatPayer = vatPayer; | ||||
| } | ||||
| 
 | ||||
| QString GlobalSettings::logoPath() const | ||||
| { | ||||
|     return m_logoPath; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettings::setLogoPath(const QString &logoPath) | ||||
| { | ||||
|     m_logoPath = logoPath; | ||||
| } | ||||
| @ -0,0 +1,66 @@ | ||||
| #ifndef GLOBALSETTINGS_H | ||||
| #define GLOBALSETTINGS_H | ||||
| 
 | ||||
| #include <QObject> | ||||
| #include <QString> | ||||
| 
 | ||||
| class GlobalSettings : public QObject | ||||
| { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
|     Q_PROPERTY(QString firmName READ firmName WRITE setFirmName) | ||||
|     Q_PROPERTY(QString street READ street WRITE setStreet) | ||||
|     Q_PROPERTY(QString houseNumber READ houseNumber WRITE setHouseNumber) | ||||
|     Q_PROPERTY(QString zipCode READ zipCode WRITE setZipCode) | ||||
|     Q_PROPERTY(QString city READ city WRITE setCity) | ||||
|     Q_PROPERTY(int ic READ ic WRITE setIc) | ||||
|     Q_PROPERTY(QString dic READ dic WRITE setDic) | ||||
|     Q_PROPERTY(bool vatPayer READ vatPayer WRITE setVatPayer) | ||||
|     Q_PROPERTY(QString logoPath READ logoPath WRITE setLogoPath) | ||||
| public: | ||||
|     explicit GlobalSettings(QObject *parent = 0); | ||||
| 
 | ||||
|     QString firmName() const; | ||||
|     void setFirmName(const QString &firmName); | ||||
| 
 | ||||
|     QString street() const; | ||||
|     void setStreet(const QString &street); | ||||
| 
 | ||||
|     QString houseNumber() const; | ||||
|     void setHouseNumber(const QString &houseNumber); | ||||
| 
 | ||||
|     QString zipCode() const; | ||||
|     void setZipCode(const QString &zipCode); | ||||
| 
 | ||||
|     QString city() const; | ||||
|     void setCity(const QString &city); | ||||
| 
 | ||||
|     int ic() const; | ||||
|     void setIc(int ic); | ||||
| 
 | ||||
|     QString dic() const; | ||||
|     void setDic(const QString &dic); | ||||
| 
 | ||||
|     bool vatPayer() const; | ||||
|     void setVatPayer(bool vatPayer); | ||||
| 
 | ||||
|     QString logoPath() const; | ||||
|     void setLogoPath(const QString &logoPath); | ||||
| 
 | ||||
| private: | ||||
|     QString m_firmName; | ||||
|     QString m_street; | ||||
|     QString m_houseNumber; | ||||
|     QString m_zipCode; | ||||
|     QString m_city; | ||||
|     int m_ic; | ||||
|     QString m_dic; | ||||
|     bool m_vatPayer; | ||||
|     QString m_logoPath; | ||||
| 
 | ||||
| signals: | ||||
| 
 | ||||
| public slots: | ||||
| }; | ||||
| 
 | ||||
| #endif // GLOBALSETTINGS_H
 | ||||
| @ -0,0 +1,42 @@ | ||||
| #include "globalsettingsform.h" | ||||
| #include "ui_globalsettingsform.h" | ||||
| 
 | ||||
| #include "globalsettings.h" | ||||
| #include "../settingsservice.h" | ||||
| 
 | ||||
| GlobalSettingsForm::GlobalSettingsForm(QWidget *parent) : | ||||
|     FormBinder<GlobalSettings>(parent), | ||||
|     ui(new Ui::GlobalSettingsForm) | ||||
| { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|     registerBinding(ui->firmName); | ||||
|     registerBinding(ui->street); | ||||
|     registerBinding(ui->houseNumber); | ||||
|     registerBinding(ui->zipCode); | ||||
|     registerBinding(ui->city); | ||||
|     registerBinding(ui->ic); | ||||
|     registerBinding(ui->vatPayer); | ||||
|     registerBinding(ui->dic); | ||||
| } | ||||
| 
 | ||||
| GlobalSettingsForm::~GlobalSettingsForm() | ||||
| { | ||||
|     delete ui; | ||||
| } | ||||
| 
 | ||||
| bool GlobalSettingsForm::saveRecord() | ||||
| { | ||||
|     bindToData(); | ||||
|     SettingsService srv("CORE"); | ||||
|     srv.saveSettings(entity()); | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void GlobalSettingsForm::loadEntity() | ||||
| { | ||||
|     SettingsService srv("CORE"); | ||||
|     QSharedPointer<GlobalSettings> settings = srv.loadSettings<GlobalSettings>(); | ||||
|     setEntity(settings); | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| #ifndef GLOBALSETTINGSFORM_H | ||||
| #define GLOBALSETTINGSFORM_H | ||||
| 
 | ||||
| #include <QWidget> | ||||
| #include "../formbinder.h" | ||||
| #include "globalsettings.h" | ||||
| 
 | ||||
| namespace Ui { | ||||
| class GlobalSettingsForm; | ||||
| } | ||||
| 
 | ||||
| class GlobalSettingsForm : public FormBinder<GlobalSettings> | ||||
| { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit GlobalSettingsForm(QWidget *parent = 0); | ||||
|     ~GlobalSettingsForm(); | ||||
| 
 | ||||
| private: | ||||
|     Ui::GlobalSettingsForm *ui; | ||||
| 
 | ||||
|     // IForm interface
 | ||||
| public slots: | ||||
|     bool saveRecord() override; | ||||
| 
 | ||||
|     // IForm interface
 | ||||
| public: | ||||
|     void loadEntity() override; | ||||
| }; | ||||
| 
 | ||||
| #endif // GLOBALSETTINGSFORM_H
 | ||||
| @ -0,0 +1,139 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>GlobalSettingsForm</class> | ||||
|  <widget class="QWidget" name="GlobalSettingsForm"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>422</width> | ||||
|     <height>323</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QGridLayout" name="gridLayout_2"> | ||||
|    <item row="1" column="0"> | ||||
|     <widget class="QGroupBox" name="groupBox_2"> | ||||
|      <property name="title"> | ||||
|       <string>Company info</string> | ||||
|      </property> | ||||
|      <layout class="QFormLayout" name="formLayout_2"> | ||||
|       <item row="0" column="0"> | ||||
|        <widget class="QLabel" name="label_6"> | ||||
|         <property name="text"> | ||||
|          <string>IC</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="1"> | ||||
|        <widget class="QLineEdit" name="ic"/> | ||||
|       </item> | ||||
|       <item row="1" column="0"> | ||||
|        <widget class="QLabel" name="label_7"> | ||||
|         <property name="text"> | ||||
|          <string>VAT number</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="1"> | ||||
|        <widget class="QLineEdit" name="dic"/> | ||||
|       </item> | ||||
|       <item row="2" column="0" colspan="2"> | ||||
|        <widget class="QCheckBox" name="vatPayer"> | ||||
|         <property name="text"> | ||||
|          <string>VAT payer</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item row="0" column="0"> | ||||
|     <widget class="QGroupBox" name="groupBox"> | ||||
|      <property name="title"> | ||||
|       <string>Contact</string> | ||||
|      </property> | ||||
|      <layout class="QFormLayout" name="formLayout"> | ||||
|       <item row="0" column="0"> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="text"> | ||||
|          <string>Firm Name</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="1"> | ||||
|        <widget class="QLineEdit" name="firmName"/> | ||||
|       </item> | ||||
|       <item row="1" column="0"> | ||||
|        <widget class="QLabel" name="label_2"> | ||||
|         <property name="text"> | ||||
|          <string>Street</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="1"> | ||||
|        <widget class="QLineEdit" name="street"/> | ||||
|       </item> | ||||
|       <item row="2" column="0"> | ||||
|        <widget class="QLabel" name="label_3"> | ||||
|         <property name="text"> | ||||
|          <string>House Number</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="1"> | ||||
|        <widget class="QLineEdit" name="houseNumber"/> | ||||
|       </item> | ||||
|       <item row="3" column="0"> | ||||
|        <widget class="QLabel" name="label_4"> | ||||
|         <property name="text"> | ||||
|          <string>City</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="3" column="1"> | ||||
|        <widget class="QLineEdit" name="city"/> | ||||
|       </item> | ||||
|       <item row="4" column="0"> | ||||
|        <widget class="QLabel" name="label_5"> | ||||
|         <property name="text"> | ||||
|          <string>ZIP code</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="1"> | ||||
|        <widget class="QLineEdit" name="zipCode"/> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item row="0" column="1"> | ||||
|     <widget class="QGroupBox" name="groupBox_3"> | ||||
|      <property name="title"> | ||||
|       <string>Logo</string> | ||||
|      </property> | ||||
|      <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_8"> | ||||
|         <property name="text"> | ||||
|          <string>Logo</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QPushButton" name="pushButton"> | ||||
|         <property name="text"> | ||||
|          <string>Select file</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
| @ -0,0 +1,56 @@ | ||||
| #include "settingsform.h" | ||||
| #include "ui_settingsform.h" | ||||
| 
 | ||||
| #include "settingsservice.h" | ||||
| #include "context.h" | ||||
| #include "iplugin.h" | ||||
| #include "iform.h" | ||||
| 
 | ||||
| SettingsForm::SettingsForm(QWidget *parent) : | ||||
|     QDialog(parent), | ||||
|     ui(new Ui::SettingsForm) | ||||
| { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|     foreach (IPlugin *plugin, Context::instance().plugins()) { | ||||
|         if (plugin->settingsUi() != NULL) | ||||
|         { | ||||
|             SettingsService srv(plugin->pluginId()); | ||||
|             IForm *tab = qobject_cast<IForm*>(plugin->settingsUi()); | ||||
| 
 | ||||
|             if (tab != NULL) | ||||
|             { | ||||
|                 tab->loadEntity(); | ||||
|                 ui->tabWidget->addTab(tab, QIcon(), plugin->settingsTabLabel()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| SettingsForm::~SettingsForm() | ||||
| { | ||||
|     delete ui; | ||||
| } | ||||
| 
 | ||||
| void SettingsForm::on_buttonBox_accepted() | ||||
| { | ||||
|     accept(); | ||||
| } | ||||
| 
 | ||||
| void SettingsForm::accept() | ||||
| { | ||||
|     for (int i = 0; i < ui->tabWidget->count(); i++) | ||||
|     { | ||||
|         IForm *tab = qobject_cast<IForm*>(ui->tabWidget->widget(i)); | ||||
|         if (tab != NULL) | ||||
|         { | ||||
|             tab->saveRecord(); | ||||
|         } | ||||
|     } | ||||
|     QDialog::accept(); | ||||
| } | ||||
| 
 | ||||
| void SettingsForm::on_buttonBox_rejected() | ||||
| { | ||||
|     reject(); | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| #ifndef SETTINGSFORM_H | ||||
| #define SETTINGSFORM_H | ||||
| 
 | ||||
| #include <QWidget> | ||||
| #include <QDialog> | ||||
| 
 | ||||
| namespace Ui { | ||||
| class SettingsForm; | ||||
| } | ||||
| 
 | ||||
| class SettingsForm : public QDialog | ||||
| { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit SettingsForm(QWidget *parent = 0); | ||||
|     ~SettingsForm(); | ||||
| 
 | ||||
| private slots: | ||||
|     void on_buttonBox_accepted(); | ||||
| 
 | ||||
|     void on_buttonBox_rejected(); | ||||
| 
 | ||||
| private: | ||||
|     Ui::SettingsForm *ui; | ||||
| 
 | ||||
|     // QDialog interface
 | ||||
| public slots: | ||||
|     void accept() override; | ||||
| }; | ||||
| 
 | ||||
| #endif // SETTINGSFORM_H
 | ||||
| @ -0,0 +1,44 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>SettingsForm</class> | ||||
|  <widget class="QDialog" name="SettingsForm"> | ||||
|   <property name="windowModality"> | ||||
|    <enum>Qt::ApplicationModal</enum> | ||||
|   </property> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>800</width> | ||||
|     <height>600</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Settings</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QTabWidget" name="tabWidget"> | ||||
|      <property name="tabPosition"> | ||||
|       <enum>QTabWidget::North</enum> | ||||
|      </property> | ||||
|      <property name="tabShape"> | ||||
|       <enum>QTabWidget::Rounded</enum> | ||||
|      </property> | ||||
|      <property name="currentIndex"> | ||||
|       <number>-1</number> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QDialogButtonBox" name="buttonBox"> | ||||
|      <property name="standardButtons"> | ||||
|       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
| @ -0,0 +1,47 @@ | ||||
| #include "settingsservice.h" | ||||
| 
 | ||||
| #include "core-odb.hxx" | ||||
| 
 | ||||
| #include <odb/core.hxx> | ||||
| #include <odb/result.hxx> | ||||
| 
 | ||||
| SettingsService::SettingsService(QObject *parent) | ||||
|     :IService(parent) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| SettingsService::SettingsService(const QString &pluginId, QObject *parent) | ||||
|     :IService(parent) | ||||
| { | ||||
|     m_pluginId = pluginId; | ||||
| } | ||||
| 
 | ||||
| QSharedPointer<System> SettingsService::loadSystem() | ||||
| { | ||||
|     Service<System> srv; | ||||
|     QList<QSharedPointer<System> > sysObj = srv.all("pluginId = '" + m_pluginId + "'"); | ||||
| 
 | ||||
|     if (sysObj.isEmpty()) | ||||
|     { | ||||
|         emit dbErrorUpdate("Error loading sys object"); | ||||
|         return QSharedPointer<System>(); | ||||
|     } | ||||
| 
 | ||||
|     return sysObj[0]; | ||||
| } | ||||
| 
 | ||||
| void SettingsService::saveSystem(const QJsonDocument &doc) | ||||
| { | ||||
|     QSharedPointer<System> sysObj = loadSystem(); | ||||
| 
 | ||||
|     if (sysObj.isNull()) | ||||
|     { | ||||
|         emit dbErrorUpdate("Error loading sys object"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     sysObj->setSettings(QString(doc.toJson())); | ||||
| 
 | ||||
|     Service<System> srv; | ||||
|     srv.update(sysObj); | ||||
| } | ||||
| @ -0,0 +1,78 @@ | ||||
| #ifndef SETTINGSSERVICE_H | ||||
| #define SETTINGSSERVICE_H | ||||
| 
 | ||||
| #include <QString> | ||||
| #include <QSharedPointer> | ||||
| #include <QJsonObject> | ||||
| #include <QJsonDocument> | ||||
| #include <QMetaProperty> | ||||
| 
 | ||||
| #include "data/system.h" | ||||
| #include "service.h" | ||||
| #include "core_global.h" | ||||
| 
 | ||||
| class CORESHARED_EXPORT SettingsService : public IService | ||||
| { | ||||
| public: | ||||
|     explicit SettingsService(QObject *parent = NULL); | ||||
|     SettingsService(const QString &pluginId, QObject *parent = NULL); | ||||
| 
 | ||||
| 
 | ||||
|     template <class T> | ||||
|     QSharedPointer<T> loadSettings() { | ||||
|         QSharedPointer<System> sys = loadSystem(); | ||||
|         QObject *objSettings = new T(); | ||||
|         QSharedPointer<T> settingsObj((T*)objSettings); | ||||
| 
 | ||||
|         if (sys.isNull()) | ||||
|         { | ||||
|             return settingsObj; | ||||
|         } | ||||
| 
 | ||||
|         QString settingStr = sys->settings(); | ||||
|         QJsonDocument jsonDoc = QJsonDocument::fromJson(settingStr.toUtf8()); | ||||
|         QJsonValue val = jsonDoc.object()["Settings"]; | ||||
| 
 | ||||
|         if (!val.isObject()) | ||||
|         { | ||||
|             return settingsObj; | ||||
|         } | ||||
| 
 | ||||
|         for (int i = 0; i < objSettings->metaObject()->propertyCount(); i++) | ||||
|         { | ||||
|             const char *propName = objSettings->metaObject()->property(i).name(); | ||||
|             QVariant varVal = val.toObject()[propName].toVariant(); | ||||
|             objSettings->setProperty(propName, varVal); | ||||
|         } | ||||
| 
 | ||||
|         return settingsObj; | ||||
|     } | ||||
| 
 | ||||
|     template <class T> | ||||
|     void saveSettings(QSharedPointer<T> objSettings) | ||||
|     { | ||||
|         QObject *objSettingsQo = objSettings.data(); | ||||
|         QJsonDocument jsonDoc; | ||||
|         QJsonObject jsonObj; | ||||
| 
 | ||||
|         for (int i = 0; i < objSettingsQo->metaObject()->propertyCount(); i++) | ||||
|         { | ||||
|             const char *propName = objSettings->metaObject()->property(i).name(); | ||||
|             jsonObj[propName] = QJsonValue::fromVariant(objSettingsQo->property(propName)); | ||||
|         } | ||||
| 
 | ||||
|         QJsonObject jsonSettings; | ||||
|         jsonSettings["Settings"] = jsonObj; | ||||
|         jsonDoc.setObject(jsonSettings); | ||||
| 
 | ||||
|         saveSystem(jsonDoc); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     QString m_pluginId; | ||||
|     QSharedPointer<QObject> m_settings; | ||||
|     QSharedPointer<System> loadSystem(); | ||||
|     void saveSystem(const QJsonDocument &doc); | ||||
| }; | ||||
| 
 | ||||
| #endif // SETTINGSSERVICE_H
 | ||||
| @ -1,11 +1,11 @@ | ||||
| TEMPLATE = subdirs | ||||
| 
 | ||||
| SUBDIRS += \ | ||||
|     qdecimal \ | ||||
|     core \ | ||||
|     application \ | ||||
|     accommodation \ | ||||
|     qdecimal \ | ||||
|     services \ | ||||
|     commodity \ | ||||
|     addressbook | ||||
|     services | ||||
|     #commodity \ | ||||
|     #addressbook | ||||
| 
 | ||||
|  | ||||
					Loading…
					
					
				
		Reference in New Issue