#ifndef GRIDFORM_H #define GRIDFORM_H #include #include #include #include #include #include #include "autoform.h" #include "autotablemodel.h" #include "context.h" #include "iplugin.h" #include "igridform.h" #include "iservice.h" #include "importdialog.h" #include "csvimporter.h" #include "importprogress.h" template class GridForm : public IGridForm { public: explicit GridForm(QWidget *parent = 0) : IGridForm(parent) { m_serviceConnected = false; m_permissionDenied = 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; } virtual void setTranslations(const QMap &translations) { Q_ASSERT(m_tableModel != NULL); m_tableModel->setTranslations(translations); } public slots: bool fillData() { if (m_tableModel == NULL) { Q_ASSERT(false); return false; } m_permissionDenied = false; 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); enableButtons(); return !m_permissionDenied; } 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())); }); this->connect(service(), &IService::permissionDenied, [this](QString permission) { if (permission == PERM_READ || permission == PERM_DELETE) { QMessageBox::critical(this, "Permission denied", permission .toStdString().c_str()); m_permissionDenied = true; } }); m_serviceConnected = true; } } bool m_serviceConnected; bool m_permissionDenied; private slots: // 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 { m_permissionDenied = false; 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); if (!m_permissionDenied) { m_tableModel->removeRowAt(tableView()->currentIndex()); emit dataChanged(); } } } void showImportButton() { QHBoxLayout *tbLayout = qobject_cast(this->toolbar()->layout()); if (tbLayout != NULL) { QToolButton *btnImport = new QToolButton(this->toolbar()); btnImport->setIcon(QIcon(":/icons/import.svg")); btnImport->setAutoRaise(true); btnImport->setIconSize(QSize(24, 24)); btnImport->setToolTip(tr("Import")); tbLayout->insertWidget(tbLayout->count() - 1, btnImport); connect(btnImport, &QToolButton::clicked, [this](){ ImportDialog *dlg = new ImportDialog(this); dlg->setAttribute(Qt::WA_DeleteOnClose); dlg->show(); connect(dlg, &QDialog::accepted, [this, dlg](){ T dataObj; CsvImporter importer(dataObj.metaObject()); importer.setImportFile(dlg->fileName()); importer.setSeparator(dlg->separator()); ImportProgress *progress = new ImportProgress(); progress->move(QApplication::desktop()->screen()->rect().center() - progress->rect().center()); progress->setWindowModality(Qt::ApplicationModal); progress->show(); service()->importData(&importer, progress); }); }); } } }; #endif // GRIDFORM_H