From 6894684cb487ab1e09f030927dc7bb1102c39a42 Mon Sep 17 00:00:00 2001 From: birkeh Date: Sun, 10 Mar 2019 23:51:19 +0100 Subject: [PATCH] add, edit and remove persons --- cflag.cpp | 40 +++++----- cflag.h | 4 +- cmainwindow.cpp | 28 +++++++ cmainwindow.h | 8 ++ cmainwindow.ui | 2 +- cperson.cpp | 43 ++++++++++- cperson.h | 12 ++- ctoolboxperson.cpp | 184 ++++++++++++++++++++++++++++++++++++++++++++- ctoolboxperson.h | 62 +++++++++++++++ ctoolboxperson.ui | 8 +- pictureLibrary.pro | 11 ++- 11 files changed, 367 insertions(+), 35 deletions(-) diff --git a/cflag.cpp b/cflag.cpp index 90cbc0e..14bfae0 100644 --- a/cflag.cpp +++ b/cflag.cpp @@ -26,7 +26,7 @@ bool cFlag::toDB() if(m_iID != -1) { - query.prepare("SELECT id FROM flags WHERE id=:id;"); + query.prepare("SELECT id FROM flag WHERE id=:id;"); query.bindValue(":id", m_iID); if(!query.exec()) { @@ -35,12 +35,12 @@ bool cFlag::toDB() } if(!query.next()) - query.prepare("INSERT INTO flags (name) VALUES (:name);"); + query.prepare("INSERT INTO flag (name) VALUES (:name);"); else - query.prepare("UPDATE flags SET name=:name WHERE id=:id;"); + query.prepare("UPDATE flag SET name=:name WHERE id=:id;"); } else - query.prepare("INSERT INTO flags (name) VALUES (:name);"); + query.prepare("INSERT INTO flag (name) VALUES (:name);"); query.bindValue(":id", m_iID); @@ -54,7 +54,7 @@ bool cFlag::toDB() if(m_iID == -1) { - query.prepare("SELECT id FROM flags WHERE _rowid_=(SELECT MAX(_rowid_) FROM flags);"); + query.prepare("SELECT id FROM flag WHERE _rowid_=(SELECT MAX(_rowid_) FROM flag);"); if(!query.exec()) { myDebug << query.lastError().text(); @@ -129,7 +129,7 @@ bool cFlagList::load(cSplashScreen *lpSplashScreen, QProgressBar *lpProgressBar) { QSqlQuery query; - query.prepare("SELECT COUNT(1) cnt FROM flags;"); + query.prepare("SELECT COUNT(1) cnt FROM flag;"); if(!query.exec()) { @@ -147,7 +147,7 @@ bool cFlagList::load(cSplashScreen *lpSplashScreen, QProgressBar *lpProgressBar) query.prepare("SELECT id, " " name " - "FROM flags " + "FROM flag " "ORDER BY UPPER(name);"); if(!query.exec()) @@ -164,8 +164,8 @@ bool cFlagList::load(cSplashScreen *lpSplashScreen, QProgressBar *lpProgressBar) while(query.next()) { - cFlag* lpFlags = add(query.value("id").toInt(), true); - lpFlags->setName(query.value("name").toString()); + cFlag* lpFlag = add(query.value("id").toInt(), true); + lpFlag->setName(query.value("name").toString()); count++; if(!(count % step)) @@ -194,18 +194,18 @@ cFlag* cFlagList::add(qint32 iID, bool bNoCheck) return(lpNew); } -bool cFlagList::add(cFlag* lpFlags, bool bNoCheck) +bool cFlagList::add(cFlag* lpFlag, bool bNoCheck) { if(bNoCheck) { - append(lpFlags); + append(lpFlag); return(true); } - if(contains(lpFlags)) + if(contains(lpFlag)) return(false); - append(lpFlags); + append(lpFlag); return(true); } @@ -219,11 +219,11 @@ cFlag* cFlagList::find(qint32 iID) return(nullptr); } -cFlag* cFlagList::find(cFlag* lpFlags) +cFlag* cFlagList::find(cFlag* lpFlag) { for(cFlagList::iterator i = begin(); i != end(); i++) { - if(*lpFlags == (**i)) + if(*lpFlag == (**i)) return(*i); } return(nullptr); @@ -231,12 +231,12 @@ cFlag* cFlagList::find(cFlag* lpFlags) QStringList cFlagList::flagList() { - QStringList szFlagsList; + QStringList szFlagList; for(cFlagList::iterator i = begin(); i != end();i++) - szFlagsList.append((*i)->name()); + szFlagList.append((*i)->name()); - szFlagsList.removeDuplicates(); - szFlagsList.sort(Qt::CaseInsensitive); - return(szFlagsList); + szFlagList.removeDuplicates(); + szFlagList.sort(Qt::CaseInsensitive); + return(szFlagList); } diff --git a/cflag.h b/cflag.h index 8f8c29f..6bdb78a 100644 --- a/cflag.h +++ b/cflag.h @@ -163,7 +163,7 @@ public: \param bNoCheck \return bool */ - bool add(cFlag* lpFlags, bool bNoCheck = false); + bool add(cFlag* lpFlag, bool bNoCheck = false); /*! \brief @@ -180,7 +180,7 @@ public: \param iID \return cFlag */ - cFlag* find(cFlag* lpFlags); + cFlag* find(cFlag* lpFlag); /*! \brief diff --git a/cmainwindow.cpp b/cmainwindow.cpp index ea4a048..cbfcd2f 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -12,6 +12,10 @@ #include "cdatetimepicker.h" #include "ccombopicker.h" +#include "cimage.h" + +#include "cimageviewer.h" + #include "ui_cmainwindow.h" #include @@ -114,6 +118,8 @@ void cMainWindow::createActions() connect(ui->m_lpFolderView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &cMainWindow::onFolderSelected); connect(ui->m_lpThumbnailView, &QListView::customContextMenuRequested, this, &cMainWindow::onThumbnailViewContextMenu); + + connect(ui->m_lpThumbnailView, &QListView::doubleClicked, this, &cMainWindow::onThumbnailDoubleClicked); } void cMainWindow::createContextActions() @@ -360,6 +366,28 @@ void cMainWindow::onThumbnailSelected(const QItemSelection& /*selection*/, const ui->m_lpToolBoxPerson->setPicture(pictureList); } +void cMainWindow::onThumbnailDoubleClicked(const QModelIndex& index) +{ + if(!index.isValid()) + return; + + cPicture* lpPicture = m_lpThumbnailSortFilterProxyModel->data(index, Qt::UserRole+1).value(); + QFile file(m_pictureLibrary.rootPath() + "/" + lpPicture->filePath() + "/" + lpPicture->fileName()); + + if(!file.exists()) + return; + + cImageViewer imageViewer(this); +// imageViewer.showMaximized(); + + cImage image(file.fileName()); + if(image.isNull()) + return; + + imageViewer.setImage(&image); + imageViewer.exec(); +} + void cMainWindow::onFolderSelected(const QItemSelection& /*selection*/, const QItemSelection& /*previous*/) { if(m_bLoading) diff --git a/cmainwindow.h b/cmainwindow.h index 2919290..2cdc443 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -182,6 +182,14 @@ private slots: \param previous */ void onThumbnailSelected(const QItemSelection& selection, const QItemSelection& previous); + /*! + \brief + + \fn onThumbnailDoubleClicked + \param index + */ + void onThumbnailDoubleClicked(const QModelIndex& index); + /*! \brief diff --git a/cmainwindow.ui b/cmainwindow.ui index b39e088..3ddbc3e 100644 --- a/cmainwindow.ui +++ b/cmainwindow.ui @@ -132,7 +132,7 @@ - People + Person diff --git a/cperson.cpp b/cperson.cpp index 114264c..9fe8352 100644 --- a/cperson.cpp +++ b/cperson.cpp @@ -24,6 +24,14 @@ bool cPerson::toDB() { QSqlQuery query; + query.prepare("SELECT id FROM person WHERE UPPER(name)=UPPER(:name);"); + query.bindValue(":name", m_szName); + if(query.exec()) + { + if(query.next()) + return(false); + } + if(m_iID != -1) { query.prepare("SELECT id FROM person WHERE id=:id;"); @@ -219,16 +227,47 @@ cPerson* cPersonList::find(qint32 iID) return(nullptr); } -cPerson* cPersonList::find(cPerson* lpFlags) +cPerson* cPersonList::find(cPerson* lpPerson) { for(cPersonList::iterator i = begin(); i != end(); i++) { - if(*lpFlags == (**i)) + if(*lpPerson == (**i)) return(*i); } return(nullptr); } +bool cPersonList::remove(cPerson* lpPerson) +{ + if(!find(lpPerson)) + return(true); + + QSqlQuery query; + + query.prepare("SELECT COUNT(1) cnt FROM picture_person WHERE personID=:id;"); + query.bindValue(":id", lpPerson->id()); + + if(!query.exec()) + return(false); + + if(!query.next()) + return(false); + + if(query.value("cnt").toInt() != 0) + return(false); + + query.prepare("DELETE FROM person WHERE id=:id;"); + query.bindValue(":id", lpPerson->id()); + + if(!query.exec()) + return(false); + + this->removeOne(lpPerson); + delete lpPerson; + + return(true); +} + QStringList cPersonList::personList() { QStringList szPersonList; diff --git a/cperson.h b/cperson.h index 6963d29..53fb5be 100644 --- a/cperson.h +++ b/cperson.h @@ -163,7 +163,7 @@ public: \param bNoCheck \return bool */ - bool add(cPerson* lpPersons, bool bNoCheck = false); + bool add(cPerson* lpPerson, bool bNoCheck = false); /*! \brief @@ -180,7 +180,15 @@ public: \param iID \return cPerson */ - cPerson* find(cPerson* lpPersons); + cPerson* find(cPerson* lpPerson); + /*! + \brief + + \fn remove + \param lpPerson + \return bool + */ + bool remove(cPerson* lpPerson); /*! \brief diff --git a/ctoolboxperson.cpp b/ctoolboxperson.cpp index 00fbe7a..cc225ee 100644 --- a/ctoolboxperson.cpp +++ b/ctoolboxperson.cpp @@ -1,23 +1,62 @@ #include "ctoolboxperson.h" #include "ui_ctoolboxperson.h" +#include +#include + +#include + +#include + cToolBoxPerson::cToolBoxPerson(QWidget *parent) : QWidget(parent), ui(new Ui::cToolBoxPerson), - m_bLoading(true) + m_bLoading(true), + m_bEditing(false) +{ + initUI(); + createActions(); +} + +cToolBoxPerson::~cToolBoxPerson() +{ + delete ui; +} + +void cToolBoxPerson::initUI() { ui->setupUi(this); m_lpPersonListModel = new QStandardItemModel; ui->m_lpPersonList->setModel(m_lpPersonListModel); - connect(m_lpPersonListModel, SIGNAL(dataChanged(QModelIndex, QModelIndex, QVector)), SLOT(personChanged(QModelIndex, QModelIndex, QVector))); + ui->m_lpEdit->setEnabled(false); + ui->m_lpDelete->setEnabled(false); } -cToolBoxPerson::~cToolBoxPerson() +void cToolBoxPerson::createActions() { - delete ui; + m_lpPersonAddAction = new QAction(tr("add person"), this); + m_lpPersonAddAction->setStatusTip(tr("add a new person")); + connect(m_lpPersonAddAction, &QAction::triggered, this, &cToolBoxPerson::onPersonAdd); + connect(ui->m_lpAdd, &QPushButton::clicked, this, &cToolBoxPerson::onPersonAdd); + + m_lpPersonEditAction = new QAction(tr("edit person"), this); + m_lpPersonEditAction->setStatusTip(tr("edit this person")); + connect(m_lpPersonEditAction, &QAction::triggered, this, &cToolBoxPerson::onPersonEdit); + connect(ui->m_lpEdit, &QPushButton::clicked, this, &cToolBoxPerson::onPersonEdit); + + m_lpPersonDeleteAction = new QAction(tr("delete person"), this); + m_lpPersonDeleteAction->setStatusTip(tr("delete this person")); + connect(m_lpPersonDeleteAction, &QAction::triggered, this, &cToolBoxPerson::onPersonDelete); + connect(ui->m_lpDelete, &QPushButton::clicked, this, &cToolBoxPerson::onPersonDelete); + + connect(ui->m_lpPersonList->selectionModel(), &QItemSelectionModel::selectionChanged, this, &cToolBoxPerson::onPersonSelected); + + connect(m_lpPersonListModel, SIGNAL(dataChanged(QModelIndex, QModelIndex, QVector)), SLOT(personChanged(QModelIndex, QModelIndex, QVector))); + connect(ui->m_lpPersonList, &QTreeView::customContextMenuRequested, this, &cToolBoxPerson::onPersonViewContextMenu); + connect(m_lpPersonListModel, &QStandardItemModel::itemChanged, this, &cToolBoxPerson::onPersonChanged); } void cToolBoxPerson::setPersonList(cPersonList* lpPersonList) @@ -88,6 +127,20 @@ void cToolBoxPerson::setPicture(cPictureList& pictureList) m_bLoading = false; } +void cToolBoxPerson::onPersonSelected(const QItemSelection& /*selection*/, const QItemSelection& /*previous*/) +{ + if(ui->m_lpPersonList->selectionModel()->selectedIndexes().count() == 1) + { + ui->m_lpEdit->setEnabled(true); + ui->m_lpDelete->setEnabled(true); + } + else if(ui->m_lpPersonList->selectionModel()->selectedIndexes().count() > 1) + { + ui->m_lpEdit->setEnabled(false); + ui->m_lpDelete->setEnabled(true); + } +} + void cToolBoxPerson::personChanged(const QModelIndex& /*topLeft*/, const QModelIndex& /*bottomright*/, const QVector& /*roles*/) { if(!m_pictureList.count()) @@ -119,3 +172,126 @@ void cToolBoxPerson::personChanged(const QModelIndex& /*topLeft*/, const QModelI for(cPictureList::iterator i = m_pictureList.begin();i != m_pictureList.end();i++) (*i)->toDB(); } + +void cToolBoxPerson::onPersonAdd() +{ + QInputDialog input(this); + + input.setLabelText(tr("name:")); + input.setWindowTitle(tr("New Person")); + if(input.exec() == QDialog::Rejected) + return; + + if(input.textValue().isEmpty()) + return; + + cPerson* lpPerson = new cPerson; + lpPerson->setName(input.textValue()); + if(!lpPerson->toDB()) + { + delete lpPerson; + return; + } + + m_lpPersonList->add(lpPerson); + + m_bLoading = true; + + QStandardItem* lpItem = new QStandardItem(lpPerson->name()); + lpItem->setData(QVariant::fromValue(lpPerson), Qt::UserRole+1); + lpItem->setCheckable(true); + m_lpPersonListModel->appendRow(lpItem); + m_lpPersonListModel->sort(0); + + m_bLoading = false; +} + +void cToolBoxPerson::onPersonEdit() +{ + if(ui->m_lpPersonList->selectionModel()->selectedIndexes().count() != 1) + return; + + QStandardItem* lpItem = m_lpPersonListModel->itemFromIndex(ui->m_lpPersonList->selectionModel()->selectedIndexes()[0]); + if(!lpItem) + return; + + cPerson* lpPerson = lpItem->data(Qt::UserRole+1).value(); + if(!lpPerson) + return; + + QInputDialog input(this); + + input.setLabelText(tr("name:")); + input.setWindowTitle(tr("Edit Person")); + input.setTextValue(lpPerson->name()); + + if(input.exec() == QDialog::Rejected) + return; + + if(input.textValue().isEmpty()) + return; + + lpItem->setText(input.textValue()); +} + +void cToolBoxPerson::onPersonDelete() +{ + for(int x = ui->m_lpPersonList->selectionModel()->selectedIndexes().count()-1;x >= 0; x--) + { + QModelIndex index = ui->m_lpPersonList->selectionModel()->selectedIndexes()[x]; + QStandardItem* lpItem = m_lpPersonListModel->itemFromIndex(index); + if(lpItem) + { + cPerson* lpPerson = lpItem->data(Qt::UserRole+1).value(); + if(lpPerson) + { + if(QMessageBox::question(this, tr("Delete Person"), QString(tr("Are you sure you want to delete %1?")).arg(lpPerson->name())) == QMessageBox::Yes) + { + if(!m_lpPersonList->remove(lpPerson)) + QMessageBox::critical(this, tr("Delete Person"), QString(tr("%1 is in use and can't be deleted!")).arg(lpPerson->name())); + else + m_lpPersonListModel->removeRow(index.row()); + } + } + } + } + +} + +void cToolBoxPerson::onPersonViewContextMenu(const QPoint& pos) +{ + QMenu menu(this); + + menu.addAction(m_lpPersonAddAction); + + if(ui->m_lpPersonList->selectionModel()->selectedIndexes().count() == 1) + menu.addAction(m_lpPersonEditAction); + if(ui->m_lpPersonList->selectionModel()->selectedIndexes().count() >= 1) + menu.addAction(m_lpPersonDeleteAction); + + menu.exec(ui->m_lpPersonList->mapToGlobal(pos)); +} + +void cToolBoxPerson::onPersonChanged(QStandardItem* lpItem) +{ + if(m_bEditing) + return; + + cPerson* lpPerson = lpItem->data(Qt::UserRole+1).value(); + if(!lpPerson) + return; + + if(lpItem->text() == lpPerson->name()) + return; + + QString szOldName = lpPerson->name(); + lpPerson->setName(lpItem->text()); + if(!lpPerson->toDB()) + { + QMessageBox::critical(this, tr("ERROR"), QString(tr("%1 already exists.").arg(lpItem->text()))); + m_bEditing = true; + lpItem->setText(szOldName); + lpPerson->setName(szOldName); + m_bEditing = false; + } +} diff --git a/ctoolboxperson.h b/ctoolboxperson.h index 372c20e..5c35750 100644 --- a/ctoolboxperson.h +++ b/ctoolboxperson.h @@ -12,6 +12,7 @@ #include #include +#include namespace Ui { @@ -64,7 +65,34 @@ private: cPictureList m_pictureList; /*!< TODO: describe */ bool m_bLoading; /*!< TODO: describe */ + QAction* m_lpPersonAddAction; /*!< TODO: describe */ + QAction* m_lpPersonEditAction; /*!< TODO: describe */ + QAction* m_lpPersonDeleteAction; /*!< TODO: describe */ + + bool m_bEditing; /*!< TODO: describe */ + + /*! + \brief + + \fn initUI + */ + void initUI(); + /*! + \brief + + \fn createActions + */ + void createActions(); + private slots: + /*! + \brief + + \fn onPersonSelected + \param selection + \param previous + */ + void onPersonSelected(const QItemSelection& selection, const QItemSelection& previous); /*! \brief @@ -74,6 +102,40 @@ private slots: \param roles */ void personChanged(const QModelIndex& topLeft, const QModelIndex& bottomright, const QVector& roles); + /*! + \brief + + \fn onPersonAdd + */ + void onPersonAdd(); + /*! + \brief + + \fn onPersonEdit + */ + void onPersonEdit(); + /*! + \brief + + \fn onPersonDelete + */ + void onPersonDelete(); + + /*! + \brief + + \fn onPersonViewContextMenu + \param pos + */ + void onPersonViewContextMenu(const QPoint& pos); + + /*! + \brief + + \fn onPersonChanged + \param lpItem + */ + void onPersonChanged(QStandardItem* lpItem); }; #endif // CTOOLBOXPERSON_H diff --git a/ctoolboxperson.ui b/ctoolboxperson.ui index aaf56a3..cdef3cb 100644 --- a/ctoolboxperson.ui +++ b/ctoolboxperson.ui @@ -18,12 +18,18 @@ + + Qt::CustomContextMenu + - QAbstractItemView::NoEditTriggers + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed true + + QAbstractItemView::ExtendedSelection + false diff --git a/pictureLibrary.pro b/pictureLibrary.pro index 814abc2..5d4ad41 100644 --- a/pictureLibrary.pro +++ b/pictureLibrary.pro @@ -71,7 +71,9 @@ SOURCES += \ ccombopicker.cpp \ cflag.cpp \ cperson.cpp \ - ctoolboxperson.cpp + ctoolboxperson.cpp \ + clabel.cpp \ + cimageviewer.cpp HEADERS += \ cmainwindow.h \ @@ -91,7 +93,9 @@ HEADERS += \ ccombopicker.h \ cflag.h \ cperson.h \ - ctoolboxperson.h + ctoolboxperson.h \ + clabel.h \ + cimageviewer.h FORMS += \ cmainwindow.ui \ @@ -100,7 +104,8 @@ FORMS += \ cdatetimepicker.ui \ cdatepicker.ui \ ccombopicker.ui \ - ctoolboxperson.ui + ctoolboxperson.ui \ + cimageviewer.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin