1 /* SPDX-FileCopyrightText: 2003-2020 Jesper K. Pedersen <blackie@kde.org>
2 
3    SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #include "InvalidDateFinder.h"
7 
8 #include "Window.h"
9 
10 #include <DB/FileInfo.h>
11 #include <DB/ImageDB.h>
12 #include <DB/ImageDate.h>
13 #include <DB/ImageInfo.h>
14 #include <Utilities/ShowBusyCursor.h>
15 
16 #include <KLocalizedString>
17 #include <KTextEdit>
18 #include <QDialogButtonBox>
19 #include <QGroupBox>
20 #include <QProgressDialog>
21 #include <QPushButton>
22 #include <QVBoxLayout>
23 #include <qapplication.h>
24 #include <qeventloop.h>
25 #include <qlayout.h>
26 #include <qradiobutton.h>
27 
28 using namespace MainWindow;
29 
InvalidDateFinder(QWidget * parent)30 InvalidDateFinder::InvalidDateFinder(QWidget *parent)
31     : QDialog(parent)
32 {
33     setWindowTitle(i18nc("@title:window", "Search for Images and Videos with Missing Dates"));
34     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
35     QWidget *mainWidget = new QWidget(this);
36     QVBoxLayout *mainLayout = new QVBoxLayout;
37     setLayout(mainLayout);
38     mainLayout->addWidget(mainWidget);
39 
40     QGroupBox *grp = new QGroupBox(i18n("Which Images and Videos to Display"));
41     QVBoxLayout *grpLay = new QVBoxLayout(grp);
42     mainLayout->addWidget(grp);
43 
44     m_dateNotTime = new QRadioButton(i18n("Search for images and videos with a valid date but an invalid time stamp"));
45     m_missingDate = new QRadioButton(i18n("Search for images and videos missing date and time"));
46     m_partialDate = new QRadioButton(i18n("Search for images and videos with only partial dates (like 1971 vs. 11/7-1971)"));
47     m_dateNotTime->setChecked(true);
48 
49     grpLay->addWidget(m_dateNotTime);
50     grpLay->addWidget(m_missingDate);
51     grpLay->addWidget(m_partialDate);
52 
53     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
54     okButton->setDefault(true);
55     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
56     connect(buttonBox, &QDialogButtonBox::accepted, this, &InvalidDateFinder::accept);
57     connect(buttonBox, &QDialogButtonBox::rejected, this, &InvalidDateFinder::reject);
58     mainLayout->addWidget(buttonBox);
59 }
60 
accept()61 void InvalidDateFinder::accept()
62 {
63     QDialog::accept();
64     Utilities::ShowBusyCursor dummy;
65 
66     // create the info dialog
67     QDialog *info = new QDialog;
68     QVBoxLayout *mainLayout = new QVBoxLayout;
69     info->setLayout(mainLayout);
70     info->setWindowTitle(i18nc("@title:window", "Image Info"));
71 
72     KTextEdit *edit = new KTextEdit(info);
73     mainLayout->addWidget(edit);
74     edit->setText(i18n("<h1>Here you may see the date changes for the displayed items.</h1>"));
75 
76     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok);
77     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
78     okButton->setDefault(true);
79     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
80     info->connect(buttonBox, &QDialogButtonBox::accepted, info, &QDialog::accept);
81     info->connect(buttonBox, &QDialogButtonBox::rejected, info, &QDialog::reject);
82     mainLayout->addWidget(buttonBox);
83 
84     // Now search for the images.
85     const auto images = DB::ImageDB::instance()->images();
86     DB::FileNameList toBeShown;
87     QProgressDialog dialog(nullptr);
88     dialog.setWindowTitle(i18nc("@title:window", "Reading File Properties"));
89     dialog.setMaximum(images.size());
90     dialog.setValue(0);
91     int progress = 0;
92 
93     for (const auto &info : images) {
94         dialog.setValue(++progress);
95         qApp->processEvents(QEventLoop::AllEvents);
96         if (dialog.wasCanceled())
97             break;
98         if (info->isNull())
99             continue;
100 
101         DB::ImageDate date = info->date();
102         bool show = false;
103         if (m_dateNotTime->isChecked()) {
104             DB::FileInfo fi = DB::FileInfo::read(info->fileName(), DB::EXIFMODE_DATE);
105             if (fi.dateTime().date() == date.start().date())
106                 show = (fi.dateTime().time() != date.start().time());
107             if (show) {
108                 edit->append(QString::fromLatin1("%1:<br/>existing = %2<br>new..... = %3")
109                                  .arg(info->fileName().relative())
110                                  .arg(date.start().toString())
111                                  .arg(fi.dateTime().toString()));
112             }
113         } else if (m_missingDate->isChecked()) {
114             show = !date.start().isValid();
115         } else if (m_partialDate->isChecked()) {
116             show = (date.start() != date.end());
117         }
118 
119         if (show)
120             toBeShown.append(info->fileName());
121     }
122 
123     if (m_dateNotTime->isChecked()) {
124         info->resize(800, 600);
125         edit->setReadOnly(true);
126         QFont f = edit->font();
127         f.setFamily(QString::fromLatin1("fixed"));
128         edit->setFont(f);
129         info->show();
130     } else
131         delete info;
132 
133     Window::theMainWindow()->showThumbNails(toBeShown);
134 }
135 
136 // vi:expandtab:tabstop=4 shiftwidth=4:
137