You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
5.4 KiB
C++

#ifndef GRIDFORM_H
#define GRIDFORM_H
#include <QWidget>
#include <QMessageBox>
#include <QHeaderView>
#include <QLayout>
#include "autoform.h"
#include "autotablemodel.h"
#include "context.h"
#include "iplugin.h"
#include "igridform.h"
#include "iservice.h"
template<class T>
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<T> *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<T> *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<QVariant> varList = Context::instance().settings()->value("grids/" + pluginId() + "/hide").toList();
QList<int> hide;
foreach (QVariant var, varList) {
hide.append(var.toInt());
}
QMap<QString, QVariant> 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<T> *m_tableModel;
IFormHandler *m_formHandler;
Service<T> *service() {
IPlugin *plugin = Context::instance().plugin(pluginId());
if (plugin == NULL) {
Q_ASSERT(false);
return NULL;
}
Service<T> *service = plugin->service<T>();
if (service == NULL) {
Q_ASSERT(false);
return NULL;
}
return service;
}
AutoForm<T> *form() {
return (AutoForm<T>*)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<T>(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<T> entity = m_tableModel->itemFromIndex(tableView()->currentIndex());
service()->erase(entity);
m_tableModel->removeRowAt(tableView()->currentIndex());
emit dataChanged();
}
}
};
#endif // GRIDFORM_H