Krita Source Code Documentation
Loading...
Searching...
No Matches
SvgSymbolCollectionDocker.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2008 Peter Simonsson <peter.simonsson@gmail.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
8
9#include <klocalizedstring.h>
10
11#include <QDebug>
12#include <QAbstractListModel>
13#include <QMimeData>
14#include <QDomDocument>
15#include <QDomElement>
16#include <KisSqueezedComboBox.h>
17#include <QWidgetAction>
18#include <QMenu>
19
21#include <KoResourceServer.h>
22#include <KoShapeFactoryBase.h>
23#include <KoProperties.h>
24#include <KoDrag.h>
25
26#include "kis_icon_utils.h"
27#include <kconfiggroup.h>
28#include <ksharedconfig.h>
29
30#include "ui_WdgSvgCollection.h"
31
33
34//
35// SvgCollectionModel
36//
38 : QAbstractListModel(parent)
39{
40}
41
42QVariant SvgCollectionModel::data(const QModelIndex &index, int role) const
43{
44 if (!index.isValid() || index.row() > m_symbolCollection->symbols().count()) {
45 return QVariant();
46 }
47
48 switch (role) {
49 case Qt::ToolTipRole:
50 return m_symbolCollection->symbols()[index.row()]->title;
51
52 case Qt::DecorationRole:
53 {
54 QPixmap px = QPixmap::fromImage(m_symbolCollection->symbols()[index.row()]->icon(m_iconSize));
55 QIcon icon(px);
56 return icon;
57 }
58 case Qt::UserRole:
59 return m_symbolCollection->symbols()[index.row()]->id;
60
61 case Qt::DisplayRole:
62 {
64 return m_symbolCollection->symbols()[index.row()]->title;
65 } else {
66 return QVariant();
67 }
68 }
69 default:
70 return QVariant();
71 }
72
73 return QVariant();
74}
75
76int SvgCollectionModel::rowCount(const QModelIndex &parent) const
77{
78 Q_UNUSED(parent);
79 return m_symbolCollection->symbols().count();
80}
81
82QMimeData *SvgCollectionModel::mimeData(const QModelIndexList &indexes) const
83{
84 if (indexes.isEmpty()) {
85 return 0;
86 }
87
88 QModelIndex index = indexes.first();
89
90 if (!index.isValid()) {
91 return 0;
92 }
93
94 if (m_symbolCollection->symbols().isEmpty()) {
95 return 0;
96 }
97
98 QList<KoShape*> shapes;
99 shapes.append(m_symbolCollection->symbols()[index.row()]->shape);
100 KoDrag drag;
101 drag.setSvg(shapes);
102 QMimeData *mimeData = drag.mimeData();
103
104 return mimeData;
105}
106
108{
109 return QStringList() << SHAPETEMPLATE_MIMETYPE << "image/svg+xml";
110}
111
112Qt::ItemFlags SvgCollectionModel::flags(const QModelIndex &index) const
113{
114 if (index.isValid()) {
115 return QAbstractListModel::flags(index) | Qt::ItemIsDragEnabled;
116 }
117 return QAbstractListModel::flags(index);
118}
119
121{
122 return Qt::CopyAction;
123}
124
126{
127 m_iconSize = size;
128}
129
131{
132 m_showDescription = showDescription;
133}
134
139
140
141
142//
143// SvgSymbolCollectionDockerFactory
144//
145
150
152{
153 return QString("SvgSymbolCollectionDocker");
154}
155
157{
159
160 return docker;
161}
162
163//
164// SvgSymbolCollectionDocker
165//
166
168 : QDockWidget(parent)
169 , m_wdgSvgCollection(new Ui_WdgSvgCollection())
170{
171 setWindowTitle(i18n("Symbol Libraries"));
172 QWidget* mainWidget = new QWidget(this);
173 setWidget(mainWidget);
174 m_wdgSvgCollection->setupUi(mainWidget);
175
176 connect(m_wdgSvgCollection->cmbCollections, SIGNAL(activated(int)), SLOT(collectionActivated(int)));
177
179
180 m_wdgSvgCollection->cmbCollections->setModel(m_resourceModel);
181 m_wdgSvgCollection->cmbCollections->setModelColumn(KisAbstractResourceModel::Name);
182
183 m_wdgSvgCollection->listCollection->setDragEnabled(true);
184 m_wdgSvgCollection->listCollection->setDragDropMode(QAbstractItemView::DragOnly);
185 m_wdgSvgCollection->listCollection->setSelectionMode(QListView::SingleSelection);
186
187 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(m_wdgSvgCollection->listCollection);
188 if (scroller) {
189 connect(scroller, SIGNAL(stateChanged(QScroller::State)),
190 this, SLOT(slotScrollerStateChanged(QScroller::State)));
191 }
192
193 // thumbnail icon changer
194 QMenu* configureMenu = new QMenu(this);
195 configureMenu->setStyleSheet("margin: 6px");
196 m_wdgSvgCollection->vectorPresetsConfigureButton->setIcon(KisIconUtils::loadIcon("view-choose"));
197 m_wdgSvgCollection->vectorPresetsConfigureButton->setPopupMode(QToolButton::InstantPopup);
198 m_wdgSvgCollection->vectorPresetsConfigureButton->setAutoRaise(true);
199
200
201 m_configGroup = KSharedConfig::openConfig()->group("SvgSymbolCollection");
202
203 // add horizontal slider for changing the icon size
204 m_iconSizeSlider = new QSlider(this);
205 m_iconSizeSlider->setOrientation(Qt::Horizontal);
206 m_iconSizeSlider->setRange(20, 80);
207 m_iconSizeSlider->setValue(m_configGroup.readEntry<int>("iconSize", 20)); // defaults to small icon size
208 m_iconSizeSlider->setMinimumHeight(20);
209 m_iconSizeSlider->setMinimumWidth(40);
210 m_iconSizeSlider->setTickInterval(10);
211
212
213 QWidgetAction *sliderAction= new QWidgetAction(this);
214 sliderAction->setDefaultWidget(m_iconSizeSlider);
215
216 m_thumbnailsRadioButton = new QRadioButton("Thumbnails", this);
217 m_detailsRadioButton = new QRadioButton("Details", this);
218
219
220 QWidgetAction *thumbnailsAction = new QWidgetAction(this);
221 thumbnailsAction->setDefaultWidget(m_thumbnailsRadioButton);
222
223 QWidgetAction *detailsAction = new QWidgetAction(this);
224 detailsAction->setDefaultWidget(m_detailsRadioButton);
225
226 bool displayThumbnails = m_configGroup.readEntry<bool>("displayThumbnails", false);
227 if (displayThumbnails) {
228 m_thumbnailsRadioButton->setChecked(true);
229 } else {
230 m_detailsRadioButton->setChecked(true);
231 }
232
233
234 configureMenu->addSection(i18n("Display"));
235 configureMenu->addAction(detailsAction);
236 configureMenu->addAction(thumbnailsAction);
237
238 configureMenu->addSection(i18n("Icon Size"));
239 configureMenu->addAction(sliderAction);
240
241 m_wdgSvgCollection->vectorPresetsConfigureButton->setMenu(configureMenu);
242 connect(m_iconSizeSlider, SIGNAL(sliderReleased()), this, SLOT(slotSetIconSize())); // resizing while sliding is too heavy of an operation
243 connect(m_thumbnailsRadioButton, SIGNAL(toggled(bool)), this, SLOT(slotChangeDisplay()));
244 connect(m_detailsRadioButton, SIGNAL(toggled(bool)), this, SLOT(slotChangeDisplay()));
245
246 int i = m_configGroup.readEntry("currentCollection", 0);
247 if (i > m_wdgSvgCollection->cmbCollections->count()) {
248 i = 0;
249 }
250 m_wdgSvgCollection->cmbCollections->setCurrentIndex(i);
252
253 connect(m_resourceModel, SIGNAL(modelAboutToBeReset()), this, SLOT(slotResourceModelAboutToBeReset()));
254 connect(m_resourceModel, SIGNAL(modelReset()), this, SLOT(slotResourceModelReset()));
255
256 m_wdgSvgCollection->listCollection->setResizeMode(QListView::Adjust);
257
258
259
262
263}
264
269
271{
272 int size = m_iconSizeSlider->value();
273 m_configGroup.writeEntry("iconSize", size);
274 m_wdgSvgCollection->listCollection->setIconSize(QSize(size, size));
275 QAbstractItemModel* model = m_wdgSvgCollection->listCollection->model();
276 if (model) {
277 SvgCollectionModel* svgModel = dynamic_cast<SvgCollectionModel*>(model);
278 svgModel->setIconSize(size*devicePixelRatioF());
279 }
280}
281
283{
284 QAbstractItemModel* model = m_wdgSvgCollection->listCollection->model();
285 SvgCollectionModel* svgModel = 0;
286 if (model) {
287 svgModel = dynamic_cast<SvgCollectionModel*>(model);
288 }
289
290 if (m_thumbnailsRadioButton->isChecked()) {
291 m_wdgSvgCollection->listCollection->setViewMode(QListView::IconMode);
292 if (svgModel) {
293 svgModel->setShowDescription(false);
294 }
295 m_configGroup.writeEntry<bool>("displayThumbnails", true);
296 } else {
297 m_wdgSvgCollection->listCollection->setViewMode(QListView::ListMode);
298 if (svgModel) {
299 svgModel->setShowDescription(true);
300 }
301 m_configGroup.writeEntry<bool>("displayThumbnails", false);
302 }
303}
304
306{
307 int index = m_wdgSvgCollection->cmbCollections->currentIndex();
308 QModelIndex idx = m_resourceModel->index(index, 0);
309 int id = m_resourceModel->data(idx, Qt::UserRole + KisAbstractResourceModel::Id).toInt();
311}
312
314{
315 int indexToSet = 0;
317 indexToSet = 0;
318 } else {
319 for (int i = 0; i < m_resourceModel->rowCount(); i++) {
320 QModelIndex idx = m_resourceModel->index(i, 0);
321 int id = m_resourceModel->data(idx, Qt::UserRole + KisAbstractResourceModel::Id).toInt();
322 if (id == m_rememberedSvgCollectionId) {
323 indexToSet = i;
324 break;
325 }
326 }
327 }
328 // remove the current model from the view
329 m_wdgSvgCollection->listCollection->setModel(0);
330 // delete all models
331 clearModels();
332 // setting current index will create and set the model
333 m_wdgSvgCollection->cmbCollections->setCurrentIndex(indexToSet);
334 collectionActivated(indexToSet);
336}
337
339{
340 setEnabled(canvas != 0);
341}
342
344{
345 setEnabled(false);
346}
347
349{
350 if (index < m_resourceModel->rowCount()) {
351 SvgCollectionModel *model;
352 if (m_collectionsModelsCache.contains(index)) {
353 model = m_collectionsModelsCache.value(index);
354 } else {
355 QModelIndex idx = m_resourceModel->index(index, 0);
357 model = new SvgCollectionModel();
358 model->setSvgSymbolCollectionResource(r);
359 m_collectionsModelsCache.insert(index, model);
360 }
361
362
363 m_configGroup.writeEntry("currentCollection", index);
364
365 m_wdgSvgCollection->listCollection->setModel(model);
366
367 }
368 slotChangeDisplay(); // to ensure the ShowDescription is set to the model
369 slotSetIconSize(); // to ensure the icon size is correct and they are not scaled up or down by the listview
370
371}
372
374{
375 Q_FOREACH(int key, m_collectionsModelsCache.keys()) {
376 delete m_collectionsModelsCache.value(key);
377 }
379}
QList< QString > QStringList
#define SHAPETEMPLATE_MIMETYPE
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
KoResourceSP resourceForIndex(QModelIndex index=QModelIndex()) const override
resourceForIndex returns a properly versioned and id'ed resource object
bool setSvg(const QList< KoShape * > shapes)
Definition KoDrag.cpp:47
QMimeData * mimeData()
Definition KoDrag.cpp:94
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QStringList mimeTypes() const override
Qt::ItemFlags flags(const QModelIndex &index) const override
SvgCollectionModel(QObject *parent=0)
QMimeData * mimeData(const QModelIndexList &indexes) const override
QSharedPointer< KoSvgSymbolCollectionResource > m_symbolCollection
Qt::DropActions supportedDragActions() const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
void setShowDescription(bool showDescription)
void setSvgSymbolCollectionResource(QSharedPointer< KoSvgSymbolCollectionResource > resource)
QScopedPointer< Ui_WdgSvgCollection > m_wdgSvgCollection
void setCanvas(KoCanvasBase *canvas) override
reimplemented
QMap< int, SvgCollectionModel * > m_collectionsModelsCache
void slotScrollerStateChanged(QScroller::State state)
QIcon loadIcon(const QString &name)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)
const QString Symbols