diff --git a/cimportdialog.cpp b/cimportdialog.cpp index d5e8edb..cdb914e 100644 --- a/cimportdialog.cpp +++ b/cimportdialog.cpp @@ -1,16 +1,44 @@ #include "cimportdialog.h" #include "ui_cimportdialog.h" +#include "common.h" + +#include "cpicture.h" + #include #include +#include #include +#include + +#include +#include + +#include +#include + cImportDialog::cImportDialog(QWidget *parent) : QDialog(parent), ui(new Ui::cImportDialog) +{ + initUI(); + createActions(); +} + +cImportDialog::~cImportDialog() +{ + delete ui; +} + +void cImportDialog::initUI() { ui->setupUi(this); + ui->m_lpProgress->setVisible(false); + + m_lpImportListModel = new QStandardItemModel; + ui->m_lpImportList->setModel(m_lpImportListModel); QSettings settings; @@ -26,24 +54,21 @@ cImportDialog::cImportDialog(QWidget *parent) : if(iX != -1 && iY != -1) move(iX, iY); } + + qint32 iWidth1 = settings.value("import/splitter1", QVariant::fromValue(-1)).toInt(); + qint32 iWidth2 = settings.value("import/splitter2", QVariant::fromValue(-1)).toInt(); + + ui->m_lpSplitter->setSizes(QList() << iWidth1 << iWidth2); + + ui->m_lpPath->setText(settings.value("import/path", QDir::homePath()).toString()); } -cImportDialog::~cImportDialog() +void cImportDialog::createActions() { - delete ui; -} - -void cImportDialog::on_m_lpPathSelect_clicked() -{ - QSettings settings; - QString szPath = settings.value("import/path", QDir::homePath()).toString(); - szPath = QFileDialog::getExistingDirectory(this, tr("Import Directory"), szPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); - - if(szPath.isEmpty()) - return; - - ui->m_lpPath->setText(szPath); - settings.setValue("import/path", szPath); + connect(ui->m_lpPathSelect, &QPushButton::clicked, this, &cImportDialog::onPathSelect); + connect(ui->m_lpRead, &QPushButton::clicked, this, &cImportDialog::onRead); + connect(ui->m_lpImport, &QPushButton::clicked, this, &cImportDialog::onImport); + connect(ui->m_lpImportList->selectionModel(), &QItemSelectionModel::selectionChanged, this, &cImportDialog::onThumbnailSelected); } void cImportDialog::closeEvent(QCloseEvent *event) @@ -60,3 +85,131 @@ void cImportDialog::closeEvent(QCloseEvent *event) event->accept(); } + +void cImportDialog::onPathSelect() +{ + QSettings settings; + QString szPath = settings.value("import/path", QDir::homePath()).toString(); + szPath = QFileDialog::getExistingDirectory(this, tr("Import Directory"), szPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + if(szPath.isEmpty()) + return; + + ui->m_lpPath->setText(szPath); + settings.setValue("import/path", szPath); +} + +void cImportDialog::onThumbnailSelected(const QItemSelection& /*selection*/, const QItemSelection& /*previous*/) +{ + cToolBoxInfo* lpToolBoxInfo = ui->m_lpInfo; + + if(ui->m_lpImportList->selectionModel()->selectedIndexes().count() != 1) + { + lpToolBoxInfo->setPicture(nullptr); + return; + } + + QStandardItem* lpItem = m_lpImportListModel->itemFromIndex(ui->m_lpImportList->currentIndex()); + cPicture* lpPicture = lpItem->data().value(); + lpToolBoxInfo->setPicture(lpPicture); +} + +void cImportDialog::accept() +{ + savePosition(); + QDialog::accept(); +} + +void cImportDialog::reject() +{ + savePosition(); + QDialog::reject(); +} + +void cImportDialog::savePosition() +{ + QSettings settings; + + settings.setValue("import/width", QVariant::fromValue(size().width())); + settings.setValue("import/height", QVariant::fromValue(size().height())); + settings.setValue("import/x", QVariant::fromValue(x())); + settings.setValue("import/y", QVariant::fromValue(y())); + + QList sizes = ui->m_lpSplitter->sizes(); + + for(int x = 0;x < sizes.count();x++) + settings.setValue(QString("import/splitter%1").arg(x+1), QVariant::fromValue(sizes[x])); +} + +void cImportDialog::onRead() +{ + if(ui->m_lpPath->text().isEmpty()) + { + QMessageBox::critical(this, tr("Error"), tr("no path given!")); + return; + } + + m_lpImportListModel->clear(); + + readDirectory(ui->m_lpPath->text(), ui->m_lpRecursive->isChecked()); +} + +void cImportDialog::onImport() +{ +} + +void cImportDialog::readDirectory(const QString& szPath, bool bRecursive) +{ + QMimeDatabase mimeDB; + QDir dir(szPath); + QStringList szDirs = dir.entryList(QDir::Dirs); + QFileInfoList szFiles = dir.entryInfoList(QDir::Files); + + if(bRecursive) + { + szDirs.removeAll("."); + szDirs.removeAll(".."); + + for(int x = 0;x < szDirs.count();x++) + readDirectory(szPath + QDir::separator() + szDirs[x], bRecursive); + } + + for(int x = 0;x < szFiles.count();x++) + { + QFileInfo fileInfo = szFiles[x]; + QMimeType mimeType = mimeDB.mimeTypeForFile(szFiles[x]); + + if(mimeType.name().startsWith("image")) + { + ui->m_lpStatusText->setText(QString(tr("found %1")).arg(fileInfo.fileName())); + qApp->processEvents(); + + cPicture* lpPicture = new cPicture; + QIcon icon; + + if(lpPicture->fromFile(fileInfo.filePath())) + { + if(lpPicture->thumbnail().width() != THUMBNAIL_WIDTH || lpPicture->thumbnail().height() != THUMBNAIL_HEIGHT) + { + QImage thumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, lpPicture->thumbnail().format()); + thumbnail.fill(Qt::black); + + QPainter painter(&thumbnail); + painter.drawImage((THUMBNAIL_WIDTH-lpPicture->thumbnail().width())/2, (THUMBNAIL_HEIGHT-lpPicture->thumbnail().height())/2, lpPicture->thumbnail()); + painter.end(); + icon = QIcon(QPixmap::fromImage(thumbnail)); + } + else + icon = QIcon(QPixmap::fromImage(lpPicture->thumbnail())); + + QStandardItem* lpItem = new QStandardItem(icon, lpPicture->fileName()); + lpItem->setTextAlignment(Qt::AlignCenter); + lpItem->setData(QVariant::fromValue(lpPicture)); + m_lpImportListModel->appendRow(lpItem); + qApp->processEvents(); + } + } + } + + ui->m_lpStatusText->setText(""); +} diff --git a/cimportdialog.h b/cimportdialog.h index d3cd8d5..6633bec 100644 --- a/cimportdialog.h +++ b/cimportdialog.h @@ -3,7 +3,9 @@ #include +#include #include +#include namespace Ui { @@ -19,11 +21,45 @@ public: ~cImportDialog(); private slots: - void on_m_lpPathSelect_clicked(); + /*! + \brief + + \fn onPathSelect + */ + void onPathSelect(); + /*! + \brief + + \fn onRead + */ + void onRead(); + /*! + \brief + + \fn onImport + */ + void onImport(); + /*! + \brief + \param selection + \param previous + \fn onThumbnailSelected + */ + void onThumbnailSelected(const QItemSelection& selection, const QItemSelection& previous); private: - Ui::cImportDialog *ui; + Ui::cImportDialog* ui; + QStandardItemModel* m_lpImportListModel; /**< TODO: describe */ + void initUI(); + void createActions(); + + void readDirectory(const QString& szPath, bool bRecursive); + + void accept(); + void reject(); + + void savePosition(); protected: /*! \brief diff --git a/cimportdialog.ui b/cimportdialog.ui index 96a0ced..62f74ad 100644 --- a/cimportdialog.ui +++ b/cimportdialog.ui @@ -6,16 +6,16 @@ 0 0 - 653 - 563 + 449 + 328 Import - + - + @@ -73,6 +73,20 @@ + + + + read + + + + + + + import + + + @@ -89,35 +103,98 @@ - - - QAbstractItemView::ExtendedSelection + + + Qt::Horizontal - - - 160 - 120 - + + + QAbstractItemView::ExtendedSelection + + + + 160 + 120 + + + + QListView::Adjust + + + + 180 + 180 + + + + QListView::IconMode + + + true + + + + + true + + + + + 0 + 0 + 69 + 167 + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + Qt::Horizontal - - QListView::IconMode + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - + + + cToolBoxInfo + QWidget +
ctoolboxinfo.h
+ 1 +
+
diff --git a/cmainwindow.cpp b/cmainwindow.cpp index ee15599..1524d1d 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -29,32 +29,6 @@ cMainWindow::cMainWindow(cSplashScreen* lpSplashScreen, QWidget *parent) : loadData(); updateRecentFileActions(); - -// cPicture picture; -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_1371.CR2"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\20181123_125857.jpg"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_1371.CR2"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\tiff\\BSG1.tiff"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_3444.CR2"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_0248_49_50_easyHDR-dramatic-strong.jpg"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_3466_7_8_easyHDR-dramatic-dark.tif"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_0248_49_50_easyHDR-dramatic-strong.jpg"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\DSC_0214.NEF"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\DSC_0215.NEF"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_1652.JPG"); -// picture.toDB(); -// picture.fromFile(QDir::homePath() + "\\OneDrive - WINDESIGN\\exif-samples-master\\IMG_1657.JPG"); -// picture.toDB(); } cMainWindow::~cMainWindow() @@ -128,6 +102,9 @@ void cMainWindow::createActions() void cMainWindow::loadData() { + m_pictureList.clear(); + m_lpThumbnailViewModel->clear(); + m_pictureList.load(); for(int x = 0;x < m_pictureList.count();x++) @@ -419,22 +396,8 @@ void cMainWindow::onFileImport() { cImportDialog importDialog(this); - QSettings settings; - qint32 iX = settings.value("import/x", QVariant::fromValue(-1)).toInt(); - qint32 iY = settings.value("import/y", QVariant::fromValue(-1)).toInt(); - qint32 iWidth = settings.value("import/width", QVariant::fromValue(-1)).toInt(); - qint32 iHeight = settings.value("import/height", QVariant::fromValue(-1)).toInt(); - - if(iX != -1 && iY != -1) - importDialog.move(iX, iY); - if(iWidth != -1 && iHeight != -1) - importDialog.resize(iWidth, iHeight); - if(importDialog.exec() == QDialog::Rejected) return; - settings.setValue("import/width", QVariant::fromValue(importDialog.size().width())); - settings.setValue("import/height", QVariant::fromValue(importDialog.size().height())); - settings.setValue("import/x", QVariant::fromValue(importDialog.x())); - settings.setValue("import/y", QVariant::fromValue(importDialog.y())); + loadData(); } diff --git a/cpicture.cpp b/cpicture.cpp index d82476b..2500e64 100644 --- a/cpicture.cpp +++ b/cpicture.cpp @@ -13,6 +13,7 @@ cPicture::cPicture(qint32 iID, QObject *parent) : m_iID(iID), m_szFileName(""), m_szFilePath(""), + m_iFileSize(0), m_imageWidth(0), m_imageHeight(0), m_cameraMake(""), @@ -35,14 +36,17 @@ cPicture::cPicture(qint32 iID, QObject *parent) : bool cPicture::fromFile(const QString& szFileName) { - cEXIF exif; + cEXIF exif; + QFileInfo fileInfo(szFileName); if(!exif.fromFile(szFileName)) return(false); m_iID = -1; - m_szFileName = exif.fileName(); + m_szFileName = fileInfo.fileName(); + m_szFilePath = fileInfo.absolutePath(); + m_iFileSize = fileInfo.size(); m_thumbnail = exif.thumbnail(); m_imageWidth = exif.imageWidth(); m_imageHeight = exif.imageHeight(); @@ -67,7 +71,6 @@ bool cPicture::fromFile(const QString& szFileName) if(!m_dateTime.isValid()) { - QFileInfo fileInfo(m_szFileName); setDateTime(fileInfo.birthTime()); } @@ -89,16 +92,18 @@ bool cPicture::toDB() } if(!query.next()) - query.prepare("INSERT INTO picture (fileName, imageWidth, imageHeight, cameraMake, cameraModel, dateTime, fNumber, iso, flashID, focalLength, lensMake, lensModel, exposureTime, exposureBias, exifVersion, dateTimeOriginal, dateTimeDigitized, whiteBalance, focalLength35, gps, thumbnail) VALUES (:fileName, :imageWidth, :imageHeight, :cameraMake, :cameraModel, :dateTime, :fNumber, :iso, :flashID, :focalLength, :lensMake, :lensModel, :exposureTime, :exposureBias, :exifVersion, :dateTimeOriginal, :dateTimeDigitized, :whiteBalance, :focalLength35, :gps, :thumbnail);"); + query.prepare("INSERT INTO picture (fileName, filePath, fileSize, imageWidth, imageHeight, cameraMake, cameraModel, dateTime, fNumber, iso, flashID, focalLength, lensMake, lensModel, exposureTime, exposureBias, exifVersion, dateTimeOriginal, dateTimeDigitized, whiteBalance, focalLength35, gps, thumbnail) VALUES (:fileName, :filePath, :fileSize, :imageWidth, :imageHeight, :cameraMake, :cameraModel, :dateTime, :fNumber, :iso, :flashID, :focalLength, :lensMake, :lensModel, :exposureTime, :exposureBias, :exifVersion, :dateTimeOriginal, :dateTimeDigitized, :whiteBalance, :focalLength35, :gps, :thumbnail);"); else - query.prepare("UPDATE picture SET fileName = :fileName, imageWidth = :imageWidth, imageHeight = :imageHeight, cameraMake = :cameraMake, cameraModel = :cameraModel, dateTime = :dateTime, fNumber = :fNumber, iso = :iso, flashID = :flashID, focalLength = :focalLength, lensMake = :lensMake, lensModel = :lensModel, exposureTime = :exposureTime, exposureBias = :exposureBias, exifVersion = :exifVersion, dateTimeOriginal = :dateTimeOriginal, dateTimeDigitized = :dateTimeDigitized, whiteBalance = :whiteBalance, focalLength35 = :focalLength35, gps = :gps, thumbnail = :thumbnail WHERE id = :id;"); + query.prepare("UPDATE picture SET fileName=:fileName, filePath=:filePath, fileSize=:fileSize, imageWidth=:imageWidth, imageHeight=:imageHeight, cameraMake=:cameraMake, cameraModel=:cameraModel, dateTime=:dateTime, fNumber=:fNumber, iso=:iso, flashID=:flashID, focalLength=:focalLength, lensMake=:lensMake, lensModel=:lensModel, exposureTime=:exposureTime, exposureBias=:exposureBias, exifVersion=:exifVersion, dateTimeOriginal=:dateTimeOriginal, dateTimeDigitized=:dateTimeDigitized, whiteBalance=:whiteBalance, focalLength35=:focalLength35, gps=:gps, thumbnail=:thumbnail WHERE id=:id;"); } else - query.prepare("INSERT INTO picture (fileName, imageWidth, imageHeight, cameraMake, cameraModel, dateTime, fNumber, iso, flashID, focalLength, lensMake, lensModel, exposureTime, exposureBias, exifVersion, dateTimeOriginal, dateTimeDigitized, whiteBalance, focalLength35, gps, thumbnail) VALUES (:fileName, :imageWidth, :imageHeight, :cameraMake, :cameraModel, :dateTime, :fNumber, :iso, :flashID, :focalLength, :lensMake, :lensModel, :exposureTime, :exposureBias, :exifVersion, :dateTimeOriginal, :dateTimeDigitized, :whiteBalance, :focalLength35, :gps, :thumbnail);"); + query.prepare("INSERT INTO picture (fileName, filePath, fileSize, imageWidth, imageHeight, cameraMake, cameraModel, dateTime, fNumber, iso, flashID, focalLength, lensMake, lensModel, exposureTime, exposureBias, exifVersion, dateTimeOriginal, dateTimeDigitized, whiteBalance, focalLength35, gps, thumbnail) VALUES (:fileName, :filePath, :fileSize, :imageWidth, :imageHeight, :cameraMake, :cameraModel, :dateTime, :fNumber, :iso, :flashID, :focalLength, :lensMake, :lensModel, :exposureTime, :exposureBias, :exifVersion, :dateTimeOriginal, :dateTimeDigitized, :whiteBalance, :focalLength35, :gps, :thumbnail);"); query.bindValue(":id", m_iID); query.bindValue(":fileName", m_szFileName); + query.bindValue(":filePath", m_szFilePath); + query.bindValue(":fileSize", m_iFileSize); query.bindValue(":imageWidth", m_imageWidth); query.bindValue(":imageHeight", m_imageHeight); query.bindValue(":cameraMake", m_cameraMake); @@ -375,6 +380,16 @@ QString cPicture::filePath() return(m_szFilePath); } +void cPicture::setFileSize(const qint64& fileSize) +{ + m_iFileSize = fileSize; +} + +qint64 cPicture::fileSize() +{ + return(m_iFileSize); +} + void cPicture::setThumbnail(const QImage& thumbnail) { m_thumbnail = thumbnail; @@ -398,6 +413,7 @@ bool cPictureList::load() query.prepare("SELECT id, " " fileName, " " filePath, " + " fileSize, " " imageWidth, " " imageHeight, " " cameraMake, " @@ -432,6 +448,7 @@ bool cPictureList::load() cPicture* lpPicture = add(query.value("id").toInt()); lpPicture->setFileName(query.value("fileName").toString()); lpPicture->setFilePath(query.value("filePath").toString()); + lpPicture->setFileSize(query.value("fileSize").toLongLong()); lpPicture->setImageWidth(query.value("imageWidth").toInt()); lpPicture->setImageHeight(query.value("imageHeight").toInt()); lpPicture->setCameraMake(query.value("cameraMake").toString()); diff --git a/cpicture.h b/cpicture.h index 8b6ddee..00a2e06 100644 --- a/cpicture.h +++ b/cpicture.h @@ -335,6 +335,19 @@ public: */ QString filePath(); + /** + * @brief + * + * @param fileSize + */ + void setFileSize(const qint64& fileSize); + /** + * @brief + * + * @return qint64 + */ + qint64 fileSize(); + /** * @brief * @@ -356,6 +369,7 @@ private: qint32 m_iID; /**< TODO: describe */ QString m_szFileName; /**< TODO: describe */ QString m_szFilePath; /**< TODO: describe */ + qint64 m_iFileSize; /**< TODO: describe */ QImage m_thumbnail; /**< TODO: describe */ qint32 m_imageWidth; /**< TODO: describe */ qint32 m_imageHeight; /**< TODO: describe */ diff --git a/cpicturelibrary.cpp b/cpicturelibrary.cpp index a2b2561..0d39595 100644 --- a/cpicturelibrary.cpp +++ b/cpicturelibrary.cpp @@ -110,6 +110,7 @@ bool cPictureLibrary::createDatabase() " id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, " " fileName TEXT, " " filePath TEXT, " + " fileSize BIGINT, " " imageWidth INTEGER, " " imageHeight INTEGER, " " cameraMake TEXT, " @@ -181,6 +182,8 @@ bool cPictureLibrary::updateDatabase3(qint32 version) if(!createTable("CREATE TABLE picture ( " " id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, " " fileName TEXT, " + " filePath TEXT, " + " fileSize BIGINT, " " imageWidth INTEGER, " " imageHeight INTEGER, " " cameraMake TEXT, "