initial commit
This commit is contained in:
+405
-9
@@ -8,11 +8,22 @@
|
||||
|
||||
#include "cimage.h"
|
||||
#include "cexportdialog.h"
|
||||
#include "clogwindow.h"
|
||||
|
||||
#include <QImageReader>
|
||||
#include <QImageWriter>
|
||||
#include <QSqlQuery>
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QElapsedTimer>
|
||||
|
||||
|
||||
void addToExportLog(QString& exportLog, const QString& text)
|
||||
{
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
|
||||
exportLog.append(" <tr>\n <td class='time'>" + now.toString("yyyy-mm-dd hh:MM:ss") + "</td>\n <td>" + text + "</td>\n </tr>\n");
|
||||
}
|
||||
|
||||
cMainWindow::cMainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
@@ -30,7 +41,10 @@ cMainWindow::cMainWindow(QWidget *parent) :
|
||||
m_thumbnailViewModel(nullptr),
|
||||
m_thumbnailSortFilterProxyModel(nullptr),
|
||||
m_rootItem(nullptr),
|
||||
m_loading(false)
|
||||
m_loading(false),
|
||||
m_working(false),
|
||||
m_stopIt(false),
|
||||
m_exportLog("")
|
||||
{
|
||||
initUI();
|
||||
createActions();
|
||||
@@ -197,6 +211,10 @@ void cMainWindow::loadData()
|
||||
m_thumbnailViewModel->clear();
|
||||
m_folderViewModel->clear();
|
||||
|
||||
QElapsedTimer timer;
|
||||
|
||||
timer.start();
|
||||
|
||||
if(m_albumRootsList)
|
||||
delete m_albumRootsList;
|
||||
|
||||
@@ -251,6 +269,8 @@ void cMainWindow::loadData()
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug() << "Loading took " << timer.elapsed() << "ms";
|
||||
|
||||
displayData();
|
||||
ui->m_folderView->expandAll();
|
||||
}
|
||||
@@ -338,8 +358,9 @@ QStandardItem* cMainWindow::findParentItem(QStandardItemModel* model, QStandardI
|
||||
|
||||
void cMainWindow::initSignals()
|
||||
{
|
||||
connect(m_folderViewModel, &QStandardItemModel::itemChanged, this, &cMainWindow::onFolderViewItemChanged);
|
||||
connect(ui->m_folderView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &cMainWindow::onFolderSelected);
|
||||
connect(m_folderViewModel, &QStandardItemModel::itemChanged, this, &cMainWindow::onFolderViewItemChanged);
|
||||
connect(ui->m_folderView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &cMainWindow::onFolderSelected);
|
||||
connect(ui->m_thumbnailView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &cMainWindow::onThumbnailSelected);
|
||||
}
|
||||
|
||||
void cMainWindow::onFolderViewItemChanged(QStandardItem* item)
|
||||
@@ -396,6 +417,7 @@ void cMainWindow::onFolderSelected(const QItemSelection& /*selection*/, const QI
|
||||
return;
|
||||
|
||||
m_thumbnailViewModel->clear();
|
||||
ui->m_information->clear();
|
||||
|
||||
if(!ui->m_folderView->selectionModel()->selectedIndexes().count())
|
||||
return;
|
||||
@@ -417,18 +439,71 @@ void cMainWindow::onFolderSelected(const QItemSelection& /*selection*/, const QI
|
||||
if(!images)
|
||||
continue;
|
||||
|
||||
QIcon icon = QIcon(QPixmap::fromImage(*images->thumbnail()));
|
||||
QStandardItem* item = new QStandardItem(icon, images->name());
|
||||
item->setTextAlignment(Qt::AlignCenter);
|
||||
item->setData(QVariant::fromValue(images));
|
||||
item->setCheckable(true);
|
||||
QStandardItem* item = images->item();
|
||||
if(loaded)
|
||||
item->setCheckState(state);
|
||||
images->setItem(item);
|
||||
|
||||
m_thumbnailViewModel->appendRow(item);
|
||||
}
|
||||
}
|
||||
|
||||
void cMainWindow::onThumbnailSelected(const QItemSelection& /*selection*/, const QItemSelection& /*previous*/)
|
||||
{
|
||||
QModelIndex index = ui->m_thumbnailView->selectionModel()->selectedIndexes()[0];
|
||||
if(!index.isValid())
|
||||
return;
|
||||
|
||||
cImages* images = m_thumbnailSortFilterProxyModel->data(index, Qt::UserRole+1).value<cImages*>();
|
||||
|
||||
if(images)
|
||||
{
|
||||
QString information;
|
||||
information = "<!DOCTYPE html>\n";
|
||||
information.append("<html>\n");
|
||||
information.append(" <head>\n");
|
||||
information.append(" <style>\n");
|
||||
information.append(" body { background-color: white; color: black; }\n");
|
||||
information.append(" h1 { color: black; }\n");
|
||||
information.append(" p { color: black; }\n");
|
||||
information.append(" .time { color: darkgrey; }\n");
|
||||
information.append(" .title { color: darkblue; font-weight: bold; }\n");
|
||||
information.append(" .option { color: darkmagenta; font-style: italic; }\n");
|
||||
information.append(" .optionok { color: green; font-style: italic; }\n");
|
||||
information.append(" .optionnok { color: red; font-style: italic; }\n");
|
||||
information.append(" td { color: black; }\n");
|
||||
information.append(" table { width: 100%; }\n");
|
||||
information.append(" </style>\n");
|
||||
information.append(" </head>\n");
|
||||
information.append(" <body>\n");
|
||||
information.append(" <table style='width:100%'>\n");
|
||||
information.append(" <tr><td span=2 class='title'>File properties</td></tr>");
|
||||
information.append(QString(" <tr><td><i>File:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->name()));
|
||||
information.append(QString(" <tr><td><i>Folder:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->albums()->path()));
|
||||
information.append(QString(" <tr><td><i>Date:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->modificationDate().toString()));
|
||||
information.append(QString(" <tr><td><i>Size:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->fileSize()));
|
||||
information.append(" <tr><td span=2 class='title'>Image properties</td></tr>\n");
|
||||
information.append(QString(" <tr><td><i>Type:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->imageInformation().format));
|
||||
information.append(QString(" <tr><td><i>Size:</i></td><td align=\"right\">%1x%2</td></tr>\n").arg(images->imageInformation().width).arg(images->imageInformation().height));
|
||||
information.append(QString(" <tr><td><i>Color depth:</i></td><td align=\"right\">%1 bpp</td></tr>\n").arg(images->imageInformation().colorDepth));
|
||||
information.append(" <tr><td span=2 class='title'>Shoot properties</td></tr>\n");
|
||||
information.append(QString(" <tr><td><i>Camera:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->imageMetadata().model));
|
||||
information.append(QString(" <tr><td><i>Taken:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->imageInformation().creationDate.toString()));
|
||||
information.append(QString(" <tr><td><i>Lens:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->imageMetadata().lens));
|
||||
information.append(QString(" <tr><td><i>Aparture:</i></td><td align=\"right\">F%1</td></tr>\n").arg(images->imageMetadata().aparture));
|
||||
information.append(QString(" <tr><td><i>Focal length:</i></td><td align=\"right\">%1</td></tr>\n").arg(images->imageMetadata().focalLength));
|
||||
information.append(QString(" <tr><td><i>Focal length (35mm):</i></td><td align=\"right\">%1</td></tr>\n").arg(images->imageMetadata().focalLength35));
|
||||
information.append(QString(" <tr><td><i>Exposure time:</i></td><td align=\"right\">1/%1</td></tr>\n").arg(1/images->imageMetadata().exposureTime));
|
||||
information.append(QString(" <tr><td><i>Sensitivity:</i></td><td align=\"right\">ISO %1</td></tr>\n").arg(images->imageMetadata().sensitivity));
|
||||
information.append(" </table>\n");
|
||||
information.append(" </body>\n");
|
||||
m_exportLog.append("</html>\n");
|
||||
|
||||
ui->m_information->setText(information);
|
||||
}
|
||||
else
|
||||
ui->m_information->clear();
|
||||
}
|
||||
|
||||
void cMainWindow::onRefreshList()
|
||||
{
|
||||
loadData();
|
||||
@@ -436,11 +511,332 @@ void cMainWindow::onRefreshList()
|
||||
|
||||
void cMainWindow::onExport()
|
||||
{
|
||||
bool hasExport = false;
|
||||
|
||||
for(int x = 0;x < m_albumsList->count();x++)
|
||||
{
|
||||
cAlbums* albums = m_albumsList->at(x);
|
||||
QStandardItem* item = albums->item();
|
||||
|
||||
if(item)
|
||||
{
|
||||
if(item->checkState() == Qt::Checked)
|
||||
{
|
||||
hasExport = true;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
if(albums)
|
||||
{
|
||||
cImagesList* imagesList = albums->imagesList();
|
||||
|
||||
if(imagesList)
|
||||
{
|
||||
for(int y = 0;y < imagesList->count();y++)
|
||||
{
|
||||
cImages* images = albums->imagesList()->at(y);
|
||||
|
||||
if(images)
|
||||
{
|
||||
QStandardItem* item = images->item();
|
||||
if(item)
|
||||
{
|
||||
if(item->checkState() == Qt::Checked)
|
||||
{
|
||||
hasExport = true;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
if(!hasExport)
|
||||
{
|
||||
QMessageBox::information(this, "Export", tr("No files selected for export."));
|
||||
return;
|
||||
}
|
||||
|
||||
cExportDialog exportDialog(m_imageFormats, this);
|
||||
if(exportDialog.exec() == QDialog::Rejected)
|
||||
return;
|
||||
|
||||
m_working = true;
|
||||
m_stopIt = false;
|
||||
// setActionEnabled(false, false, false, false, false, true);
|
||||
doExport();
|
||||
// setActionEnabled(true, true, true, true, true, false);
|
||||
m_working = false;
|
||||
}
|
||||
|
||||
void cMainWindow::onStop()
|
||||
{
|
||||
}
|
||||
|
||||
void cMainWindow::doExport()
|
||||
{
|
||||
EXPORTSETTINGS exportSettings;
|
||||
OVERWRITE overwrite = OVERWRITE_ASK;
|
||||
|
||||
m_exportLog = "<!DOCTYPE html>\n";
|
||||
m_exportLog.append("<html>\n");
|
||||
m_exportLog.append("<head>\n");
|
||||
m_exportLog.append("<style>\n");
|
||||
m_exportLog.append("body { background-color: white; color: black; }\n");
|
||||
m_exportLog.append("h1 { color: black; }\n");
|
||||
m_exportLog.append("p { color: black; }\n");
|
||||
m_exportLog.append(".time { color: darkgrey; }");
|
||||
m_exportLog.append(".title { color: darkblue; font-weight: bold; }");
|
||||
m_exportLog.append(".option { color: darkmagenta; font-style: italic; }");
|
||||
m_exportLog.append(".optionok { color: green; font-style: italic; }");
|
||||
m_exportLog.append(".optionnok { color: red; font-style: italic; }");
|
||||
m_exportLog.append("td { color: black; }\n");
|
||||
m_exportLog.append("</style>\n");
|
||||
m_exportLog.append("</head>\n");
|
||||
m_exportLog.append("<body>\n");
|
||||
|
||||
addToExportLog(m_exportLog, "<span class='title'>Start Export</span>");
|
||||
|
||||
getExportSettings(exportSettings);
|
||||
|
||||
qint32 fileCount = 0;
|
||||
for(int x = 0;x < m_albumsList->count();x++)
|
||||
{
|
||||
cAlbums* albums = m_albumsList->at(x);
|
||||
|
||||
if(albums)
|
||||
{
|
||||
cImagesList* imagesList = albums->imagesList();
|
||||
|
||||
if(imagesList)
|
||||
{
|
||||
for(int y = 0;y < imagesList->count();y++)
|
||||
{
|
||||
cImages* images = albums->imagesList()->at(y);
|
||||
|
||||
if(images)
|
||||
{
|
||||
QStandardItem* item = images->item();
|
||||
if(item)
|
||||
{
|
||||
if(item->checkState() == Qt::Checked)
|
||||
fileCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
addToExportLog(m_exportLog, QString("Files to export: <span class='option'>%1</span>").arg(fileCount));
|
||||
|
||||
m_progressBar->setRange(0, fileCount);
|
||||
m_progressBar->setValue(0);
|
||||
m_progressBar->setVisible(true);
|
||||
|
||||
qint32 curFile = 0;
|
||||
for(int x = 0;x < m_albumsList->count();x++)
|
||||
{
|
||||
cAlbums* albums = m_albumsList->at(x);
|
||||
|
||||
if(albums)
|
||||
{
|
||||
cImagesList* imagesList = albums->imagesList();
|
||||
|
||||
if(imagesList)
|
||||
{
|
||||
for(int y = 0;y < imagesList->count();y++)
|
||||
{
|
||||
cImages* images = albums->imagesList()->at(y);
|
||||
|
||||
if(images)
|
||||
{
|
||||
QStandardItem* item = images->item();
|
||||
if(item)
|
||||
{
|
||||
if(item->checkState() == Qt::Checked)
|
||||
{
|
||||
m_progressBar->setValue(curFile);
|
||||
ui->m_statusBar->showMessage(images->name());
|
||||
qApp->processEvents();
|
||||
// overwrite = exportFile(exportSettings, overwrite);
|
||||
|
||||
curFile++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// for(int i = 0;i < m_lpFileListModel->rowCount();i++)
|
||||
// {
|
||||
// QStandardItem* lpItem = m_lpFileListModel->item(i, 0);
|
||||
// if(!lpItem)
|
||||
// continue;
|
||||
|
||||
// cEXIF* lpExif = lpItem->data(Qt::UserRole+1).value<cEXIF*>();
|
||||
// if(!lpExif)
|
||||
// continue;
|
||||
|
||||
// overwrite = exportFile(exportSettings, lpExif, overwrite);
|
||||
|
||||
// m_lpProgressBar->setValue(i+1);
|
||||
|
||||
// qApp->processEvents();
|
||||
|
||||
// if(m_stopIt)
|
||||
// {
|
||||
// addToExportLog(m_exportLog, "<b>aborted.</b>");
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
m_progressBar->setVisible(false);
|
||||
ui->m_statusBar->showMessage(tr("export done."), 3000);
|
||||
|
||||
addToExportLog(m_exportLog, "<b>done.</b>");
|
||||
m_exportLog.append("</body>\n");
|
||||
m_exportLog.append("</html>\n");
|
||||
|
||||
cLogWindow logWindow;
|
||||
|
||||
logWindow.setText(m_exportLog);
|
||||
logWindow.exec();
|
||||
}
|
||||
|
||||
/*
|
||||
DIRECTORY_METHOD directoryMethod;
|
||||
QString directory;
|
||||
bool keepStructure;
|
||||
QString directoryTag;
|
||||
STRIP_LAST_FOLDER_METHOD stripLastFolderMethod;
|
||||
QStringList stripLastFolderIfList;
|
||||
FILE_METHOD fileMethod;
|
||||
FILE_ADD fileAdd;
|
||||
QString fileTag;
|
||||
OVERWRITE_METHOD overwriteMethod;
|
||||
bool copyEXIF;
|
||||
QString fileFormat;
|
||||
int quality;
|
||||
*/
|
||||
void cMainWindow::getExportSettings(EXPORTSETTINGS& exportSettings)
|
||||
{
|
||||
QSettings settings;
|
||||
QString tmp;
|
||||
|
||||
tmp = settings.value("export/directoryMethod", QVariant::fromValue(QString("keepDirectory"))).toString();
|
||||
|
||||
addToExportLog(m_exportLog, "<b>Settings:</b>");
|
||||
|
||||
exportSettings.directory = settings.value("export/destinationPath", QVariant::fromValue(QString(""))).toString();
|
||||
exportSettings.keepStructure = settings.value("export/keepStructure", QVariant::fromValue(false)).toBool();
|
||||
exportSettings.directoryTag = settings.value("export/destinationPathTag", QVariant::fromValue(QString(""))).toString();
|
||||
|
||||
if(tmp == "newDirectoryTag")
|
||||
{
|
||||
exportSettings.directoryMethod = DIRECTORY_METHOD_TAG;
|
||||
addToExportLog(m_exportLog, "Directory Name Method: <span class='option'>rename Directory by TAG</span>");
|
||||
addToExportLog(m_exportLog, " - used TAG: <span class='option'>" + exportSettings.directoryTag + "</span>");
|
||||
}
|
||||
else if(tmp == "newDirectory")
|
||||
{
|
||||
exportSettings.directoryMethod = DIRECTORY_METHOD_NEW;
|
||||
addToExportLog(m_exportLog, "Directory Name Method: <span class='option'>create new directory</span>");
|
||||
addToExportLog(m_exportLog, " - used Directory: <span class='option'>" + exportSettings.directory + "</span>");
|
||||
}
|
||||
else
|
||||
{
|
||||
exportSettings.directoryMethod = DIRECTORY_METHOD_KEEP;
|
||||
addToExportLog(m_exportLog, "Directory Name Method: <span class='option'>keep directory</span>");
|
||||
}
|
||||
|
||||
addToExportLog(m_exportLog, QString("Keep old Structure: <span class='option'>%1</span>").arg(exportSettings.keepStructure ? "yes" : "no"));
|
||||
|
||||
bool stripLastFolder = settings.value("export/stripLastDirectory", QVariant::fromValue(false)).toBool();
|
||||
bool stripLastFolderIf = settings.value("export/stripLastDirectoryIf", QVariant::fromValue(false)).toBool();
|
||||
|
||||
if(stripLastFolder)
|
||||
{
|
||||
if(stripLastFolderIf)
|
||||
{
|
||||
exportSettings.stripLastFolderMethod = STRIP_LAST_FOLDER_METHOD::STRIP_LAST_FOLDER_IF;
|
||||
exportSettings.stripLastFolderIfList = settings.value("export/stripLastDirectoryIfList", QVariant::fromValue(QString(""))).toString().split("\n");
|
||||
addToExportLog(m_exportLog, "Strip last folder: <span class='option'>yes</span>");
|
||||
addToExportLog(m_exportLog, QString(" - folders to strip: <span class='option'>%1</span>").arg(exportSettings.stripLastFolderIfList.join(", ")));
|
||||
}
|
||||
else
|
||||
{
|
||||
exportSettings.stripLastFolderMethod = STRIP_LAST_FOLDER_METHOD::STRIP_LAST_FOLDER;
|
||||
addToExportLog(m_exportLog, "Strip last folder: <span class='option'>yes</span>");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
exportSettings.stripLastFolderMethod = STRIP_LAST_FOLDER_METHOD::STRIP_LAST_FOLDER_NO;
|
||||
addToExportLog(m_exportLog, "Strip last folder: <span class='option'>no</span>");
|
||||
}
|
||||
|
||||
tmp = settings.value("export/filenamePlus", QVariant::fromValue(QString("converted"))).toString();
|
||||
|
||||
if(tmp == "TAG")
|
||||
exportSettings.fileAdd = FILE_ADD_TAG;
|
||||
else
|
||||
exportSettings.fileAdd = FILE_ADD_CONVERTED;
|
||||
|
||||
exportSettings.fileTag = settings.value("export/fileTag", QVariant::fromValue(QString(""))).toString();
|
||||
|
||||
tmp = settings.value("export/fileMethod", QVariant::fromValue(QString("keepFilename"))).toString();
|
||||
|
||||
if(tmp == "newFilename")
|
||||
{
|
||||
exportSettings.fileMethod = FILE_METHOD_RENAME;
|
||||
addToExportLog(m_exportLog, "File Name Method: <span class='option'>FILE_METHOD_RENAME</span>");
|
||||
|
||||
if(exportSettings.fileAdd == FILE_ADD_TAG)
|
||||
addToExportLog(m_exportLog, " - used TAG: <span class='option'>" + exportSettings.fileTag + "</span>");
|
||||
else
|
||||
addToExportLog(m_exportLog, " - add <span class='option'>'_converted'</span>");
|
||||
}
|
||||
else
|
||||
{
|
||||
exportSettings.fileMethod = FILE_METHOD_KEEP;
|
||||
addToExportLog(m_exportLog, "File Name Method: <span class='option'>FILE_METHOD_KEEP</span>");
|
||||
}
|
||||
|
||||
|
||||
tmp = settings.value("export/overwrite", QVariant::fromValue(QString("ask"))).toString();
|
||||
|
||||
if(tmp == "no")
|
||||
{
|
||||
exportSettings.overwriteMethod = OVERWRITE_METHOD_NOEXPORT;
|
||||
addToExportLog(m_exportLog, "Existing File Overwrite Mode: <span class='option'>do not export existing file</span>");
|
||||
}
|
||||
else if(tmp == "overwrite")
|
||||
{
|
||||
exportSettings.overwriteMethod = OVERWRITE_METHOD_OVERWRITE;
|
||||
addToExportLog(m_exportLog, "Existing File Overwrite Mode: <span class='option'>overwrite existing file</span>");
|
||||
}
|
||||
else if(tmp == "rename")
|
||||
{
|
||||
exportSettings.overwriteMethod = OVERWRITE_METHOD_RENAME;
|
||||
addToExportLog(m_exportLog, "Existing File Overwrite Mode: <span class='option'>rename existing file</span>");
|
||||
}
|
||||
else
|
||||
{
|
||||
exportSettings.overwriteMethod = OVERWRITE_METHOD_ASK;
|
||||
addToExportLog(m_exportLog, "Existing File Overwrite Mode: <span class='option'>ask for overwrite</span>");
|
||||
}
|
||||
|
||||
exportSettings.copyEXIF = settings.value("export/copyEXIF", QVariant::fromValue(true)).toBool();
|
||||
exportSettings.fileFormat = settings.value("export/fileFormat").toString();
|
||||
exportSettings.quality = settings.value("export/quality", QVariant::fromValue(50)).toInt();
|
||||
|
||||
addToExportLog(m_exportLog, "File Format: <span class='option'>" + exportSettings.fileFormat + "</span>");
|
||||
addToExportLog(m_exportLog, "Default Output Quality: <span class='option'>" + QString::number(exportSettings.quality) + "</span>");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user