1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the tools applications of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include "qtgradientview.h"
41 #include "qtgradientmanager.h"
42 #include "qtgradientdialog.h"
43 #include "qtgradientutils.h"
44 #include <QtGui/QClipboard>
45 #include <QtGui/QPainter>
46 #include <QtWidgets/QAction>
47 #include <QtWidgets/QMessageBox>
48
49 QT_BEGIN_NAMESPACE
50
slotGradientAdded(const QString & id,const QGradient & gradient)51 void QtGradientView::slotGradientAdded(const QString &id, const QGradient &gradient)
52 {
53 QListWidgetItem *item = new QListWidgetItem(QtGradientUtils::gradientPixmap(gradient), id, m_ui.listWidget);
54 item->setToolTip(id);
55 item->setSizeHint(QSize(72, 84));
56 item->setFlags(item->flags() | Qt::ItemIsEditable);
57
58 m_idToItem[id] = item;
59 m_itemToId[item] = id;
60 }
61
slotGradientRenamed(const QString & id,const QString & newId)62 void QtGradientView::slotGradientRenamed(const QString &id, const QString &newId)
63 {
64 if (!m_idToItem.contains(id))
65 return;
66
67 QListWidgetItem *item = m_idToItem.value(id);
68 item->setText(newId);
69 item->setToolTip(newId);
70 m_itemToId[item] = newId;
71 m_idToItem.remove(id);
72 m_idToItem[newId] = item;
73 }
74
slotGradientChanged(const QString & id,const QGradient & newGradient)75 void QtGradientView::slotGradientChanged(const QString &id, const QGradient &newGradient)
76 {
77 if (!m_idToItem.contains(id))
78 return;
79
80 QListWidgetItem *item = m_idToItem.value(id);
81 item->setIcon(QtGradientUtils::gradientPixmap(newGradient));
82 }
83
slotGradientRemoved(const QString & id)84 void QtGradientView::slotGradientRemoved(const QString &id)
85 {
86 if (!m_idToItem.contains(id))
87 return;
88
89 QListWidgetItem *item = m_idToItem.value(id);
90 delete item;
91 m_itemToId.remove(item);
92 m_idToItem.remove(id);
93 }
94
slotNewGradient()95 void QtGradientView::slotNewGradient()
96 {
97 bool ok;
98 QListWidgetItem *item = m_ui.listWidget->currentItem();
99 QGradient grad = QLinearGradient();
100 if (item)
101 grad = m_manager->gradients().value(m_itemToId.value(item));
102 QGradient gradient = QtGradientDialog::getGradient(&ok, grad, this);
103 if (!ok)
104 return;
105
106 QString id = m_manager->addGradient(tr("Grad"), gradient);
107 m_ui.listWidget->setCurrentItem(m_idToItem.value(id));
108 }
109
slotEditGradient()110 void QtGradientView::slotEditGradient()
111 {
112 bool ok;
113 QListWidgetItem *item = m_ui.listWidget->currentItem();
114 if (!item)
115 return;
116
117 const QString id = m_itemToId.value(item);
118 QGradient grad = m_manager->gradients().value(id);
119 QGradient gradient = QtGradientDialog::getGradient(&ok, grad, this);
120 if (!ok)
121 return;
122
123 m_manager->changeGradient(id, gradient);
124 }
125
slotRemoveGradient()126 void QtGradientView::slotRemoveGradient()
127 {
128 QListWidgetItem *item = m_ui.listWidget->currentItem();
129 if (!item)
130 return;
131
132 if (QMessageBox::question(this, tr("Remove Gradient"),
133 tr("Are you sure you want to remove the selected gradient?"),
134 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel) != QMessageBox::Yes)
135 return;
136
137 const QString id = m_itemToId.value(item);
138 m_manager->removeGradient(id);
139 }
140
slotRenameGradient()141 void QtGradientView::slotRenameGradient()
142 {
143 QListWidgetItem *item = m_ui.listWidget->currentItem();
144 if (!item)
145 return;
146
147 m_ui.listWidget->editItem(item);
148 }
149
slotRenameGradient(QListWidgetItem * item)150 void QtGradientView::slotRenameGradient(QListWidgetItem *item)
151 {
152 if (!item)
153 return;
154
155 const QString id = m_itemToId.value(item);
156 m_manager->renameGradient(id, item->text());
157 }
158
slotCurrentItemChanged(QListWidgetItem * item)159 void QtGradientView::slotCurrentItemChanged(QListWidgetItem *item)
160 {
161 m_editAction->setEnabled(item);
162 m_renameAction->setEnabled(item);
163 m_removeAction->setEnabled(item);
164 emit currentGradientChanged(m_itemToId.value(item));
165 }
166
slotGradientActivated(QListWidgetItem * item)167 void QtGradientView::slotGradientActivated(QListWidgetItem *item)
168 {
169 const QString id = m_itemToId.value(item);
170 if (!id.isEmpty())
171 emit gradientActivated(id);
172 }
173
QtGradientView(QWidget * parent)174 QtGradientView::QtGradientView(QWidget *parent)
175 : QWidget(parent)
176 {
177 m_manager = 0;
178
179 m_ui.setupUi(this);
180
181 m_ui.listWidget->setViewMode(QListView::IconMode);
182 m_ui.listWidget->setMovement(QListView::Static);
183 m_ui.listWidget->setTextElideMode(Qt::ElideRight);
184 m_ui.listWidget->setResizeMode(QListWidget::Adjust);
185 m_ui.listWidget->setIconSize(QSize(64, 64));
186 m_ui.listWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
187
188 QPalette pal = m_ui.listWidget->viewport()->palette();
189 int pixSize = 18;
190 QPixmap pm(2 * pixSize, 2 * pixSize);
191
192 QColor c1 = palette().color(QPalette::Midlight);
193 QColor c2 = palette().color(QPalette::Dark);
194 QPainter pmp(&pm);
195 pmp.fillRect(0, 0, pixSize, pixSize, c1);
196 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, c1);
197 pmp.fillRect(0, pixSize, pixSize, pixSize, c2);
198 pmp.fillRect(pixSize, 0, pixSize, pixSize, c2);
199
200 pal.setBrush(QPalette::Base, QBrush(pm));
201 m_ui.listWidget->viewport()->setPalette(pal);
202
203 connect(m_ui.listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotGradientActivated(QListWidgetItem*)));
204 connect(m_ui.listWidget, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotRenameGradient(QListWidgetItem*)));
205 connect(m_ui.listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(slotCurrentItemChanged(QListWidgetItem*)));
206
207 m_newAction = new QAction(QIcon(QLatin1String(":/qt-project.org/qtgradienteditor/images/plus.png")), tr("New..."), this);
208 m_editAction = new QAction(QIcon(QLatin1String(":/qt-project.org/qtgradienteditor/images/edit.png")), tr("Edit..."), this);
209 m_renameAction = new QAction(tr("Rename"), this);
210 m_removeAction = new QAction(QIcon(QLatin1String(":/qt-project.org/qtgradienteditor/images/minus.png")), tr("Remove"), this);
211
212 connect(m_newAction, SIGNAL(triggered()), this, SLOT(slotNewGradient()));
213 connect(m_editAction, SIGNAL(triggered()), this, SLOT(slotEditGradient()));
214 connect(m_removeAction, SIGNAL(triggered()), this, SLOT(slotRemoveGradient()));
215 connect(m_renameAction, SIGNAL(triggered()), this, SLOT(slotRenameGradient()));
216
217 m_ui.listWidget->addAction(m_newAction);
218 m_ui.listWidget->addAction(m_editAction);
219 m_ui.listWidget->addAction(m_renameAction);
220 m_ui.listWidget->addAction(m_removeAction);
221
222 m_ui.newButton->setDefaultAction(m_newAction);
223 m_ui.editButton->setDefaultAction(m_editAction);
224 m_ui.renameButton->setDefaultAction(m_renameAction);
225 m_ui.removeButton->setDefaultAction(m_removeAction);
226
227 m_ui.listWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
228 }
229
setGradientManager(QtGradientManager * manager)230 void QtGradientView::setGradientManager(QtGradientManager *manager)
231 {
232 if (m_manager == manager)
233 return;
234
235 if (m_manager) {
236 disconnect(m_manager, SIGNAL(gradientAdded(QString,QGradient)),
237 this, SLOT(slotGradientAdded(QString,QGradient)));
238 disconnect(m_manager, SIGNAL(gradientRenamed(QString,QString)),
239 this, SLOT(slotGradientRenamed(QString,QString)));
240 disconnect(m_manager, SIGNAL(gradientChanged(QString,QGradient)),
241 this, SLOT(slotGradientChanged(QString,QGradient)));
242 disconnect(m_manager, SIGNAL(gradientRemoved(QString)),
243 this, SLOT(slotGradientRemoved(QString)));
244
245 m_ui.listWidget->clear();
246 m_idToItem.clear();
247 m_itemToId.clear();
248 }
249
250 m_manager = manager;
251
252 if (!m_manager)
253 return;
254
255 QMap<QString, QGradient> gradients = m_manager->gradients();
256 for (auto itGrad = gradients.cbegin(), end = gradients.cend(); itGrad != end; ++itGrad)
257 slotGradientAdded(itGrad.key(), itGrad.value());
258
259 connect(m_manager, SIGNAL(gradientAdded(QString,QGradient)),
260 this, SLOT(slotGradientAdded(QString,QGradient)));
261 connect(m_manager, SIGNAL(gradientRenamed(QString,QString)),
262 this, SLOT(slotGradientRenamed(QString,QString)));
263 connect(m_manager, SIGNAL(gradientChanged(QString,QGradient)),
264 this, SLOT(slotGradientChanged(QString,QGradient)));
265 connect(m_manager, SIGNAL(gradientRemoved(QString)),
266 this, SLOT(slotGradientRemoved(QString)));
267 }
268
gradientManager() const269 QtGradientManager *QtGradientView::gradientManager() const
270 {
271 return m_manager;
272 }
273
setCurrentGradient(const QString & id)274 void QtGradientView::setCurrentGradient(const QString &id)
275 {
276 QListWidgetItem *item = m_idToItem.value(id);
277 if (!item)
278 return;
279
280 m_ui.listWidget->setCurrentItem(item);
281 }
282
currentGradient() const283 QString QtGradientView::currentGradient() const
284 {
285 return m_itemToId.value(m_ui.listWidget->currentItem());
286 }
287
288 QT_END_NAMESPACE
289