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