#include "itemdetailmapper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "model/metadata.h" ItemDetailMapper::ItemDetailMapper(QWidget* parent) : QWidget{parent} , m_qrCodeDisplay(new QLabel("QR Code")) { /// model mapping m_mapper = std::make_unique(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); const QVariantMap serverSettings = SettingsHandler::getSettings("Server"); const QString urlValue = serverSettings.value("url").toString(); m_serverUrl = urlValue; /// 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); connect(m_sendInviteMailButton, &QAbstractButton::clicked, this, &ItemDetailMapper::onSendInviteMailTriggered); } 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::onCurrentIndexChanged(const QModelIndex& current, const QModelIndex& /*previous*/) { if (!isEnabled()) { setEnabled(true); } m_mapper->setCurrentModelIndex(current); updateButtons(current.row()); } 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& accessCode) { if (accessCode.isEmpty()) { m_sendInviteMailButton->setEnabled(false); m_accessUrlDisplay->setText(""); updateQRCode(""); } else { m_sendInviteMailButton->setEnabled(true); const QString accessUrl = m_serverUrl + "/log_in/" + accessCode; // const QString accessUrl = "https://bietrunde.das-gruene-zebra.de/log_in/" + text; m_accessUrlDisplay->setText(accessUrl); updateQRCode(accessUrl); } } void ItemDetailMapper::onCreateOnlineAccountTriggered() { emit createOnlineAccountTriggered(m_mailEdit->text()); } void ItemDetailMapper::onSendInviteMailTriggered() { emit sendInviteMailTriggered(m_mailEdit->text()); }