Krita Source Code Documentation
Loading...
Searching...
No Matches
KoDocumentInfoDlg.cpp
Go to the documentation of this file.
1/*
2 This file is part of the KDE project
3
4 SPDX-FileCopyrightText: 2000 Simon Hausmann <hausmann@kde.org>
5 SPDX-FileCopyrightText: 2006 Martin Pfeiffer <hubipete@gmx.net>
6
7 SPDX-License-Identifier: LGPL-2.0-or-later
8*/
9
10#include "KoDocumentInfoDlg.h"
11
12#include "ui_koDocumentInfoAboutWidget.h"
13#include "ui_koDocumentInfoAuthorWidget.h"
14
15#include "KoDocumentInfo.h"
16#include "KisDocument.h"
17#include "KoPageWidgetItem.h"
18#include <KoIcon.h>
19#include <kstandardguiitem.h>
20
21
22#include <klocalizedstring.h>
23
24#include <kmainwindow.h>
25#include <KoDialog.h>
26#include <QUrl>
27#include <QCompleter>
28#include <QLineEdit>
29#include <QDateTime>
30#include <KisMimeDatabase.h>
31
32class KoPageWidgetItemAdapter : public KPageWidgetItem
33{
34public:
36 : KPageWidgetItem(item->widget(), item->name())
37 , m_item(item)
38 {
39 setHeader(item->name());
40 setIcon(KisIconUtils::loadIcon(item->iconName()));
41 }
42 ~KoPageWidgetItemAdapter() override { delete m_item; }
43
45 void apply() { m_item->apply(); }
46
47private:
49};
50
51
53{
54public:
57
58 KoDocumentInfo* info {nullptr};
60 Ui::KoDocumentInfoAboutWidget* aboutUi {nullptr};
61 Ui::KoDocumentInfoAuthorWidget* authorUi {nullptr};
62
63 bool documentSaved {false};
64};
65
66
68 : KPageDialog(parent)
70{
71 d->info = docInfo;
72
73 setWindowTitle(i18n("Document Information"));
74 // setInitialSize(QSize(500, 500));
75 setFaceType(KPageDialog::List);
76 setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
77 button(QDialogButtonBox::Ok)->setDefault(true);
78 KGuiItem::assign(button(QDialogButtonBox::Ok), KStandardGuiItem::ok());
79 KGuiItem::assign(button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel());
80
81 d->aboutUi = new Ui::KoDocumentInfoAboutWidget();
82 QWidget *infodlg = new QWidget();
83 d->aboutUi->setupUi(infodlg);
84 QStringList licenseExamples;
85 licenseExamples << "CC-BY 4.0" << "CC-BY-SA 4.0" << "CC-BY-SA-NC 4.0" << "CC-0";
86 QCompleter *examples = new QCompleter(licenseExamples);
87 examples->setCaseSensitivity(Qt::CaseInsensitive);
88 examples->setCompletionMode(QCompleter::PopupCompletion);
89 d->aboutUi->leLicense->setCompleter(examples);
90
91 KPageWidgetItem *page = new KPageWidgetItem(infodlg, i18n("General"));
92 page->setHeader(i18n("General"));
93
94 // Ugly hack, the mimetype should be a parameter, instead
95 KisDocument* doc = dynamic_cast< KisDocument* >(d->info->parent());
96 if (doc) {
98 } else {
99 // hide all entries not used in pages for KoDocumentInfoPropsPage
100 d->aboutUi->filePathInfoLabel->setVisible(false);
101 d->aboutUi->filePathLabel->setVisible(false);
102 d->aboutUi->filePathSeparatorLine->setVisible(false);
103 d->aboutUi->lblTypeDesc->setVisible(false);
104 d->aboutUi->lblType->setVisible(false);
105 }
106 addPage(page);
107 d->pages.append(page);
108
109 initAboutTab();
110
111 d->authorUi = new Ui::KoDocumentInfoAuthorWidget();
112 QWidget *authordlg = new QWidget();
113 d->authorUi->setupUi(authordlg);
114 page = new KPageWidgetItem(authordlg, i18n("Author"));
115 page->setHeader(i18n("Last saved by"));
116 page->setIcon(koIcon("user-identity"));
117 addPage(page);
118 d->pages.append(page);
119
121}
122
124{
125 delete d->authorUi;
126 delete d->aboutUi;
127 delete d;
128}
129
131{
132 // check if any pages veto the close
133 Q_FOREACH (KPageWidgetItem* item, d->pages) {
134 KoPageWidgetItemAdapter *page = dynamic_cast<KoPageWidgetItemAdapter*>(item);
135 if (page) {
136 if (page->shouldDialogCloseBeVetoed()) {
137 return;
138 }
139 }
140 }
141
142 // all fine, go and apply
144 Q_FOREACH (KPageWidgetItem* item, d->pages) {
145 KoPageWidgetItemAdapter *page = dynamic_cast<KoPageWidgetItemAdapter*>(item);
146 if (page) {
147 page->apply();
148 }
149 }
150
151 KPageDialog::accept();
152}
153
158
160{
161 KisDocument* doc = dynamic_cast< KisDocument* >(d->info->parent());
162
163 if (doc) {
164 d->aboutUi->filePathLabel->setText(doc->localFilePath());
165 }
166
167 d->aboutUi->leTitle->setText(d->info->aboutInfo("title"));
168 d->aboutUi->leSubject->setText(d->info->aboutInfo("subject"));
169
170 d->aboutUi->leKeywords->setToolTip(i18n("Use ';' (Example: Office;KDE;Calligra)"));
171 if (!d->info->aboutInfo("keyword").isEmpty())
172 d->aboutUi->leKeywords->setText(d->info->aboutInfo("keyword"));
173
174 if (!d->info->aboutInfo("license").isEmpty()) {
175 d->aboutUi->leLicense->setText(d->info->aboutInfo("license"));
176 }
177 d->aboutUi->meDescription->setPlainText(d->info->aboutInfo("abstract"));
178 if (doc && !doc->mimeType().isEmpty()) {
179 d->aboutUi->lblType->setText(KisMimeDatabase::descriptionForMimeType(doc->mimeType()));
180 }
181 if (!d->info->aboutInfo("creation-date").isEmpty()) {
182 QDateTime t = QDateTime::fromString(d->info->aboutInfo("creation-date"),
183 Qt::ISODate);
184 QString s = QLocale().toString(t);
185 d->aboutUi->lblCreated->setText(s + ", " +
186 d->info->aboutInfo("initial-creator"));
187 }
188
189 if (!d->info->aboutInfo("date").isEmpty()) {
190 QDateTime t = QDateTime::fromString(d->info->aboutInfo("date"), Qt::ISODate);
191 QString s = QLocale().toString(t);
192 d->aboutUi->lblModified->setText(s + ", " + d->info->authorInfo("creator"));
193 }
194
195 d->aboutUi->lblRevision->setText(d->info->aboutInfo("editing-cycles"));
196
198
199 connect(d->aboutUi->pbReset, SIGNAL(clicked()),
200 this, SLOT(slotResetMetaData()));
201}
202
204{
205 d->authorUi->nickName->setText(d->info->authorInfo("creator"));
206 d->authorUi->firstName->setText(d->info->authorInfo("creator-first-name"));
207 d->authorUi->lastName->setText(d->info->authorInfo("creator-last-name"));
208 d->authorUi->initials->setText(d->info->authorInfo("initial"));
209 d->authorUi->title->setText(d->info->authorInfo("author-title"));
210 d->authorUi->company->setText(d->info->authorInfo("company"));
211 d->authorUi->position->setText(d->info->authorInfo("position"));
212 QListWidget *contact = d->authorUi->leContact;
213 Q_FOREACH(QString contactMode, d->info->authorContactInfo()) {
214 if (!contactMode.isEmpty()) {
215 contact->addItem(contactMode);
216 }
217 }
218}
219
221{
222 d->info->setAboutInfo("keyword", d->aboutUi->leKeywords->text());
223 d->info->setAboutInfo("title", d->aboutUi->leTitle->text());
224 d->info->setAboutInfo("subject", d->aboutUi->leSubject->text());
225 d->info->setAboutInfo("abstract", d->aboutUi->meDescription->toPlainText());
226 d->info->setAboutInfo("license", d->aboutUi->leLicense->text());
227}
228
229void KoDocumentInfoDlg::hideEvent( QHideEvent *event )
230{
231 Q_UNUSED(event);
232}
233
235{
236 d->info->resetMetaData();
237
238 if (!d->info->aboutInfo("creation-date").isEmpty()) {
239 QDateTime t = QDateTime::fromString(d->info->aboutInfo("creation-date"),
240 Qt::ISODate);
241 QString s = QLocale().toString(t);
242 d->aboutUi->lblCreated->setText(s + ", " +
243 d->info->aboutInfo("initial-creator"));
244 }
245
246 if (!d->info->aboutInfo("date").isEmpty()) {
247 QDateTime t = QDateTime::fromString(d->info->aboutInfo("date"), Qt::ISODate);
248 QString s = QLocale().toString(t);
249 d->aboutUi->lblModified->setText(s + ", " + d->info->authorInfo("creator"));
250 }
251
252 d->aboutUi->lblRevision->setText(d->info->aboutInfo("editing-cycles"));
253}
254
259
261{
262 d->aboutUi->meDescription->setReadOnly(ro);
263
264 Q_FOREACH(KPageWidgetItem* page, d->pages) {
265 Q_FOREACH(QLineEdit* le, page->widget()->findChildren<QLineEdit *>()) {
266 le->setReadOnly(ro);
267 }
268 Q_FOREACH(QPushButton* le, page->widget()->findChildren<QPushButton *>()) {
269 le->setDisabled(ro);
270 }
271 }
272}
273
275{
276 KPageWidgetItem * page = new KoPageWidgetItemAdapter(item);
277
278 addPage(page);
279 d->pages.append(page);
280}
281
283{
284 const int timeElapsed = d->info->aboutInfo("editing-time").toInt();
285
286 const int secondsElapsed = timeElapsed % 60;
287 const int minutesElapsed = (timeElapsed / 60) % 60;
288 const int hoursElapsed = (timeElapsed / 3600) % 24;
289 const int daysElapsed = (timeElapsed / 86400) % 7;
290 const int weeksElapsed = timeElapsed / 604800;
291
292 QString majorTimeUnit;
293 QString minorTimeUnit;
294
295 if (weeksElapsed > 0) {
296 majorTimeUnit = i18np("%1 week", "%1 weeks", weeksElapsed);
297 minorTimeUnit = i18np("%1 day", "%1 days", daysElapsed);
298 } else if (daysElapsed > 0) {
299 majorTimeUnit = i18np("%1 day", "%1 days", daysElapsed);
300 minorTimeUnit = i18np("%1 hour", "%1 hours", hoursElapsed);
301 } else if (hoursElapsed > 0) {
302 majorTimeUnit = i18np("%1 hour", "%1 hours", hoursElapsed);
303 minorTimeUnit = i18np("%1 minute", "%1 minutes", minutesElapsed);
304 } else if (minutesElapsed > 0) {
305 majorTimeUnit = i18np("%1 minute", "%1 minutes", minutesElapsed);
306 minorTimeUnit = i18np("%1 second", "%1 seconds", secondsElapsed);
307 } else {
308 d->aboutUi->lblEditing->setText(i18np("%1 second", "%1 seconds", secondsElapsed));
309 return;
310 }
311
312 d->aboutUi->lblEditing->setText(i18nc(
313 "major time unit and minor time unit",
314 "%1 and %2",
315 majorTimeUnit,
316 minorTimeUnit
317 ));
318}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QString localFilePath() const
QByteArray mimeType
static QString iconNameForMimeType(const QString &mimeType)
The default icon name for the given mimetype.
static QString descriptionForMimeType(const QString &mimeType)
Find the user-readable description for the given mimetype.
Ui::KoDocumentInfoAuthorWidget * authorUi
void addPageItem(KoPageWidgetItem *item)
KoDocumentInfoDlg(QWidget *parent, KoDocumentInfo *docInfo)
void hideEvent(QHideEvent *event) override
KoDocumentInfoDlgPrivate *const d
QList< KPageWidgetItem * > pages() const
The class containing all meta information about a document.
void setAboutInfo(const QString &info, const QString &data)
QStringList authorContactInfo() const
authorContactInfo
QString authorInfo(const QString &info) const
QString aboutInfo(const QString &info) const
KoPageWidgetItem *const m_item
KoPageWidgetItemAdapter(KoPageWidgetItem *item)
virtual QString iconName() const =0
virtual void apply()=0
virtual QString name() const =0
virtual bool shouldDialogCloseBeVetoed()=0
#define koIcon(name)
Use these macros for icons without any issues.
Definition kis_icon.h:25
QString button(const QWheelEvent &ev)
QIcon loadIcon(const QString &name)