314 lines
12 KiB
C++
314 lines
12 KiB
C++
#include "itemdetailmapper.h"
|
|
|
|
#include <QAbstractItemModel>
|
|
#include <QComboBox>
|
|
#include <QDataWidgetMapper>
|
|
#include <QGridLayout>
|
|
#include <QJsonArray>
|
|
#include <QJsonObject>
|
|
#include <QLabel>
|
|
#include <QLineEdit>
|
|
#include <QPushButton>
|
|
#include <QSpinBox>
|
|
#include <QStringListModel>
|
|
#include <QTableView>
|
|
#include "model/metadata.h"
|
|
|
|
ItemDetailMapper::ItemDetailMapper(QWidget* parent)
|
|
: QWidget{parent}
|
|
, m_qrCodeDisplay(new QLabel("QR Code")) {
|
|
/// model mapping
|
|
m_mapper = std::make_unique<QDataWidgetMapper>(this);
|
|
/// BUG: If multiple columns are changed not all changes are applied.
|
|
/// Multiple changes are set individually by calling setData().
|
|
/// Probably due to a conflicting dataChanged signal for too many roles&columns the data of
|
|
/// the remaining columns is reset before setData is called.
|
|
/// And a manual submit would also create multiple undo steps anyway.
|
|
/// Workaround: ManualSubmit -> AutoSubmit
|
|
// m_mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
|
|
m_mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
|
|
|
|
/// model mapping buttons
|
|
m_nextButton = new QPushButton(tr("Ne&xt"));
|
|
m_previousButton = new QPushButton(tr("&Previous"));
|
|
|
|
connect(m_previousButton, &QAbstractButton::clicked, this, &ItemDetailMapper::toPrevious);
|
|
connect(m_nextButton, &QAbstractButton::clicked, this, &ItemDetailMapper::toNext);
|
|
|
|
/// the individual widgets
|
|
// REFACTOR deduce types from meta data & use a factory
|
|
/// left layout
|
|
m_numberLabel = new QLabel(GET_HEADER_FOR_COLUMN(0));
|
|
m_numberBox = new QSpinBox();
|
|
m_numberBox->setMaximum(1000);
|
|
|
|
m_lastNameLabel = new QLabel(GET_HEADER_FOR_COLUMN(1));
|
|
m_lastNameEdit = new QLineEdit();
|
|
m_lastNameLabel->setBuddy(m_lastNameEdit);
|
|
|
|
m_firstNameLabel = new QLabel(GET_HEADER_FOR_COLUMN(2));
|
|
m_firstNameEdit = new QLineEdit();
|
|
m_firstNameLabel->setBuddy(m_firstNameEdit);
|
|
|
|
m_shareTypeLabel = new QLabel(GET_HEADER_FOR_COLUMN(3));
|
|
m_shareTypeBox = new QComboBox();
|
|
m_shareTypeLabel->setBuddy(m_shareTypeBox);
|
|
m_shareTypeModel = new QStringListModel(SHARE_TYPES, this);
|
|
m_shareTypeBox->setModel(m_shareTypeModel);
|
|
|
|
m_amountLabel = new QLabel(GET_HEADER_FOR_COLUMN(4));
|
|
m_amountSpinBox = new QDoubleSpinBox();
|
|
m_amountLabel->setBuddy(m_amountSpinBox);
|
|
|
|
m_biddingTypeLabel = new QLabel(GET_HEADER_FOR_COLUMN(5));
|
|
m_biddingTypeBox = new QComboBox();
|
|
m_biddingTypeLabel->setBuddy(m_biddingTypeBox);
|
|
m_biddingTypeModel = new QStringListModel(BIDDING_TYPES, this);
|
|
m_biddingTypeBox->setModel(m_biddingTypeModel);
|
|
|
|
m_bidding1Label = new QLabel(GET_HEADER_FOR_COLUMN(6));
|
|
m_bidding1SpinBox = new QSpinBox();
|
|
m_bidding1SpinBox->setMaximum(500);
|
|
m_bidding2Label = new QLabel(GET_HEADER_FOR_COLUMN(7));
|
|
m_bidding2SpinBox = new QSpinBox();
|
|
m_bidding2SpinBox->setMaximum(500);
|
|
m_bidding3Label = new QLabel(GET_HEADER_FOR_COLUMN(8));
|
|
m_bidding3SpinBox = new QSpinBox();
|
|
m_bidding3SpinBox->setMaximum(500);
|
|
|
|
m_depotWish1Label = new QLabel(GET_HEADER_FOR_COLUMN(9));
|
|
m_depotWish1Edit = new QLineEdit();
|
|
m_depotWish1Label->setBuddy(m_depotWish1Edit);
|
|
m_depotWish2Label = new QLabel(GET_HEADER_FOR_COLUMN(10));
|
|
m_depotWish2Edit = new QLineEdit();
|
|
m_depotWish2Label->setBuddy(m_depotWish2Edit);
|
|
|
|
m_mailLabel = new QLabel(GET_HEADER_FOR_COLUMN(11));
|
|
m_mailEdit = new QLineEdit();
|
|
m_mailEdit->setMinimumWidth(200);
|
|
m_mailLabel->setBuddy(m_mailEdit);
|
|
|
|
/// right layout
|
|
m_createOnlineAccountButton = new QPushButton(tr("&Create account"));
|
|
m_sendInviteMailButton = new QPushButton(tr("&Send invite"));
|
|
|
|
m_onlineIdLabel = new QLabel(GET_HEADER_FOR_COLUMN(12));
|
|
m_onlineIdDisplay = new QLineEdit();
|
|
m_onlineIdDisplay->setReadOnly(true);
|
|
m_onlineIdLabel->setBuddy(m_onlineIdDisplay);
|
|
|
|
m_accessCodeLabel = new QLabel(GET_HEADER_FOR_COLUMN(13));
|
|
m_accessCodeDisplay = new QLineEdit();
|
|
m_accessCodeDisplay->setReadOnly(true);
|
|
m_accessCodeLabel->setBuddy(m_onlineIdDisplay);
|
|
|
|
updateQRCode();
|
|
connect(this, &ItemDetailMapper::contentChanged, this, &ItemDetailMapper::updateQRCode);
|
|
|
|
m_accessUrlDisplay = new QLineEdit();
|
|
m_accessUrlDisplay->setReadOnly(true);
|
|
|
|
QGridLayout* leftLayout = new QGridLayout();
|
|
leftLayout->addWidget(m_numberLabel, 0, 0, 1, 1);
|
|
leftLayout->addWidget(m_numberBox, 0, 1, 1, 1);
|
|
leftLayout->addWidget(m_lastNameLabel, 1, 0, 1, 1);
|
|
leftLayout->addWidget(m_lastNameEdit, 1, 1, 1, 1);
|
|
leftLayout->addWidget(m_firstNameLabel, 2, 0, 1, 1);
|
|
leftLayout->addWidget(m_firstNameEdit, 2, 1, 1, 1);
|
|
leftLayout->addWidget(m_shareTypeLabel, 3, 0, 1, 1);
|
|
leftLayout->addWidget(m_shareTypeBox, 3, 1, 1, 1);
|
|
leftLayout->addWidget(m_amountLabel, 4, 0, 1, 1);
|
|
leftLayout->addWidget(m_amountSpinBox, 4, 1, 1, 1);
|
|
leftLayout->addWidget(m_biddingTypeLabel, 5, 0, 1, 1);
|
|
leftLayout->addWidget(m_biddingTypeBox, 5, 1, 1, 1);
|
|
leftLayout->addWidget(m_bidding1Label, 6, 0, 1, 1);
|
|
leftLayout->addWidget(m_bidding1SpinBox, 6, 1, 1, 1);
|
|
leftLayout->addWidget(m_bidding2Label, 7, 0, 1, 1);
|
|
leftLayout->addWidget(m_bidding2SpinBox, 7, 1, 1, 1);
|
|
leftLayout->addWidget(m_bidding3Label, 8, 0, 1, 1);
|
|
leftLayout->addWidget(m_bidding3SpinBox, 8, 1, 1, 1);
|
|
leftLayout->addWidget(m_depotWish1Label, 9, 0, 1, 1);
|
|
leftLayout->addWidget(m_depotWish1Edit, 9, 1, 1, 1);
|
|
leftLayout->addWidget(m_depotWish2Label, 10, 0, 1, 1);
|
|
leftLayout->addWidget(m_depotWish2Edit, 10, 1, 1, 1);
|
|
leftLayout->addWidget(m_mailLabel, 11, 0, 1, 1);
|
|
leftLayout->addWidget(m_mailEdit, 11, 1, 1, 1);
|
|
|
|
leftLayout->addWidget(m_previousButton, 12, 0, 1, 1);
|
|
leftLayout->addWidget(m_nextButton, 12, 1, 1, 1);
|
|
|
|
/// right layout
|
|
QVBoxLayout* rightLayout = new QVBoxLayout;
|
|
QHBoxLayout* onlineAccountControlLayout = new QHBoxLayout;
|
|
onlineAccountControlLayout->addWidget(m_createOnlineAccountButton);
|
|
onlineAccountControlLayout->addWidget(m_sendInviteMailButton);
|
|
rightLayout->addLayout(onlineAccountControlLayout);
|
|
QGridLayout* rightGridLayout = new QGridLayout();
|
|
rightGridLayout->addWidget(m_onlineIdLabel, 0, 0, 1, 1);
|
|
rightGridLayout->addWidget(m_onlineIdDisplay, 0, 1, 1, 1);
|
|
rightGridLayout->addWidget(m_accessCodeLabel, 1, 0, 1, 1);
|
|
rightGridLayout->addWidget(m_accessCodeDisplay, 1, 1, 1, 1);
|
|
rightGridLayout->addWidget(m_qrCodeDisplay, 2, 0, 6, 2);
|
|
rightGridLayout->addWidget(m_accessUrlDisplay, 9, 0, 1, 2);
|
|
rightLayout->addLayout(rightGridLayout);
|
|
|
|
QHBoxLayout* outerLayout = new QHBoxLayout;
|
|
outerLayout->addLayout(leftLayout);
|
|
outerLayout->addLayout(rightLayout);
|
|
setLayout(outerLayout);
|
|
|
|
/// online user account
|
|
connect(m_mailEdit, &QLineEdit::textChanged, this, &ItemDetailMapper::onMailEditChanged);
|
|
connect(m_onlineIdDisplay, &QLineEdit::textChanged, this, &ItemDetailMapper::onOnlineIDChanged);
|
|
connect(m_accessCodeDisplay, &QLineEdit::textChanged, this,
|
|
&ItemDetailMapper::onAccessCodeChanged);
|
|
|
|
connect(m_createOnlineAccountButton, &QAbstractButton::clicked, this,
|
|
&ItemDetailMapper::onCreateOnlineAccountTriggered);
|
|
}
|
|
|
|
void ItemDetailMapper::setModelMappings(QTableView* tableView) {
|
|
qDebug() << "Setting model...";
|
|
m_tableView = tableView;
|
|
m_model = tableView->model();
|
|
m_selectionModel = tableView->selectionModel();
|
|
|
|
m_mapper->setModel(m_model);
|
|
m_mapper->addMapping(m_numberBox, 0);
|
|
m_mapper->addMapping(m_lastNameEdit, 1);
|
|
m_mapper->addMapping(m_firstNameEdit, 2);
|
|
m_mapper->addMapping(m_shareTypeBox, 3, "currentText");
|
|
m_mapper->addMapping(m_amountSpinBox, 4);
|
|
m_mapper->addMapping(m_biddingTypeBox, 5, "currentText");
|
|
m_mapper->addMapping(m_bidding1SpinBox, 6);
|
|
m_mapper->addMapping(m_bidding2SpinBox, 7);
|
|
m_mapper->addMapping(m_bidding3SpinBox, 8);
|
|
m_mapper->addMapping(m_depotWish1Edit, 9);
|
|
m_mapper->addMapping(m_depotWish2Edit, 10);
|
|
m_mapper->addMapping(m_mailEdit, 11);
|
|
|
|
m_mapper->addMapping(m_onlineIdDisplay, 12);
|
|
m_mapper->addMapping(m_accessCodeDisplay, 13);
|
|
|
|
m_mapper->setCurrentIndex(m_selectionModel->currentIndex().row());
|
|
|
|
connect(m_model, &QAbstractItemModel::rowsInserted, this, &ItemDetailMapper::rowsInserted);
|
|
connect(m_model, &QAbstractItemModel::rowsRemoved, this, &ItemDetailMapper::rowsRemoved);
|
|
connect(m_selectionModel, &QItemSelectionModel::currentChanged, this,
|
|
&ItemDetailMapper::onCurrentIndexChanged);
|
|
|
|
updateButtons(m_selectionModel->currentIndex().row());
|
|
}
|
|
|
|
bool ItemDetailMapper::submit() { return m_mapper->submit(); }
|
|
|
|
void ItemDetailMapper::revert() { m_mapper->revert(); }
|
|
|
|
void ItemDetailMapper::rowsInserted(const QModelIndex& parent, int start, int end) {
|
|
updateButtons(m_mapper->currentIndex());
|
|
}
|
|
|
|
void ItemDetailMapper::rowsRemoved(const QModelIndex& parent, int start, int end) {
|
|
if (m_model->rowCount() == 0) {
|
|
setEnabled(false);
|
|
|
|
// m_nameEdit->clear();
|
|
// m_descriptionEdit->clear();
|
|
// m_infoEdit->clear();
|
|
// m_amountBox->clear();
|
|
// m_factorBox->clear();
|
|
}
|
|
|
|
updateButtons(m_mapper->currentIndex());
|
|
}
|
|
|
|
void ItemDetailMapper::toPrevious() {
|
|
int currentRow = m_selectionModel->currentIndex().row();
|
|
QModelIndex previousIndex = m_selectionModel->currentIndex().siblingAtRow(currentRow - 1);
|
|
if (previousIndex.isValid()) {
|
|
m_selectionModel->setCurrentIndex(previousIndex, QItemSelectionModel::ClearAndSelect);
|
|
}
|
|
}
|
|
|
|
void ItemDetailMapper::toNext() {
|
|
int currentRow = m_selectionModel->currentIndex().row();
|
|
QModelIndex nextIndex = m_selectionModel->currentIndex().siblingAtRow(currentRow + 1);
|
|
if (nextIndex.isValid()) {
|
|
m_selectionModel->setCurrentIndex(nextIndex, QItemSelectionModel::ClearAndSelect);
|
|
}
|
|
}
|
|
|
|
void ItemDetailMapper::updateButtons(int row) {
|
|
m_previousButton->setEnabled(row > 0);
|
|
m_nextButton->setEnabled(row < m_model->rowCount() - 1);
|
|
}
|
|
|
|
void ItemDetailMapper::emitContentChanged(const QModelIndex& currentIndex) {
|
|
// BUG QR-Code isn't updated after changes through the ItemDetailMapper #18
|
|
QString toStringText = "";
|
|
if (currentIndex.isValid()) {
|
|
toStringText = currentIndex.data(ToStringRole).toString();
|
|
}
|
|
emit contentChanged(toStringText);
|
|
}
|
|
|
|
void ItemDetailMapper::onCurrentIndexChanged(const QModelIndex& current,
|
|
const QModelIndex& /*previous*/) {
|
|
if (!isEnabled()) {
|
|
setEnabled(true);
|
|
}
|
|
m_mapper->setCurrentModelIndex(current);
|
|
updateButtons(current.row());
|
|
emitContentChanged(current);
|
|
}
|
|
|
|
void ItemDetailMapper::updateQRCode(const QString text) {
|
|
QImage unscaledImage;
|
|
if (text.isEmpty()) {
|
|
unscaledImage = QImage("://no-picture-taking.png");
|
|
} else {
|
|
unscaledImage = m_generator.generateQr(text);
|
|
}
|
|
QImage image = unscaledImage.scaled(250, 250);
|
|
|
|
m_qrCodeDisplay->setPixmap(QPixmap::fromImage(image));
|
|
m_qrCodeDisplay->setToolTip(text);
|
|
}
|
|
|
|
void ItemDetailMapper::onMailEditChanged(const QString& text) {
|
|
if (text.isEmpty()) {
|
|
m_createOnlineAccountButton->setEnabled(false);
|
|
m_sendInviteMailButton->setEnabled(false);
|
|
} else {
|
|
onOnlineIDChanged(m_onlineIdDisplay->text());
|
|
onAccessCodeChanged(m_accessCodeDisplay->text());
|
|
}
|
|
}
|
|
|
|
void ItemDetailMapper::onOnlineIDChanged(const QString& text) {
|
|
if (text.isEmpty()) {
|
|
m_createOnlineAccountButton->setEnabled(true);
|
|
m_sendInviteMailButton->setEnabled(false);
|
|
} else {
|
|
m_createOnlineAccountButton->setEnabled(false);
|
|
m_sendInviteMailButton->setEnabled(true);
|
|
}
|
|
}
|
|
|
|
void ItemDetailMapper::onAccessCodeChanged(const QString& text) {
|
|
if (text.isEmpty()) {
|
|
m_sendInviteMailButton->setEnabled(false);
|
|
m_accessUrlDisplay->setText("");
|
|
updateQRCode("");
|
|
} else {
|
|
m_sendInviteMailButton->setEnabled(true);
|
|
const QString accessUrl = "http://127.0.0.1:4000/log_in/" + text;
|
|
m_accessUrlDisplay->setText(accessUrl);
|
|
updateQRCode(accessUrl);
|
|
}
|
|
}
|
|
|
|
void ItemDetailMapper::onCreateOnlineAccountTriggered() {
|
|
emit createOnlineAccountTriggered(m_mailEdit->text());
|
|
}
|