diff --git a/cinputlistdialog.cpp b/cinputlistdialog.cpp new file mode 100644 index 0000000..53a0240 --- /dev/null +++ b/cinputlistdialog.cpp @@ -0,0 +1,102 @@ +#include "cinputlistdialog.h" +#include "ui_cinputlistdialog.h" + +#include + + +cInputListDialog::cInputListDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::cInputListDialog) +{ + ui->setupUi(this); + + m_lpListModel = new QStandardItemModel(0, 3); + ui->m_lpList->setModel(m_lpListModel); + ui->m_lpList->setItemDelegate(new GridDelegate(ui->m_lpList)); + + ui->m_lpButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false); +} + +cInputListDialog::~cInputListDialog() +{ + delete ui; +} + +void cInputListDialog::setLabelText(const QString &szText) +{ + ui->m_lpLabel->setText(szText); +} + +void cInputListDialog::setListItems(const QStringList szHeader, const std::initializer_list& list) +{ + QList lists; + + for(auto x: list) + { + lists << x; + } + + if(!lists.count()) + return; + + if(szHeader.count()) + { + ui->m_lpList->setHeaderHidden(false); + m_lpListModel->setHorizontalHeaderLabels(szHeader); + } + else + ui->m_lpList->setHeaderHidden(true); + + m_lpListModel->setColumnCount(lists.count()); + + for(int x = 0;x < lists.at(0).count();x++) + { + QListlpItems; + for(int y = 0;y < lists.count();y++) + { + lpItems.append(new QStandardItem); + lpItems.at(y)->setText(lists.at(y).at(x)); + } + m_lpListModel->appendRow(lpItems); + } + + for(int x = 0;x < lists.at(0).count();x++) + ui->m_lpList->resizeColumnToContents(x); + + ui->m_lpList->setCurrentIndex(m_lpListModel->index(0, 0)); + checkSelected(); +} + +QString cInputListDialog::textValue() +{ + if(!checkSelected()) + return(QString()); + + QStandardItem* lpItem = m_lpListModel->itemFromIndex(m_lpListModel->index(ui->m_lpList->currentIndex().row(), 0)); + if(!lpItem) + return(QString()); + + return(lpItem->text()); +} + +void cInputListDialog::on_m_lpList_doubleClicked(const QModelIndex &/*index*/) +{ + if(checkSelected()) + QDialog::accept(); +} + +void cInputListDialog::on_m_lpList_clicked(const QModelIndex &/*index*/) +{ + checkSelected(); +} + +bool cInputListDialog::checkSelected() +{ + if(ui->m_lpList->currentIndex().isValid()) + { + ui->m_lpButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + return(true); + } + ui->m_lpButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + return(false); +} diff --git a/cinputlistdialog.h b/cinputlistdialog.h new file mode 100644 index 0000000..2829e6a --- /dev/null +++ b/cinputlistdialog.h @@ -0,0 +1,74 @@ +#ifndef CINPUTLISTDIALOG_H +#define CINPUTLISTDIALOG_H + + +#include +#include +#include +#include +#include +#include +#include + + +namespace Ui { +class cInputListDialog; +} + +class GridDelegate : public QStyledItemDelegate +{ +public: + explicit GridDelegate(QObject * parent = 0) : QStyledItemDelegate(parent) { } + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const + { + QPalette palette; + + painter->save(); + + if((index.row() & 1) == 0) + { + painter->setPen(palette.base().color()); + painter->setBrush(palette.base()); + } + else + { + painter->setPen(palette.alternateBase().color()); + painter->setBrush(palette.alternateBase()); + } + + painter->drawRect(option.rect); + + QPen pen(Qt::DotLine); + pen.setColor(QColor(Qt::lightGray)); + painter->setPen(pen); + painter->drawLine(option.rect.topRight(), option.rect.bottomRight()); + painter->restore(); + + QStyledItemDelegate::paint(painter, option, index); + } +}; + +class cInputListDialog : public QDialog +{ + Q_OBJECT + +public: + explicit cInputListDialog(QWidget *parent = 0); + ~cInputListDialog(); + + void setLabelText(const QString& szText); + void setListItems(const QStringList szHeader, const std::initializer_list& list); + QString textValue(); +private slots: + void on_m_lpList_doubleClicked(const QModelIndex &index); + + void on_m_lpList_clicked(const QModelIndex &index); + +private: + Ui::cInputListDialog* ui; + QStandardItemModel* m_lpListModel; + + bool checkSelected(); +}; + +#endif // CINPUTLISTDIALOG_H diff --git a/cinputlistdialog.ui b/cinputlistdialog.ui new file mode 100644 index 0000000..7a1db3e --- /dev/null +++ b/cinputlistdialog.ui @@ -0,0 +1,88 @@ + + + cInputListDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + + + + TextLabel + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + false + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + m_lpButtonBox + accepted() + cInputListDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + m_lpButtonBox + rejected() + cInputListDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/cmainwindow.cpp b/cmainwindow.cpp index 7222450..7d33ecc 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -2,6 +2,7 @@ #include "ui_cmainwindow.h" #include "cpartlistwindow.h" +#include "cinputlistdialog.h" #include "common.h" @@ -13,7 +14,7 @@ #include #include -#include +//#include #include @@ -676,6 +677,7 @@ void cMainWindow::onMenuPartlistNew() void cMainWindow::onMenuPartlistOpen() { QStringList szList; + QStringList szDescription; QSqlQuery query; QList idList; @@ -688,11 +690,8 @@ void cMainWindow::onMenuPartlistOpen() while(query.next()) { - QString sz = query.value("name").toString(); - if(!query.value("description").toString().isEmpty()) - sz.append(QString(" (%1)").arg(query.value("description").toString())); - - szList.append(sz); + szList.append(query.value("name").toString()); + szDescription.append(query.value("description").toString()); idList.append(query.value("id").toInt()); } @@ -702,15 +701,14 @@ void cMainWindow::onMenuPartlistOpen() return; } - QInputDialog inputDialog(this); - inputDialog.setOptions(QInputDialog::UseListViewForComboBoxItems); - inputDialog.setComboBoxItems(szList); - inputDialog.setLabelText("Project:"); - inputDialog.setWindowTitle("Open"); + cInputListDialog* lpDialog = new cInputListDialog(this); + lpDialog->setListItems(QStringList(), {szList, szDescription}); + lpDialog->setLabelText("Project:"); + lpDialog->setWindowTitle("Open"); - if(inputDialog.exec() == QDialog::Accepted) + if(lpDialog->exec() == QDialog::Accepted) { - QString szResult = inputDialog.textValue(); + QString szResult = lpDialog->textValue(); qint16 index = szList.indexOf(szResult); qint32 id = idList.at(index); @@ -725,6 +723,8 @@ void cMainWindow::onMenuPartlistOpen() connect(lpNew, SIGNAL(partlistChanged(QWidget*)), this, SLOT(partlistChanged(QWidget*))); connect(lpNew, SIGNAL(selectionChanged(QModelIndex)), this, SLOT(partlistSelectionChanged(QModelIndex))); } + + delete lpDialog; } void cMainWindow::onMenuPartlistClose() diff --git a/cparteditdialog.cpp b/cparteditdialog.cpp index 86182af..f9a6855 100644 --- a/cparteditdialog.cpp +++ b/cparteditdialog.cpp @@ -165,6 +165,22 @@ bool cPartEditDialog::save() return(false); } + if(!m_lpPartDistributorListModel->rowCount()) + { + query.prepare("DELETE FROM part_distributor WHERE partID=:partID;"); + query.bindValue(":partID", m_id); + + if(!query.exec()) + { + myDebug << query.lastError().text(); + return(false); + } + + return(true); + } + + QStringList idList; + for(int x = 0;x < m_lpPartDistributorListModel->rowCount();x++) { QStandardItem* lpItemName = m_lpPartDistributorListModel->itemFromIndex(m_lpPartDistributorListModel->index(x, 0)); @@ -177,7 +193,6 @@ bool cPartEditDialog::save() if(lpPartDistributor) { - QSqlQuery query; query.prepare("UPDATE part_distributor SET name=:name, description=:description, partID=:partID, distributorID=:distributorID, price=:price, link=:link WHERE id=:id;"); query.bindValue(":name", lpItemName->text()); query.bindValue(":description", lpItemDescription->text()); @@ -192,10 +207,11 @@ bool cPartEditDialog::save() myDebug << query.lastError().text(); return(false); } + + idList << QString("%1").arg(lpPartDistributor->id()); } else { - QSqlQuery query; query.prepare("INSERT INTO part_distributor (name, description, partID, distributorID, price, link) VALUES (:name, :description, :partID, :distributorID, :price, :lin);"); query.bindValue(":name", lpItemName->text()); query.bindValue(":description", lpItemDescription->text()); @@ -209,6 +225,32 @@ bool cPartEditDialog::save() myDebug << query.lastError().text(); return(false); } + + query.prepare("SELECT id FROM part_distributor WHERE name=:name AND description=:description AND partID=:partID AND distributorID=:distributorID AND price=:price AND link=:link;"); + query.bindValue(":name", lpItemName->text()); + query.bindValue(":description", lpItemDescription->text()); + query.bindValue(":partID", m_lpPart->id()); + query.bindValue(":distributorID", m_lpDistributorList->find(lpItemDistributor->text())->id()); + query.bindValue(":price", lpItemPrice->text().toDouble()); + query.bindValue(":link", lpItemLink->text()); + + if(!query.exec()) + { + myDebug << query.lastError().text(); + return(false); + } + + idList << QString("%1").arg(query.value("id").toInt()); + } + } + + if(idList.count()) + { + query.prepare(QString("DELETE FROM part_distributor WHERE id NOT IN (%1);").arg(idList.join(", "))); + if(!query.exec()) + { + myDebug << query.lastError().text(); + return(false); } } diff --git a/cpartlistitemdelegate.cpp b/cpartlistitemdelegate.cpp index 462011a..3089266 100644 --- a/cpartlistitemdelegate.cpp +++ b/cpartlistitemdelegate.cpp @@ -137,7 +137,7 @@ void cPartListItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel * model->setData(index, lpComboBox->currentText(), Qt::EditRole); model->setData(index, QVariant::fromValue(lpPartDistributor), Qt::UserRole); QStandardItemModel* lpModel = (QStandardItemModel*)index.model(); - QStandardItem* lpItem = lpModel->itemFromIndex(lpModel->index(index.row(), 4)); + QStandardItem* lpItem = lpModel->itemFromIndex(lpModel->index(index.row(), 5)); lpItem->setText(QString::number(lpPartDistributor->price(), 'f', 2)); } break; diff --git a/cpartlistitemeditdialog.cpp b/cpartlistitemeditdialog.cpp index b5ab132..ca666ee 100644 --- a/cpartlistitemeditdialog.cpp +++ b/cpartlistitemeditdialog.cpp @@ -35,19 +35,15 @@ void cPartlistItemEditDialog::setList(cDistributorList* lpDistributorList, cPart void cPartlistItemEditDialog::setValues(const QString &szReference, const QString &szGroup, const QString &szPart, const QString &szDistributor, const QString &szState, const qreal &dPrice, const QString &szDescription) { - cDistributor* lpDistributor = m_lpDistributorList->find(szDistributor); - cPart* lpPart = m_lpPartList->find(); - - if(lpPart) - { - ui->m_lpPartList->setCurrentText(QString("%1 - %2").arg(szGroup).arg(szPart)); - ui->m_lpPartList->setEnabled(false); - } + ui->m_lpPartList->setCurrentText(QString("%1 - %2").arg(szGroup).arg(szPart)); + ui->m_lpPartList->setEnabled(false); fillDistributorList(); -// if(lpDistributor) -// ui->m_lpDistributorList->setCurrentText(lpDistributor->name()); + ui->m_lpReference->setText(szReference); + ui->m_lpDistributorList->setCurrentText(szDistributor); + ui->m_lpPrice->setValue(dPrice); + ui->m_lpDescription->setText(szDescription); } void cPartlistItemEditDialog::on_m_lpPartList_currentIndexChanged(int /*index*/) diff --git a/cpartlistwindow.cpp b/cpartlistwindow.cpp index e65f503..8461206 100644 --- a/cpartlistwindow.cpp +++ b/cpartlistwindow.cpp @@ -313,6 +313,16 @@ void cPartlistWindow::on_m_lpPartList_customContextMenuRequested(const QPoint &p void cPartlistWindow::onPartAdd() { + cPartlistItemEditDialog* lpDialog = new cPartlistItemEditDialog(this); + lpDialog->setList(m_lpDistributorList, m_lpPartGroupList, m_lpPartList, m_lpPartDistributorList); + + if(lpDialog->exec() == QDialog::Rejected) + { + delete lpDialog; + return; + } + + delete lpDialog; } void cPartlistWindow::onPartEdit() @@ -329,8 +339,12 @@ void cPartlistWindow::onPartEdit() QStandardItem* lpPriceItem = m_lpPartListModel->itemFromIndex(m_lpPartListModel->index(index.row(), 5)); QStandardItem* lpDescriptionItem = m_lpPartListModel->itemFromIndex(m_lpPartListModel->index(index.row(), 6)); - lpDialog->setValues(lpReferenceItem->text(), lpPartGroupItem->text(), lpPartItem->text(), lpDistributorItem->text(), lpStateItem->text(), lpPriceItem->text().toDouble(), lpDescriptionItem); - lpDialog->exec(); + lpDialog->setValues(lpReferenceItem->text(), lpPartGroupItem->text(), lpPartItem->text(), lpDistributorItem->text(), lpStateItem->text(), lpPriceItem->text().toDouble(), lpDescriptionItem->text()); + if(lpDialog->exec() == QDialog::Rejected) + { + delete lpDialog; + return; + } delete lpDialog; } diff --git a/qtPartlist.pro b/qtPartlist.pro index 1e3bb08..1a0452d 100644 --- a/qtPartlist.pro +++ b/qtPartlist.pro @@ -40,7 +40,8 @@ SOURCES += \ cpartdistributoreditdialog.cpp \ cpartlistitem.cpp \ cpartlistitemdelegate.cpp \ - cpartlistitemeditdialog.cpp + cpartlistitemeditdialog.cpp \ + cinputlistdialog.cpp HEADERS += \ cmainwindow.h \ @@ -58,7 +59,8 @@ HEADERS += \ cpartdistributoreditdialog.h \ cpartlistitem.h \ cpartlistitemdelegate.h \ - cpartlistitemeditdialog.h + cpartlistitemeditdialog.h \ + cinputlistdialog.h FORMS += \ cmainwindow.ui \ @@ -68,7 +70,8 @@ FORMS += \ cdistributoreditdialog.ui \ cparteditdialog.ui \ cpartdistributoreditdialog.ui \ - cpartlistitemeditdialog.ui + cpartlistitemeditdialog.ui \ + cinputlistdialog.ui RESOURCES += \ qtpartlist.qrc