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