#ifndef GRIDFORM_H #define GRIDFORM_H #include #include #include #include #include "autoform.h" #include "autotablemodel.h" #include "context.h" #include "iplugin.h" #include "igridform.h" #include "iservice.h" template class GridForm : public IGridForm { public: explicit GridForm(QWidget *parent = 0) : IGridForm(parent) { m_serviceConnected = false; m_tableModel = NULL; m_formHandler = new DefaultFormHandler(); m_filterUi = new FilterUi(this, new T); filterWidget()->layout()->addWidget(m_filterUi); } virtual ~GridForm() { if (m_form != NULL && m_form->parent() == NULL) { delete m_form; } if (m_tableModel != NULL && m_tableModel->parent() == NULL) { delete m_tableModel; } delete m_formHandler; } void setForm(AutoForm *aForm) { Q_ASSERT(m_form == NULL); m_form = aForm; connect(m_form, &IForm::recordAdded, [this](){ //service()->save(form()->entity()); m_tableModel->addRow(form()->entity()); emit dataChanged(); }); connect(m_form, &IForm::recordUpdated, [this](){ //service()->update(form()->entity()); emit dataChanged(); }); connect(m_form, &IForm::refreshEntity, [this](){ if (m_tableModel != NULL) { m_tableModel->setItemToIndex(tableView()->currentIndex(), service()->reload(m_tableModel->itemFromIndex(tableView()->currentIndex())->id())); } }); } void setTableModel(AutoTableModel *tableModel) { Q_ASSERT(m_tableModel == NULL); m_tableModel = tableModel; connect(m_filterUi, SIGNAL(applyFilter(QString)), m_tableModel, SLOT(filter(QString))); connect(m_filterUi, SIGNAL(restoreData()), m_tableModel, SLOT(restore())); } void setFormHandler(IFormHandler *handler) { delete m_formHandler; m_formHandler = handler; } public slots: void fillData() { if (m_tableModel == NULL) { Q_ASSERT(false); return; } connectService(); m_tableModel->setData(service()->all()); tableView()->setModel(m_tableModel); QList varList = Context::instance().settings()->value("grids/" + pluginId() + "/hide").toList(); QList hide; foreach (QVariant var, varList) { hide.append(var.toInt()); } QMap widths = Context::instance().settings()->value("grids/" + pluginId() + "/widths").toMap(); foreach (QString key, widths.keys()) { tableView()->setColumnWidth(key.toInt(), widths[key].toInt()); } connect(tableView()->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), this, SLOT(widthChanged(int,int,int))); hideColumns(hide); } private: AutoTableModel *m_tableModel; IFormHandler *m_formHandler; Service *service() { IPlugin *plugin = Context::instance().plugin(pluginId()); if (plugin == NULL) { Q_ASSERT(false); return NULL; } Service *service = plugin->service(); if (service == NULL) { Q_ASSERT(false); return NULL; } return service; } AutoForm *form() { return (AutoForm*)m_form; } void connectService() { if (!m_serviceConnected) { connect(service(), &IService::dbErrorRead, [this](QString msg) { QMessageBox::critical(this, tr("Database error"), tr(msg.toStdString().c_str())); }); connect(service(), &IService::dbErrorDelete, [this](QString msg) { QMessageBox::critical(this, tr("Database error"), tr(msg.toStdString().c_str())); }); m_serviceConnected = true; } } bool m_serviceConnected; // IGridForm interface protected: void handleNewRecord() override { if (m_form == NULL) { Q_ASSERT(false); return; } form()->setEntity(QSharedPointer(new T())); form()->setNewRec(true); m_formHandler->showForm(m_form); } void handleEditRecord() override { if (m_form == NULL || m_tableModel == NULL || tableView()->currentIndex().row() < 0) { Q_ASSERT(false); return; } form()->setEntity(m_tableModel->itemFromIndex(tableView()->currentIndex())); form()->setNewRec(false); m_formHandler->showForm(m_form); } void handleDeleteRecord() override { connectService(); if (m_form == NULL || m_tableModel == NULL || tableView()->currentIndex().row() < 0) { Q_ASSERT(false); return; } QMessageBox::StandardButton reply; reply = QMessageBox::question(this, tr("Delete record"), tr("Realy delete this record?"), QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { QSharedPointer entity = m_tableModel->itemFromIndex(tableView()->currentIndex()); service()->erase(entity); m_tableModel->removeRowAt(tableView()->currentIndex()); emit dataChanged(); } } }; #endif // GRIDFORM_H