1 /* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2013-09-16
7 * Description : Dialog to prompt users about versioning
8 *
9 * Copyright (C) 2010-2012 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * Copyright (C) 2013-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 *
12 * This program is free software; you can redistribute it
13 * and/or modify it under the terms of the GNU General
14 * Public License as published by the Free Software Foundation;
15 * either version 2, or (at your option)
16 * any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * ============================================================ */
24
25 #include "versioningpromptusersavedlg.h"
26
27 // Qt includes
28
29 #include <QToolButton>
30 #include <QGridLayout>
31 #include <QVBoxLayout>
32 #include <QLabel>
33 #include <QIcon>
34 #include <QPushButton>
35 #include <QDialogButtonBox>
36 #include <QStyle>
37 #include <QApplication>
38
39 // KDE includes
40
41 #include <klocalizedstring.h>
42
43 namespace Digikam
44 {
45
46 class Q_DECL_HIDDEN VersioningPromptUserSaveDialog::Private
47 {
48 public:
49
Private()50 explicit Private()
51 : clicked(QDialogButtonBox::NoButton),
52 buttons(nullptr)
53 {
54 }
55
56 public:
57
58 QDialogButtonBox::StandardButton clicked;
59 QDialogButtonBox* buttons;
60 };
61
VersioningPromptUserSaveDialog(QWidget * const parent)62 VersioningPromptUserSaveDialog::VersioningPromptUserSaveDialog(QWidget* const parent)
63 : QDialog(parent),
64 d (new Private)
65 {
66 setWindowTitle(i18nc("@title:window", "Save?"));
67
68 d->buttons = new QDialogButtonBox(QDialogButtonBox::Ok | // Save Changes
69 QDialogButtonBox::Apply | // Save Changes as a New Version
70 QDialogButtonBox::Discard | // Discard Changes
71 QDialogButtonBox::Cancel,
72 this);
73
74 d->buttons->button(QDialogButtonBox::Cancel)->setDefault(true);
75
76 d->buttons->button(QDialogButtonBox::Ok)->setText(i18nc("@action:button", "Save Changes"));
77 d->buttons->button(QDialogButtonBox::Ok)->setIcon(QIcon::fromTheme(QLatin1String("dialog-ok-apply")));
78 d->buttons->button(QDialogButtonBox::Ok)->setToolTip(i18nc("@info:tooltip",
79 "Save the current changes. Note: The original image will never be overwritten."));
80
81 d->buttons->button(QDialogButtonBox::Apply)->setText(i18nc("@action:button", "Save Changes as a New Version"));
82 d->buttons->button(QDialogButtonBox::Apply)->setIcon(QIcon::fromTheme(QLatin1String("list-add")));
83 d->buttons->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip",
84 "Save the current changes as a new version. "
85 "The loaded file will remain unchanged, a new file will be created."));
86
87 d->buttons->button(QDialogButtonBox::Discard)->setText(i18nc("@action:button", "Discard Changes"));
88 d->buttons->button(QDialogButtonBox::Discard)->setIcon(QIcon::fromTheme(QLatin1String("task-reject")));
89 d->buttons->button(QDialogButtonBox::Discard)->setToolTip(i18nc("@info:tooltip",
90 "Discard the changes applied to the image during this editing session."));
91
92 connect(d->buttons, SIGNAL(clicked(QAbstractButton*)),
93 this, SLOT(slotButtonClicked(QAbstractButton*)));
94
95 QWidget* const mainWidget = new QWidget;
96
97 // -- Icon and Header --
98
99 QLabel* const warningIcon = new QLabel;
100 warningIcon->setPixmap(QIcon::fromTheme(QLatin1String("dialog-warning")).pixmap(style()->pixelMetric(QStyle::PM_MessageBoxIconSize, nullptr, this)));
101 QLabel* const question = new QLabel;
102 question->setTextFormat(Qt::RichText);
103 question->setText(i18nc("@label",
104 "The current image has been changed.\n"
105 "Do you wish to save your changes?"));
106 QLabel* const editIcon = new QLabel;
107 editIcon->setPixmap(QIcon::fromTheme(QLatin1String("document-edit")).pixmap(style()->pixelMetric(QStyle::PM_MessageBoxIconSize, nullptr, this)));
108
109 QHBoxLayout* const headerLayout = new QHBoxLayout;
110 headerLayout->addWidget(warningIcon);
111 headerLayout->addWidget(question, 10, Qt::AlignCenter);
112 headerLayout->addWidget(editIcon);
113 mainWidget->setLayout(headerLayout);
114
115 // -- Layouts --
116
117 QVBoxLayout* const vbx = new QVBoxLayout(this);
118 vbx->addWidget(mainWidget);
119 vbx->addWidget(d->buttons);
120 setLayout(vbx);
121 }
122
~VersioningPromptUserSaveDialog()123 VersioningPromptUserSaveDialog::~VersioningPromptUserSaveDialog()
124 {
125 delete d;
126 }
127
slotButtonClicked(QAbstractButton * button)128 void VersioningPromptUserSaveDialog::slotButtonClicked(QAbstractButton* button)
129 {
130 d->clicked = d->buttons->standardButton(button);
131
132 if (d->clicked == QDialogButtonBox::Cancel)
133 {
134 reject();
135
136 return;
137 }
138
139 accept();
140 }
141
shallSave() const142 bool VersioningPromptUserSaveDialog::shallSave() const
143 {
144 return (d->clicked == QDialogButtonBox::Ok);
145 }
146
newVersion() const147 bool VersioningPromptUserSaveDialog::newVersion() const
148 {
149 return (d->clicked == QDialogButtonBox::Apply);
150 }
151
shallDiscard() const152 bool VersioningPromptUserSaveDialog::shallDiscard() const
153 {
154 return (d->clicked == QDialogButtonBox::Discard);
155 }
156
157 } // namespace Digikam
158