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